如何将 `key=value` 文件转换为 Ansible facts?
How can I convert `key=value` file into Ansible facts?
我有一个文件,其中包含几行简单的 shell 样式(key=value
,没有空格或特殊字符)分配。我将如何使用 ansible.builtin.set_fact
将其转换为一组顶级事实? expandvars
看起来可能相关,但我找不到任何例子,甚至找不到任何像样的例子 documentation。
例如给定配置文件
shell> cat conf.ini
key1=alpha=beta=charlie
key2=value2
key3= value3
下面的变量
config_vars: "{{ dict(lookup('file', 'conf.ini').split('\n')|
map('split', '=', 1)|
map('map', 'trim')) }}"
扩展到
config_vars:
key1: alpha=beta=charlie
key2: value2
key3: value3
如果您确定配置文件中没有空格,您可以从管道中删除最后一个 map/trim 过滤器。不过,为了保险起见,还是留着吧。
远程主机的配置文件
上一节中的解决方案仅适用于控制器,因为查找插件在本地主机上执行。如果文件在远程主机上,请先获取文件。例如,给定配置文件
shell> ssh admin@test_11 cat /tmp/conf.ini
key1=alpha=beta=charlie
key2=value2
key3= value3
shell> ssh admin@test_12 cat /tmp/conf.ini
key1=value1
key2= value2
key3=alpha=beta=charlie
下面的剧本
- hosts: test_11,test_12
vars:
conf_ini_path: "conf_ini/{{ inventory_hostname }}/tmp/conf.ini"
config_vars: "{{ dict(lookup('file', conf_ini_path).split('\n')|
map('split', '=', 1)|
map('map', 'trim')) }}"
tasks:
- fetch:
dest: conf_ini
src: /tmp/conf.ini
- debug:
var: config_vars
给出(删节)
TASK [debug] ***********************************************
ok: [test_11] =>
config_vars:
key1: alpha=beta=charlie
key2: value2
key3: value3
ok: [test_12] =>
config_vars:
key1: value1
key2: value2
key3: alpha=beta=charlie
允许没有值
例如给定配置文件
shell> cat conf.ini
key1=alpha=beta=charlie
key2=value2
key3= value3
key4
下面的变量
config_vars: "{{ dict(lookup('file', 'conf.ini').split('\n')|
map('split', '=', 1)|
map('map', 'trim')|
map('json_query', '[]|[[0], [1]]')) }}"
扩展到
config_vars:
key1: alpha=beta=charlie
key2: value2
key3: value3
key4: null
我有一个文件,其中包含几行简单的 shell 样式(key=value
,没有空格或特殊字符)分配。我将如何使用 ansible.builtin.set_fact
将其转换为一组顶级事实? expandvars
看起来可能相关,但我找不到任何例子,甚至找不到任何像样的例子 documentation。
例如给定配置文件
shell> cat conf.ini
key1=alpha=beta=charlie
key2=value2
key3= value3
下面的变量
config_vars: "{{ dict(lookup('file', 'conf.ini').split('\n')|
map('split', '=', 1)|
map('map', 'trim')) }}"
扩展到
config_vars:
key1: alpha=beta=charlie
key2: value2
key3: value3
如果您确定配置文件中没有空格,您可以从管道中删除最后一个 map/trim 过滤器。不过,为了保险起见,还是留着吧。
远程主机的配置文件
上一节中的解决方案仅适用于控制器,因为查找插件在本地主机上执行。如果文件在远程主机上,请先获取文件。例如,给定配置文件
shell> ssh admin@test_11 cat /tmp/conf.ini
key1=alpha=beta=charlie
key2=value2
key3= value3
shell> ssh admin@test_12 cat /tmp/conf.ini
key1=value1
key2= value2
key3=alpha=beta=charlie
下面的剧本
- hosts: test_11,test_12
vars:
conf_ini_path: "conf_ini/{{ inventory_hostname }}/tmp/conf.ini"
config_vars: "{{ dict(lookup('file', conf_ini_path).split('\n')|
map('split', '=', 1)|
map('map', 'trim')) }}"
tasks:
- fetch:
dest: conf_ini
src: /tmp/conf.ini
- debug:
var: config_vars
给出(删节)
TASK [debug] ***********************************************
ok: [test_11] =>
config_vars:
key1: alpha=beta=charlie
key2: value2
key3: value3
ok: [test_12] =>
config_vars:
key1: value1
key2: value2
key3: alpha=beta=charlie
允许没有值
例如给定配置文件
shell> cat conf.ini
key1=alpha=beta=charlie
key2=value2
key3= value3
key4
下面的变量
config_vars: "{{ dict(lookup('file', 'conf.ini').split('\n')|
map('split', '=', 1)|
map('map', 'trim')|
map('json_query', '[]|[[0], [1]]')) }}"
扩展到
config_vars:
key1: alpha=beta=charlie
key2: value2
key3: value3
key4: null