ansible:如何迭代所有注册结果?

时间:2014-11-19 11:27:28

标签: loops ansible ansible-playbook

鉴于以下剧本:

---
- name: Check if log directory exists - Step 1
  stat: path="{{ wl_base }}/{{ item.0.name }}/{{ wl_dom }}/servers/{{ item.1 }}/logs" get_md5=no
  register: log_dir
  with_subelements:
    - wl_instances
    - servers

- name: Check if log directory exists - Step 2
  fail: msg="Log directory does not exists or it is not a symlink."
  failed_when: >
    log_dir.results[0].stat.islnk is not defined
    or log_dir.results[0].stat.islnk != true
    or log_dir.results[0].stat.lnk_source != "{{ wl_base }}/logs/{{ wl_dom }}/{{ item.1 }}"
  with_subelements:
    - wl_instances
    - servers

使用以下变量:

---
wl_instances:
  - name: aservers
    servers:
      - AdminServer
  - name: mservers
    servers:
       - "{{ ansible_hostname }}"

第二项任务目前仅使用两种可能结果中的一种(results[0])。

我的问题是:如何迭代log_dir.results中存储的所有可用商品?

示例输出debug:hostvars[inventory_hostname]如下:

    "log_dir": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                "changed": false,
                "invocation": {
                    "module_args": "path=\"/path/to/servers/aservers/domain/AdminServer/logs\" get_md5=no",
                    "module_name": "stat"
                },
                "item": [
                    {
                        "name": "aservers"
                    },
                    "AdminServer"
                ],
                "stat": {
                    ...
                    "lnk_source": "/path/to/logs/domain/AdminServer",
                    ...
                }
            },
            {
                "changed": false,
                "invocation": {
                    "module_args": "path=\"/path/to/servers/mservers/domain/servers/some_hostname/logs\" get_md5=no",
                    "module_name": "stat"
                },
                "item": [
                    {
                        "name": "mservers"
                    },
                    "some_hostname"
                ],
                "stat": {
                    ...
                    "lnk_source": "/path/to/logs/domain/some_hostname",
                    ...

2 个答案:

答案 0 :(得分:6)

循环数组中的结果(由[]表示),将作为

完成
with_items: somelist

或者它是否包含列表的dict,如本例所示

with_items: log_dir.results

请注意,这也可以写成

with_items: log_dir['results']

所以在你的任务中

- name: Check if log directory exists - Step 2
  fail: msg="Log directory does not exists or it is not a symlink."
  failed_when: >
    item.stat.islnk is not defined
    or item.stat.islnk != true
    or item..stat.lnk_source != "{{ wl_base }}/logs/{{ wl_dom }}/{{ item.1 }}"
  with_items: log_dir.results

http://docs.ansible.com/playbooks_loops.html#standard-loops中提供了更多信息和示例。

这里最重要的是您只想访问已注册变量的一部分。

答案 1 :(得分:3)

我的调试输出:

{
"dkim_key.results": [
    {
        "changed": false,
        "invocation": {
            "module_args": "path=/etc/opendkim/keys/accept.example.com/mail.private get_md5=no",
            "module_name": "stat"
        },
        "item": "accept.example.com",
        "stat": {
            "atime": 1427461574.5667424,
            "checksum": "c882abaabvc66257555929f6290480a409d1",
            "ctime": 1427461575.0307424,
            "dev": 64770,
            "exists": true,
            "gid": 119,
            "inode": 521115,
            "isblk": false,
            "ischr": false,
            "isdir": false,
            "isfifo": false,
            "isgid": false,
            "islnk": false,
            "isreg": true,
            "issock": false,
            "isuid": false,
            "mode": "0600",
            "mtime": 1427461574.5947425,
            "nlink": 1,
            "pw_name": "opendkim",
            "rgrp": false,
            "roth": false,
            "rusr": true,
            "size": 887,
            "uid": 110,
            "wgrp": false,
            "woth": false,
            "wusr": true,
            "xgrp": false,
            "xoth": false,
            "xusr": false
        }
    },
    {
        "changed": false,
        "invocation": {
            "module_args": "path=/etc/opendkim/keys/test.example.com/mail.private get_md5=no",
            "module_name": "stat"
        },
        "item": "test.example.com",
        "stat": {
            "exists": false
        }
    }
]
}

找到类似问题的解决方案如下:

- name: DKIM | Generate signing key
  shell: opendkim-genkey -s {{ postfix.dkim_selector }} -d {{ item.item }} -D /etc/opendkim/keys/{{ item.item }}
  with_items: dkim_key.results
  when: not item.stat.exists
  notify: restart opendkim
  tags:
    - postfix
    - dkim

使用dkim_key.results和列表进行迭代,然后使用item.stat.exists检查该列表。最后通过item

获取实际item.item