我是 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