Ansible 用匹配的变量名替换所有值

Ansible 用匹配的变量名替换所有值

我是 Ansible 的新手,可能对此理解有误,但这是我知道的解决这个问题的唯一方法。

我有一个长度为 4000 个条目的 ini 文件。为了尝试以代码形式进行配置,我将每个条目的值提取到一个变量文件中,其格式为,sectionheader--keyname: originalvalue并用标记模式和现在包含其值的变量名称替换它们。

我知道 Ansible 可以进行正则表达式替换,但还没有找到像这样动态地进行替换的方法。

原始文件:

[sectionheader1]

keyname1=value1

[sectionheader2]

keyname1=value2

带有令牌替换的文件现在保存在源中并可部署:

[sectionheader1]

keyname1=%<sectionheader1--keyname1>

[sectionheader2]

keyname1=%<sectionheader2--keyname1>

变量:

testenvironment:
  sectionheader1--keyname1: value1
  sectionheader2--keyname1: value2
prodenvironment:
  sectionheader1--keyname1: value1 (specific to prod)
  sectionheader2--keyname1: value2 (specific to prod)

然后我的想法是,我将替换%<>我找到的匹配变量名的每一个出现的标记模式,然后,我已经构建了特定于我所处环境的配置文件。现在,我可以检查,如果我有任何残留%<>模式,我知道并非所有变量都已定义,并且可以抛出错误。Octopus deploy 以这种方式处理配置文件中的变量替换,这是我最有经验的。

Ansible 有办法做到这一点吗?我想我可以编写一个脚本来执行此操作,然后让 Ansible 调用它,但我希望有一种内置的配置变量替换方式作为代码。

答案1

ini文件可能会使用模块。

下面的任务

- ini_file:
    path: /scratch/testenvironment.ini
    section: "{{ item.key.split('--').0 }}"
    option: "{{ item.key.split('--').1 }}"
    value: "{{ item.value }}"
  loop: "{{ testenvironment|dict2items }}"

给出

$ cat /scratch/testenvironment.ini 

[sectionheader2]
keyname1 = value2
[sectionheader1]
keyname1 = value1

如果各部分应按字母顺序排序,请使用

 loop: "{{ testenvironment|dict2items|sort(attribute='key') }}"

答案2

使用适当的设置模板,您应该能够使用字典设置所有内容。.ini
本质上是一个 2 深度字典,因此我们将在 .j2 模板中使用 2 个嵌套的 jinja2 for 循环将其视为 2 深度字典。

在这个例子中,我在命令行上设置了 env 变量以实现紧凑性,但它可以在 inventory、host_vars 或 group_vars 文件中设置。

ansible/example.yml

---
- hosts: localhost
  gather_facts: false
  vars:
    dev:
      section1:
        key1: value1
      section2:
        key1: value1
    prod:
      section1:
        key1: value2 #(specific to prod)
      section2:
        key1: value2 #(specific to prod)
  tasks:
    - template: src=example.ini.j2  dest=/tmp/ansible.ini

ansible/templates/example.ini.j2

{% for section in vars[vars.env] %}
[{{section}}]
{% for key in vars[env][section] %}
{{key}}={{vars[env][section][key]}}
{% endfor %}
{% endfor %}

$ ansible-playbook ansible/test.yml -e env=dev; cat /tmp/ansible.ini

PLAY [localhost] ********************************************************************************************************************************************

TASK [template] *********************************************************************************************************************************************
changed: [localhost]

PLAY RECAP **************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[section1]
key1=value1
[section2]
key1=value1

$ ansible-playbook ansible/test.yml -e env=prod; cat /tmp/ansible.ini

PLAY [localhost] ********************************************************************************************************************************************

TASK [template] *********************************************************************************************************************************************
changed: [localhost]

PLAY RECAP **************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[section1]
key1=value2
[section2]
key1=value2

相关内容