假设我有一个服务器列表和一个目录列表:
servers: - server1: ip: 1.1.1.1 - server2: ip: 2.2.2.2 directories: - path: /backupF/s1 name: bmma server: server1 - path: /backupM/s2 name: cqce server: server1 - path: /backupM/s3 name: cqce server: server2
I would now like to use the data like this:
- name: write wonderful config file lineinfile: dest: /testfile line: "/go.sh {{ item.path }} {{ servers[item.server].ip }}" with_items: "{{ directories }}"
Unfortunately, this does not work. I can access a server within the with_items loop via its index:
line: "/go.sh {{ item.path }} {{ servers[0].ip }}"
...但不是通过其名称:
line: "/go.sh {{ item.path }} {{ servers[server1].ip }}"
有没有可能?
最佳答案
您的问题是您的服务器变量当前是一个有序数组,即具有项目 0、1、2 等,但您真正想要的是一个字典。直到今天,数组与字典仍然让我感到困惑,我已经愤怒地使用 Ansible 18 个月了。
看看你的最终目标,我认为你想要做的是生成如下所示的行:
-
/go.sh /backupF/s1 1.1.1.1
-
/go.sh /backupM/s2 1.1.1.1
-
/go.sh /backupM/s3 2.2.2.2
如果是这种情况,您需要做的就是将服务器变量重构为字典,而不是数组(注意缺少连字符和 ip 上的额外缩进):
servers:
server1:
ip: 1.1.1.1
server2:
ip: 2.2.2.2
调试是你的 friend 。不想在文件中输出任何实际行,我将您的任务更改为:
- debug:
msg: "/go.sh {{ item.path }} {{ servers[item.server].ip }}"
with_items: "{{ directories }}"
这会产生以下结果:
ok: [localhost] => (item={u'path': u'/backupF/s1', u'name': u'bmma', u'server': u'server1'}) => {
"msg": "/go.sh /backupF/s1 1.1.1.1"
}
ok: [localhost] => (item={u'path': u'/backupM/s2', u'name': u'cqce', u'server': u'server1'}) => {
"msg": "/go.sh /backupM/s2 1.1.1.1"
}
ok: [localhost] => (item={u'path': u'/backupM/s3', u'name': u'cqce', u'server': u'server2'}) => {
"msg": "/go.sh /backupM/s3 2.2.2.2"
}
关于ansible:如何通过字母数字键/索引/哈希访问yaml定义的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51420567/