Ansible,迭代多个寄存器并扩展使用build in方法

时间:2017-08-08 11:53:21

标签: ansible

首先,我在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_statusapp_sub_dir_status中的NonNull来控制我的任务?

1 个答案:

答案 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 }},因为第一个itemitem的元素1}}包含另一个stat_res.results作为stat任务原始循环的元素。

P.S。此外,我认为没有理由进行第一项任务,因为subdir任务可以检测所有丢失的目录。