【问题标题】:Scrolling through a list with sublist in Ansible在 Ansible 中滚动带有子列表的列表
【发布时间】:2021-11-16 08:28:58
【问题描述】:

我需要同时遍历一个数据结构来对齐值,我用下面的代码得到这个结构:

- name: Set instances
  set_fact:
    instance_db:
      - 'db2inst1'
      - 'db2inst2'

- name: Get Dialog Path
  shell: db2 get dbm cfg | grep -i "Current member resolved DIAGPATH" | awk {'print $6'}
  become: true
  become_method: sudo
  become_flags: -i
  become_user: "{{ item }}"
  loop: "{{ instance_db }}"
  register: kud_path

- name: set_fact
  set_fact:
    db2_store: "[{{ instance_db | list }}] + [{{ kud_path.results|map(attribute='stdout')|list }}]"
  vars:
    db2_store: []

结果

{
    "changed": false,
    "ansible_facts": {
        "db2_store": [
            "db2inst1",
            "db2inst2",
            [
                "/db2home/db2inst1/sqllib/db2dump/DIAG0000/",
                "/home/db2inst2/sqllib/db2dump/DIAG0000/"
            ]
        ]
    },
    "_ansible_no_log": false
}

现在我需要自动遍历我放置[*] 的这些索引。因为就这样,我只能像item[0][1]这样访问数据

- name: Creating silent config
  template:
    src: template.txt.j2
    dest: '/tmp/template{{ item[0][*] | lower }}.txt'
    mode: '0775'
  loop:
    - "{{ db2_store }}"

这个变通方法对于能够将两个值都传递给模板是必要的

模板

################## Database connection config ##################
INSTANCE={{ item[0][*] }}
DIAGLOG_PATH={{ item[1][*] }}db2diag.log

关于如何做到这一点或更优雅的方式来获得相同结果的任何建议?

【问题讨论】:

    标签: list ansible yaml sublist


    【解决方案1】:

    假设如下:

    instance_db = ["db2inst1", "db2inst2"]
    kud_path.results|map(attribute='stdout')|list = ["/db2home/db2inst1/sqllib/db2dump/DIAG0000/", "/home/db2inst2/sqllib/db2dump/DIAG0000/"]
    

    然后您可以使用zip 过滤器,它将第一个列表的第 N 个元素与第二个列表的第 N 个元素配对。

    - debug:
        msg: "{{ instance_db | zip(kud_path.results|map(attribute='stdout')|list) }}"
    

    输出:

    TASK [debug] ********************************************************************
    ok: [localhost] => {
        "msg": [
            [
                "db2inst1",
                "/db2home/db2inst1/sqllib/db2dump/DIAG0000/"
            ],
            [
                "db2inst2",
                "/home/db2inst2/sqllib/db2dump/DIAG0000/"
            ]
        ]
    }
    

    这让你很容易循环:

    - name: Creating silent config
      template:
        src: template.txt.j2
        dest: '/tmp/template{{ item[0] | lower }}.txt'
        mode: '0775'
      loop: "{{ instance_db | zip(kud_path.results|map(attribute='stdout')|list) }}"
    
    ################## Database connection config ##################
    INSTANCE={{ item[0] }}
    DIAGLOG_PATH={{ item[1] }}db2diag.log
    

    【讨论】:

    • 你的回答太棒了,我不知道 zip 模块,谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多