首先,我在YAML中定义了所有变量
app_dir: "/mnt/{{ item.name }}"
app_dir_ext: "/mnt/{{ item.0.name }}"
workstreams:
- name: tigers
service_workstream: tigers-svc
app_sub_dir:
- inbound
- inbound/incoming
- inbound/error
- inbound/error/processed
- name: lions
service_workstream: lions-svc
app_sub_dir:
- inbound
- inbound/incoming
- inbound/error
- inbound/error/processed
您可能会注意到app_dir: "/mnt/{{ item.name }}"
和app_dir_ext: "/mnt/{{ item.0.name }}"
看起来很奇怪,所以我最初在YAML中将我的变量设置如下,但是我决定使用上述主要是因为当我有大量的YAML中的行数较少时工作流程。
workstreams:
- name: tigers
service_workstream: tigers-svc
app_dir: /mnt/tigers
...
然后我有Ansible代码来检查目录是否存在,如果没有创建它们并应用权限(!注意,由于操作时使用file:
模块上的- name: Check workstreams app_dir
stat:
path: "{{ app_dir }}"
register: app_dir_status
with_items:
- "{{ workstreams }}"
- name: Check workstreams app_sub_dir
stat:
path: "{{ app_dir_ext }}/{{ item.1 }}/"
register: app_sub_dir_status
with_subelements:
- "{{ workstreams }}"
- app_sub_dir
- name: create workstreams app_dir
file:
path: "/mnt/{{ item.0.name }}"
state: directory
owner: "ftp"
group: "ftp"
mode: '0770'
recurse: yes
with_nested:
- '{{ workstreams }}'
- app_dir_status.results
when:
- '{{ item.1.stat.exists }} == false'
模块时ssh超时采取了这种方法非常大的NFS挂载股票。)
<register_name>.stat.exists == false
这有点hacky但有效,但我有第2,第3,第4路检查..等等
我的问题是如何更新/重构上述代码以使用app_dir_status
和app_sub_dir_status
中的NonNull
来控制我的任务?
答案 0 :(得分:0)
您不需要进行嵌套循环! <{1}}中包含了所有必需的数据 - 只需删除不必要的项目。
以下是简化示例:
app_sub_dir_status
您也可以迭代---
- hosts: localhost
gather_facts: no
vars:
my_list:
- name: zzz1
sub:
- aaa
- ccc
- name: zzz2
sub:
- aaa
- bbb
tasks:
- stat:
path: /tmp/{{ item.0.name }}/{{ item.1 }}
register: stat_res
with_subelements:
- "{{ my_list }}"
- sub
- debug:
msg: "path to create '{{ item }}'"
with_items: "{{ stat_res.results | rejectattr('stat.exists') | map(attribute='invocation.module_args.path') | list }}"
,但必须再次构建路径为stat_res.results | rejectattr('stat.exists') | list
- 请注意加倍/tmp/{{ item.item.0.name }}/{{ item.item.1 }}
,因为第一个item
是item
的元素1}}包含另一个stat_res.results
作为stat任务原始循环的元素。
P.S。此外,我认为没有理由进行第一项任务,因为subdir任务可以检测所有丢失的目录。