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

ansible:如何通过字母数字键/索引/哈希访问yaml定义的数组,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: c

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

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 。。。但不是通过它的名字:

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

有没有可能?

您的问题是,您的服务器变量当前是一个有序数组,即包含项0、1、2等,但您真正需要的是一个字典。数组和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

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

    我是你的朋友。由于不想在文件中输出任何实际行,我将您的任务更改为:

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

    听起来很棒,我将在周一试一试。非常感谢。
    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"
    }