Ansible Jinja2 字典中的模板字典

问题描述 投票:0回答:1

我想为 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 中设置它,然后他选择这个+其他默认变量。

ansible jinja2
1个回答
0
投票

您应该使用 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
中删除某些内容,它不会将已更改的键或部分更改回默认值。在这种情况下,您应该显式指定旧值,或者创建一个单独的任务来删除不需要的键。

© www.soinside.com 2019 - 2024. All rights reserved.