如何将 `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