我通过以下方式加载了以下变量include_vars
:
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
Run Code Online (Sandbox Code Playgroud)
我想将此信息提供给shell
命令以设置适当的权限。
我从这里尝试了一些技术:http : //docs.ansible.com/playbooks_loops.html 但未能提出有效的解决方案。
是否可以迭代这个结构?如果没有,我如何重新构建它以使其工作?是否可以在不违反 DRY 规则的情况下执行此操作(例如,将用户名包含在每条记录中)?
Chr*_*rel 21
首先,您可能需要考虑使用file
module,而不是shell
. 它不太容易失败,而且表面上是幂等的。但是,这可能会给您混合目录、文件和文件 glob 带来一些问题。天啊。
至于问题的核心,我会像这样设置你的变量:
users:
- username: bar
directories:
- path: /data
permissions: rX
- path: /js
permissions: rX
- username: foo
directories:
- path: /
permissions: rwX
Run Code Online (Sandbox Code Playgroud)
该剧将如下所示:
- name: Change mod/own
shell: chown {{ item.0.username }} {{ item.1.path }};chmod u+{{ item.1.permissions }} {{ item.1.path }
with_subelements:
- users
- directories
Run Code Online (Sandbox Code Playgroud)
小智 7
这是一个很好的输出示例,您可以自己尝试。创建一个名为 的新剧本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
Run Code Online (Sandbox Code Playgroud)
然后像这样运行剧本:
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
Run Code Online (Sandbox Code Playgroud)