用ansible从csv文件中读取变量名,并用值替换



我正在尝试创建一个特定于环境的配置文件,该文件由从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'

最新更新