Ansible 访问结果列表中的变量

Ansible 访问结果列表中的变量,ansible,Ansible,我希望在现有playbook中添加一个步骤,当它找到var_file.yml中指定的特定目录时,该步骤将停止/失败 --- - include_vars: file: var_file.yml - name: Check if instance has been Patched stat: path: '{{ item }}' register: patchDir loop: "{{ work_dir }}" - fail: msg="This system ha

我希望在现有playbook中添加一个步骤,当它找到var_file.yml中指定的特定目录时,该步骤将停止/失败

---
- include_vars:
    file: var_file.yml

- name: Check if instance has been Patched
  stat:
    path: '{{ item }}'
  register: patchDir
  loop: "{{ work_dir }}"

- fail: msg="This system has already been patched today!"
  loop: "{{ patchDir.results }}"
  when: (stat['exists'], true)
  loop_control:
    label: 'patchDir'
var_file.yml:

---
work_dir:
  - /var/tmp/patching_{{ansible_date_time.date}}
如果我以静态方式设置路径,而不是从var_file.yml读取路径,那么下面的代码可以完美地工作:

- name: Check if instance has been Patched
  stat:
    path: /var/tmp/patching_2020-06-10
  register: patchDir


- fail: msg="This system has already been patched today!"
  when: patchDir.stat.exists
是否有办法保留var_file.yml中定义的变量的使用,并使第一个代码示例工作


感谢

因此,本质上我试图编辑一个用于修补主机的现有剧本,并通过查找var_文件{{work_dir}}中定义的变量的存在性来检查主机当天是否已修补,如果确实存在,则跳过此主机上的修补

最后得出以下结论,这似乎是可行的:

---
- include_vars:
    file: var_file.yml

- name: Check if for existance of patch dir
  stat:
    path: '{{ item }}'
  register: patchDir
  with_items: "{{ work_dir }}"

- name: Skip host if it has already patched today
  include_tasks: patch.yml
  loop: "{{ patchDir.results }}"
  when: not patch.stat.exists
  loop_control:
    label: "patchDir"
    loop_var: patch
如果上面的任务发现了当天尚未修补的主机,则将调用task patch.yml对其进行修补,否则将跳过它


这可能不是最聪明的方法,但似乎有效:

不清楚什么不适合你。在包含的\u vars文件中使用var应该是可行的。你的when看起来很奇怪,我觉得应该是when:item.stats.exists你在这里的输入很有帮助-when:item.stats.exists是我想要的,尽管我没有很好地解释它!:非常感谢。