我想为 apache2 和 cli 模板化 php.ini 配置。我过滤掉了默认选项并将它们添加到这样的字典中:
php_config_options:
cli:
engine: "On"
short_open_tag: "Off"
precision: 14
[...]
cli:
engine: "On"
short_open_tag: "Off"
precision: 14
[...]
我已将其放在
vars/Ubuntu-22.yaml
下,以便我可以针对发布持续配置它。我的模板如下所示:
{% if php_config_options[environment] is defined %}
{% for option, value in php_config_options[environment].items() %}
{{ option }} = {{ value }}
{% endfor %}
{% endif %}
我的任务是这样的:
- name: setup | Template php.ini
ansible.builtin.template:
src: "{{ php_version }}/php.ini.j2"
dest: /etc/php/{{ php_version }}/apache2/php.ini
owner: root
group: root
mode: 0644
vars:
environment: "apache2"
当我尝试运行它时,出现错误
dict object has no element []
但我不知道为什么。有人可以帮我吗?
我的想法是使用这些默认变量,但是当我想更改一个变量时,我将在 group_vars 或 host_vars 中设置它,然后他选择这个+其他默认变量。
您应该使用 community.general.ini_file 模块,它是专门为您的用例设计的 - 调整现有设置,而无需自己维护默认值。
我创建了一个最小的可复制剧本来说明如何将 yaml 设置映射到现有的 ini 文件中
假设我们在 playbook 目录中有一个 config.ini 文件,其中包含以下内容:
[section0]
key0 = value0
[section1]
key1 = old_value
然后我们可以执行以下playbook.yaml
- name: Generate ini from yaml
hosts: localhost
vars:
php_config_options:
section1:
key1: value1
section2:
key2: value2
key3: value4
tasks:
- name: Generate INI file from YAML variable
community.general.ini_file:
path: "{{ playbook_dir }}/config.ini"
section: "{{ item.0 }}"
option: "{{ item.1 }}"
value: "{{ item.2 }}"
mode: "0644"
loop: >-
{%- set results = [] -%}
{%- for section in php_config_options.items() -%}
{%- for item in section.1.items() -%}
{%- set _ = results.append([section.0, item.0, item.1]) %}
{%- endfor -%}
{%- endfor -%}
{{ results }}
命令
ansible-playbook playbook.yaml
的输出将包含
TASK [Generate INI file from YAML variable]
changed: [localhost] => (item=['section1', 'key1', 'value1'])
changed: [localhost] => (item=['section2', 'key2', 'value2'])
changed: [localhost] => (item=['section2', 'key3', 'value4'])
文件config.ini的内容是
[section0]
key0 = value0
[section1]
key1 = value1
[section2]
key2 = value2
key3 = value4
请注意,section1 中 key1 的值已被替换,并且添加了缺少的选项,而原始section0 值保持不变。
现在关于这个循环,我们在做什么——对于每个部分中的每个键/值对,我们正在创建列表,包含
并为每个生成的列表执行 init_file 模块。我确信其他神社大师可以想出聪明的函数来解决相同的任务,但我喜欢我的剧本是明确的。
需要注意的是,如果您从
php_config_options
中删除某些内容,它不会将已更改的键或部分更改回默认值。在这种情况下,您应该显式指定旧值,或者创建一个单独的任务来删除不需要的键。