首页 > 解决方案 > 无法根据条件运行任务文件以避免ansible中的块循环

问题描述

任何提示为什么我不能绕过循环运行任务文件?扩展错误输出前后消息。希望能帮助到你

任务

---
- name: Check device existence on node
  shell: "lsblk -p -l | grep {{ item.0.device }}"
  loop:  "{{ local_volume_mount_disks|subelements('partitions') }}"
  register: device_exists
  tags: debug

- name: "Run Tasks from file on condition work around to BLOCKS"
  include_tasks: device_condition_satisfied.yml
  with_items: "{{ device_exists.results }}"
  when: "item.rc == 0"
  tags: debug

我的 include_tasks 文件 device_condition_satisfied.yml有以下代码任务

- name: apt-install parted
  apt:
    name: parted=3.2*
    update_cache: yes
  with_items: "{{device_exists.results}}"
  when: "{{ item.rc }} == 1"
  tags: debug

输出

ansible-playbook /ansible-managed/jenkins-slave/slave0/workspace/run_ansible_playbook@2/external_inventory-3854/playbooks/local-volume-mount.yml -i /ansible-managed/jenkins-slave/slave0/workspace/run_ansible_playbook@2/external_inventory-3854/inventory/cluster.com/hosts.ini -l node -t debug -b --become-user root --vault-password-file /ansible-managed/jenkins-slave/slave0/workspace/nvdc/run_ansible_playbook@2/-e DOCKERIO_T=****


ERROR! Syntax Error while loading YAML.
     expected <block end>, but found '?'
   
   The error appears to be in '/ansible-managed/jenkins-slave/slave0/workspace/nvdc/run_ansible_playbook@2/k8s/baremetal/roles/local_volume_mount/tasks/main.yml': line 9, column 1, but may, but may
   be elsewhere in the file depending on the exact syntax problem.
   
   The offending line appears to be:
   
   - name: "Run Tasks from file on condition work around to BLOCKS"
     include_tasks: device_condition_satisfied.yml
   ^ here
  

 FATAL: command execution failed
   hudson.AbortException: Ansible playbook execution failed
    at org.jenkinsci.plugins.ansible.AnsiblePlaybookBuilder.perform(AnsiblePlaybookBuilder.java:262)
    at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.run(AnsiblePlaybookStep.java:400)
    at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.run(AnsiblePlaybookStep.java:321)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
    at hudson.security.ACL.impersonate(ACL.java:290)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

ls任务/

device_condition_satisfied.yml  main.yml

我试过按照这个链接如何在块上循环

标签: ansibleansible-factsansible-template

解决方案


我在这里看到两个问题:

  • 你有一个报价问题。如果您在 YAML 值中使用任何引号,则需要引用整个字符串。由于您的 中有 a ',因此name:您需要编写:

    - name: "Run Tasks from file on condition work around to BLOCKS as we can't loop on them"
    
  • 您永远不会嵌套 Jinja 模板标记 ( {{...}}),并且 的值 when:已经在隐式 Jinja 上下文中,因此您可以编写:

    when: "item.rc == 0"
    

这可能不是全部问题,但请尝试修复这两个问题,如果您仍然看到失败,请更新您的问题以包含更多详细信息。


推荐阅读