从ansible

时间:2016-05-19 09:20:10

标签: json amazon-web-services ansible amazon-iam

我有一个ansible playbook,可以在AWS中创建一些IAM用户。 我希望该剧本能够为每个创建的帐户返回用户名和访问密钥详细信息。

从任务中注册输出非常简单:

  - name: Create IAM users
    iam:
      iam_type: user
      name: "{{ item }}"
      state: present
      access_key_state: create
    with_items:
       - "user1"
       - "someotheruser"
       - "user3"
    register: users

我发现这项输出很棘手。 它产生的Json如下:(略微截断以减少这里的长度)

ok: [localhost] => {
    "users": {
        "changed": true,
        "msg": "All items completed",
        "results": [
                "user_meta": {
                    "access_keys": [
                        {
                            "access_key_id": "key1",
                            "access_key_selector": "HMAC",
                            "create_date": "2016-05-19T08:37:11.007Z",
                            "secret_access_key": "secretkey1",
                            "status": "Active",
                            "user_name": "user1"
                        }
                    ],
                }
            },
            {
                "user_meta": {
                    "access_keys": [
                        {
                            "access_key_id": "key2",
                            "access_key_selector": "HMAC",
                            "create_date": "2016-05-19T08:37:13.391Z",
                            "secret_access_key": "secretkey2",
                            "status": "Active",
                            "user_name": "someotheruser"
                        }
                    ],
                }
            },
            {
                "user_meta": {
                    "access_keys": [
                        {
                            "access_key_id": "key3",
                            "access_key_selector": "HMAC",
                            "create_date": "2016-05-19T08:37:16.243Z",
                            "secret_access_key": "secretkey3",
                            "status": "Active",
                            "user_name": "user3"
                        }
                    ],
                }
            }
        ]
    }
}

我想在剧本完成后整齐地展示这一点,我最接近使用调试后得到的内容如下:

  - debug: var="users.results[0].user_meta.access_keys"
  - debug: var="users.results[1].user_meta.access_keys"
  - debug: var="users.results[2].user_meta.access_keys"

然而,感觉很蹩脚。如果我添加用户4和5怎么办? 我希望能够引用整个结果数组,这样无论我添加到剧本中的用户数量多少,它都能正常工作。

有没有办法实现这个目标?

作为旁注,我还试图使用from_json,例如

- debug: msg="{{ (users.stdout|from_json).results }}"

但是我不知道我是否遇到过ansible 2.0.1.0的错误,或者我是否错误地使用了它,但我只能得到"输入错误。预期的字符串或缓冲区"

任何想法都很高兴收到。

3 个答案:

答案 0 :(得分:1)

您也可以遍历已注册的变量。

这样的事情应该有效:

 - name      : debug access keys
   debug     : var="{{ item.user_meta.access_keys }}"
   with_items: users.results

答案 1 :(得分:1)

如果其他人想要做同样的事情......

我发现对我来说最好的解决方案是使用'length'计算数组中的对象数,然后设置debug应该迭代的范围。

我从返回的值中减去“1”,因为数组中的第一个对象被“0”引用。

  - name: Record Users Access Keys
    debug: var=users.results[{{ item }}].user_meta.access_keys
    with_sequence: start=0 end={{users.results|length -1}}

希望能帮助某人寻找类似的东西。

答案 2 :(得分:0)

Ansiballer的答案对我有用,但是如果其他人正在寻找更简单的方法,则可以使用json_query:

- name: show access keys
  debug:
    var: item
  loop: "{{ users | json_query('results[*].user_meta.access_keys') }}"

Ansible docs on json_query

您可能必须安装jmespath才能运行(apt-get install python-jmespath或类似的版本)