【问题标题】:Ansible jinja2 templatingAnsible jinja2 模板
【发布时间】:2021-01-07 08:17:23
【问题描述】:

在 Ansible 中,我目前有这样设置的变量


    container_a_version: 1
    container_b_version: 6
    container_c_version: 3
    container_d_version: 2
    ...


    containers:
     - container_a
     - container_b
     - container_c
     - container_d  
    ... 

每个容器都有自己的模板文件,其中有这样一行


    image: registry.sportpesa.com/sportpesa/global/container-a:{{ container_a_version }}

我的剧本


    - name: Copy templates
      template:
        src: templates/docker-compose-{{ item }}.yml
        dest: /srv/docker-compose-{{ item }}.yml
      loop: "{{ containers }}"

如果我只想部署容器 a 和 c。我把我的变量改成这个


    containers:
     - container_a
    # - container_b
     - container_c
    # - container_d 

 

我想要做的是将我的变量压缩成只有 1 个这样的变量

    containers:
      - { name: a, version: 1 }
      - { name: b, version: 6 }
      - { name: c, version: 3 }
      - { name: d, version: 2 }

但是我不确定如何在模板中调用容器版本。这可能吗?

【问题讨论】:

    标签: templates ansible jinja2


    【解决方案1】:

    例如,剧本

    shell> cat pb.yml
    - hosts: localhost
      vars:
        containers:
          - {name: a, version: 1}
          - {name: b, version: 2}
      tasks:
        - template:
            src: containers.txt.j2
            dest: containers.txt
    

    和模板

    shell> cat containers.txt.j2
    {% for item in containers %}
    name: {{ item.name }} version {{ item.version }}
    {% endfor %}
    

    shell> cat containers.txt
    name: a version 1
    name: b version 2
    

    可以迭代列表

        - debug:
            msg: "image: registry.example.com/container-{{ item.name }}:container_{{ item.version }}_version"
          loop: "{{ containers }}"
    

    给予

      msg: 'image: registry.example.com/container-a:container_1_version'
      msg: 'image: registry.example.com/container-b:container_2_version'
    

    【讨论】:

      【解决方案2】:

      由于您需要两个不同的模板,每个模板都有各自的容器名称和版本,而无需循环 containers 变量。您可以使用呈现两个模板的剧本。在我的示例中,我将调用模板:

      • 容器-a
      • 容器-b

      模板container-a.j2:

      image: registry.example.com/container-{{ containers[0]['name'] }}:{{ containers[0]['version'] }}
      

      模板container-b.j2:

      image: registry.example.com/container-{{ containers[1]['name'] }}:{{ containers[1]['version'] }}
      

      然后我的剧本将有以下任务:

      vars:
        containers:
        - { name: a, version: 1 }
        - { name: b, version: 2 }
      
      tasks:
      - template:
          src: "container-{{ containers[0]['name'] }}.j2"
          dest: "/tmp/container-{{ containers[0]['name'] }}"
      - template:
          src: "container-{{ containers[1]['name'] }}.j2"
          dest: "/tmp/container-{{ containers[1]['name'] }}"
      

      当这个 playbook 运行时,它会呈现 /tmp/container-a:

      image: registry.example.com/container-a:1
      

      /tmp/container-b:

      image: registry.example.com/container-b:2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多