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' 等等上
可能我使用了错误的方法,但我觉得这样做是合理的。
谢谢你的帮助。
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
会注意将说明折叠为一行,因此您不需要斜杠-d <directory>
最好在配置文件中设置,因此您不需要它作为参数。创建字典
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