有一种方法可以在 ansible 中模板化变量

问题描述 投票:0回答:2
applications:
  appA:
    someDB:
      enable: true
      datadir: '/var/lib/postgresql/11/appA'

  appB:
    someDB:
      enable: true
      datadir: '/var/lib/postgresql/11/appB'

- ansible.builtin.set_fact:
    clusters: "{{ clusters + [ item ] }}"
  when: applications.{{ item }}.someDB.enable
  loop:
    - appA
    - appB

- ansible.builtin.shell: |
    pg_createcluster \
      -d {{ aplications.item.someDB.datadir }}
  when: item == 'appA'
  loop: "{{ clusters }}"

有没有一种简单的方法可以在 var 中进行 ansible do 替换?就像一些优先操作数。

在循环中:item == appA

所以,{{ aplications.item.someDB.datadir }} 是这样的 {{ aplications.appA.someDB.datadir }},自动是它的内容是:'/var/lib/postgresql/11/appA' 等等上

可能我使用了错误的方法,但我觉得这样做是合理的。

谢谢你的帮助。

templates variables ansible jinja2
2个回答
0
投票

applications
变量可以展平,这样任务的条件设置会更容易

applications:
  - name: appA
    someDB:
      enable: true
      datadir: '/var/lib/postgresql/11/appA'

  - name: appB
    someDB:
      enable: true
      datadir: '/var/lib/postgresql/11/appB'

- name: Create PG cluster
  ansible.builtin.shell: >
    pg_createcluster
      -d {{ item.someDB.datadir }}
  when:
    - item.name == 'appA'
    - item.someDB.enable
  loop: "{{ applications }}"

一些评论:

  • 在任务中添加一个独特的
    name
    将使您更容易调试您的剧本,特别是当您有一个很长的剧本或角色时
  • >
    中使用
    shell
    会注意将说明折叠为一行,因此您不需要斜杠
  • 通常创建一个postgress数据库,你更喜欢使用postgresql_db Ansible模块;
    -d <directory>
    最好在配置文件中设置,因此您不需要它作为参数。

0
投票

创建字典

  app_datadir: "{{ dict(applications|dict2items|
                        json_query('[].[key, value.someDB.datadir]')) }}"

给予

  app_datadir:
    appA: /var/lib/postgresql/11/appA
    appB: /var/lib/postgresql/11/appB

使用这本字典“让 Ansible 做替换”。例如,

    - debug:
        msg: "aplications.{{ item }}.someDB.datadir: {{ app_datadir[item] }}"
      loop:
        - appA
        - appB

给(删节)

  msg: 'aplications.appA.someDB.datadir: /var/lib/postgresql/11/appA'
  msg: 'aplications.appB.someDB.datadir: /var/lib/postgresql/11/appB'

完整的测试剧本示例

- hosts: localhost

  vars:

    applications:
      appA:
        someDB:
          enable: true
          datadir: '/var/lib/postgresql/11/appA'
      appB:
        someDB:
          enable: true
          datadir: '/var/lib/postgresql/11/appB'

    app_datadir: "{{ dict(applications|dict2items|
                          json_query('[].[key, value.someDB.datadir]')) }}"

  tasks:

    - debug:
        var: app_datadir

    - debug:
        msg: "aplications.{{ item }}.someDB.datadir: {{ app_datadir[item] }}"
      loop:
        - appA
        - appB
© www.soinside.com 2019 - 2024. All rights reserved.