ansible:如何通过字母数字键/索引/哈希访问yaml定义的数组

标签 ansible yaml

假设我有一个服务器列表和一个目录列表:

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 个月了。

看看你的最终目标,我认为你想要做的是生成如下所示的行:

  1. /go.sh /backupF/s1 1.1.1.1

  2. /go.sh /backupM/s2 1.1.1.1

  3. /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/

相关文章:

ansible - 使用 include_vars 时相同的变量名称

json - 安塞 bool : How to split json data with some seperator in json_query

azure-devops - 在我的 Azure DevOps YAML Pipeline 中,如何将一堆阶段转换为作业矩阵?

Rmarkdown 不会将 Montserrat 字体编织成 PDF

ansible - 在运行角色之前动态运行 "ansible-galaxy install -r requirement.yml -p roles/"作为先决条件

即使启用了 sudo,对于无法写入/var/文件夹的用户,Ansible ping 也会失败

ios - Ansible 多行提示字符串 ios_command 模块

yaml - 如何在 kubernetes 复制 Controller yaml 文件中使用环境变量

annotations - 注释或Yaml-Symfony3

python-3.x - 当默认加载程序已经变得更加安全时,为什么PyYAML 5.1会引发YAMLLoadWarning?