【问题标题】:Ansible jinja2 manipulate lists based on multi level valuesAnsible jinja2 基于多级值操作列表
【发布时间】:2021-10-20 13:53:39
【问题描述】:

我正在尝试在 Ansible 中操作此列表:

webserver:
  sites:
    - user: userone
      domains:
        - domain: domainone.com
        - domain: domaintwo.com
    - user: usertwo
      domains:
        - domain: domainthree.com
    - user: userthree
      domains:
        - domain: domainfour.com
        - domain: domainfive.com

进入这个:

domains_with_user:
  - domain: domainone.com
    user: userone
  - domain: domaintwo.com
    user: userone
  - domain: domainthree.com
    user: usertwo
  - domain: domainfour.com
    user: userthree
  - domain: domainfive.com
    user: userthree

但随后代码仅基于第一个“webserver:”配置。

我该怎么做?我希望能够将其作为新的变量声明(“domains_with_user”:{{ some code }})

【问题讨论】:

    标签: ansible jinja2 ansible-template


    【解决方案1】:

    您可以使用带有过滤器子元素的循环

    ---
    - hosts: localhost
      gather_facts: false
    
      vars:
        webserver:
          sites:
            - user: userone
              domains:
                - domain: domainone.com
                - domain: domaintwo.com
            - user: usertwo
              domains:
                - domain: domainthree.com
            - user: userthree
              domains:
                - domain: domainfour.com
                - domain: domainfive.com
    
      tasks:
        - name: Set domains_with_user variable
          set_fact:
            domains_with_user: "{{ domains_with_user | default([]) + [{ 'domain': item.1.domain , 'user': item.0.user }] }}"
          loop: "{{ webserver.sites | subelements('domains') }}"
    
        - name: DEBUG
          debug:
            msg: "{{ domains_with_user }}"
    

    和输出:

    PLAY [localhost] **********************************************************************************
    
    TASK [Set domains_with_user variable] *************************************************************
    ok: [localhost] => (item=[{'user': 'userone', 'domains': [{'domain': 'domainone.com'}, {'domain': 'domaintwo.com'}]}, {'domain': 'domainone.com'}])
    ok: [localhost] => (item=[{'user': 'userone', 'domains': [{'domain': 'domainone.com'}, {'domain': 'domaintwo.com'}]}, {'domain': 'domaintwo.com'}])
    ok: [localhost] => (item=[{'user': 'usertwo', 'domains': [{'domain': 'domainthree.com'}]}, {'domain': 'domainthree.com'}])
    ok: [localhost] => (item=[{'user': 'userthree', 'domains': [{'domain': 'domainfour.com'}, {'domain': 'domainfive.com'}]}, {'domain': 'domainfour.com'}])
    ok: [localhost] => (item=[{'user': 'userthree', 'domains': [{'domain': 'domainfour.com'}, {'domain': 'domainfive.com'}]}, {'domain': 'domainfive.com'}])
    
    TASK [DEBUG] **************************************************************************************
    ok: [localhost] => {
        "msg": [
            {
                "domain": "domainone.com",
                "user": "userone"
            },
            {
                "domain": "domaintwo.com",
                "user": "userone"
            },
            {
                "domain": "domainthree.com",
                "user": "usertwo"
            },
            {
                "domain": "domainfour.com",
                "user": "userthree"
            },
            {
                "domain": "domainfive.com",
                "user": "userthree"
            }
        ]
    }
    
    PLAY RECAP ****************************************************************************************
    

    【讨论】:

    • 我希望能够立即在变量中执行此操作,而不是在 set_fact 上执行循环。但是我会这样做,谢谢!
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多