我正在尝试创建一个特定于环境的配置文件,该文件由从csv文件中读取的键值对组成。csv文件包含许多环境的配置设置,我需要根据剧本使用的库存为每个环境生成一个配置文件。
CSV文件设置.CSV
Key|siteA-test|siteA-prod|siteB-test|siteB-prod|Comment
param1|true|true|false|false|Comment for param1
param2|http://test|http://prod|||Comment for param2
param3|ansible_variable_A_test|ansible_variable_A_prod|ansible_variable_B_test|ansible_variable_B_prod|Variable must be taken from secret vault
param4|ansible_variable_C_test|ansible_variable_C_prod|ansible_variable_D_test| ansible_variable_D_prod|Another variable from variable file
站点的预期文件测试看起来像:
param1=true # Comment for param1
param2=http://test # Comment for param2
param3=secret_value_from_vault # Variable must be taken from secret vault
param4=1984 # Another variable from variable file
我将使用lineinfile模块把它写到一个文件中。
到目前为止,我已经(有点难看(找到了如何获得特定环境的值,方法是先创建一个键字典,然后迭代该字典。我不喜欢我必须读两次CSV文件,但这是有效的。
- hosts: hostgroupA
tasks:
- name: Read CSV file and return a dictionary
community.general.read_csv:
path: settings.csv
delimiter: '|'
key: Key
strict: yes
register: config
delegate_to: localhost
- ansible.builtin.debug:
msg: "Key {{ lookup('csvfile', '{{item.key}} file=settings.csv col=1 delimiter=|') }}, value: {{ lookup('csvfile', '{{item.key}} file=settings.csv col=2 delimiter=|')}} "
loop: "{{ config.dict| dict2items }}"
delegate_to: localhost
问题是,我不知道是否可以将param3和param4的变量名替换为Vault或其他变量文件中的实际值。
使用lookup
插件vars
。参见ansible-doc -t lookup vars
。例如,给定简化的库存。(如果愿意,请加密test*_var。最好的选择可能是将变量放入存储在host_var中的加密文件中(。
shall> cat hosts
testA testA_var="A"
testB testB_var="B"
以及简化的CSV文件设置.CSV,例如
shell> cat settings.csv
Key|testA|testB|Comment
param1|true|false|Comment for param1
param2|testA_var|testB_var|Var from vault
战术手册
- hosts: all
tasks:
- read_csv:
path: settings.csv
delimiter: '|'
key: Key
strict: yes
register: config
delegate_to: localhost
run_once: true
- debug:
msg: "param1: {{ _p1 }}, param2: {{ _p2 }}"
vars:
_p1: "{{ config.dict.param1[inventory_hostname] }}"
_p2: "{{ lookup('vars', config.dict.param2[inventory_hostname]) }}"
给出
ok: [testB] =>
msg: 'param1: false, param2: B'
ok: [testA] =>
msg: 'param1: true, param2: A'
如果您想迭代主机,例如
- debug:
msg: "{{ item }} param1: {{ _p1 }}, param2: {{ _p2 }}"
loop: "{{ ansible_play_hosts }}"
vars:
_p1: "{{ config.dict.param1[item] }}"
_varname: "{{ config.dict.param2[item] }}"
_p2: "{{ hostvars[item][_varname] }}"
run_once: true
给出
msg: 'testA param1: true, param2: A'
msg: 'testB param1: false, param2: B'