Ansible用列表迭代一个字典

我有通过include_vars加载下面的variables:

 access: username-foo: - path: / permissions: rwX recursive: true username-bar: - path: / permissions: rX - path: /css permissions: rwX recursive: true - path: /data permissions: rX - path: /data/reviews.yml permissions: rw - path: /js permissions: rX - path: /js/*.js permissions: rw 

我想将这些信息提供给shell命令来设置适当的权限。

我已经尝试了一些从这里的技术: http : //docs.ansible.com/playbooks_loops.html但没有拿出工作的解决scheme。

是否有可能迭代这个结构? 如果没有,我如何重新构build它才能使其工作? 是否有可能做到这一点,而不打破DRY规则(例如,包括用户名到每个logging)?

首先,您可能要考虑使用file模块 ,而不是shell 。 这不容易失败,表面上是幂等的。 但是,这可能会给你一些混合目录,文件和文件的问题。 因人而异。

至于问题的核心,我会设置你的variables,如下所示:

 users: - username: bar directories: - path: /data permissions: rX - path: /js permissions: rX - username: foo directories: - path: / permissions: rwX 

那戏会看起来像这样:

 - name: Change mod/own shell: chown {{ item.0.username }} {{ item.1.path }};chmod u+{{ item.1.permissions }} {{ item.1.path } with_subelements: - users - directories 

这是一个很好的输出示例,您可以尝试自己。 创build一个名为iteration_loop.yml的新手册:

 --- - name: Change mod/own hosts: all tasks: - name: show me the iterations debug: msg={{ item.0.username }} {{ item.1.path }} then {{ item.1.permissions }} {{ item.1.path }} with_subelements: - users - directories vars: users: - username: bar directories: - path: /data permissions: rX - path: /js permissions: rX - username: foo directories: - path: / permissions: rwX 

然后像这样运行剧本: ansible-playbook -i '172.16.222.131,' iteration_loop.yml

并且输出应该给你如何访问这些项目:

 PLAY [Change mod/own] ********************************************************* GATHERING FACTS *************************************************************** ok: [172.16.222.131] TASK: [show me the iterations] ************************************************ ok: [172.16.222.131] => (item=({'username': 'bar'}, {'path': '/data', 'permissions': 'rX'})) => { "item": [ { "username": "bar" }, { "path": "/data", "permissions": "rX" } ], "msg": "bar" } ok: [172.16.222.131] => (item=({'username': 'bar'}, {'path': '/js', 'permissions': 'rX'})) => { "item": [ { "username": "bar" }, { "path": "/js", "permissions": "rX" } ], "msg": "bar" } ok: [172.16.222.131] => (item=({'username': 'foo'}, {'path': '/', 'permissions': 'rwX'})) => { "item": [ { "username": "foo" }, { "path": "/", "permissions": "rwX" } ], "msg": "foo" } PLAY RECAP ******************************************************************** 172.16.222.131 : ok=2 changed=0 unreachable=0 failed=0 

假设dict={a:[1,2,3],b:[1,2]}依此类推:

 - name: Flattened list set_fact: flattened: "{{ dict.values() | sum(start=[]) }}" 

现在flattened == [1,2,3,1,2]