首页 文章

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

提问于
浏览
0

比方说,我有一个服务器列表和一个目录列表:

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

我现在想使用这样的数据:

- name: write wonderful config file
    lineinfile:
      dest: /testfile
      line: "/go.sh {{ item.path }} {{ servers[item.server].ip }}"
    with_items: "{{ directories }}"

不幸的是,这不起作用 . 我可以通过索引访问with_items循环中的服务器:

line: "/go.sh {{ item.path }} {{ servers[0].ip }}"

......但不是通过它的名字:

line: "/go.sh {{ item.path }} {{ servers[server1].ip }}"

有可能吗?

1 回答

  • 2

    您的问题是您的服务器变量当前是一个有序数组,即具有项目0,1,2等,但您真正想要的是字典 . Arrays vs dicts仍然让我感到困惑,直到今天,我一直愤怒地使用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

    如果是这种情况,您需要做的就是将您的服务器变量重构为dict而不是数组(注意缺少连字符和ip上的额外缩进):

    servers:
      server1:
        ip: 1.1.1.1
      server2:
        ip: 2.2.2.2
    

    调试是你的朋友 . 我不想输出文件中的任何实际行,我将您的任务更改为:

    - 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"
    }
    

相关问题