Ansible:使用字典中的模板创建多个文件

Ansible: Creating multiple files using a template from a dictionary

提问人:user17330997 提问时间:9/29/2023 更新时间:9/29/2023 访问量:26

问:

我正在尝试使用字典中的元素通过模板创建多个文件来填充这些文件。

我的目标是为每个上传组创建 proftpd 的配置文件。每个配置文件都包含这些用户的各种配置位。

这是我正在使用的字典:(此字典结构还包括 playbook 未使用但将由其他 playbook 使用的其他元素。因此,如果可能的话,我想保留这种结构,以保持单一的事实来源。

uploaders:
  - name: 'Uploaders from one location'
    initials: 'abc'
    ftps_limit_list: 'LIST PWD xpwd'
    variable_used_by_another_playbook: 'fubar'
  - name: 'Uploaders from a second location'
    initials: 'dfg'
  - name: 'Test Uploader'
    initials: 'TestUploader'
    ftps_upload_directory: '/path/to/TestUploader/uploads'

这是我尝试使用的 conf.d.j2 代码片段:

{% if ftps_upload_directory is defined %}
<Directory {{ ftps_upload_directory }}>
{% else %}
<Directory /path/to/{{ initials|upper }}/uploads>
{% endif %}

<snip>

<Limit LOGIN>
AllowGroup uploader-{{ initials|lower }}
Deny ALL
</Limit>

<snip>

{% if ftps_limit_list is defined %}
<Limit {{ ftps_limit_list }}>
{% else %}
<Limit LIST MLSD MLST NLST SIZE>
{% endif %}
AllowAll
</Limit>

我期望的是 3 个配置文件,如下所示:

abc.conf (注意允许自定义限制)

<Directory /path/to/ABC/uploads>

<snip>

<Limit LOGIN>
AllowGroup uploader-abc
Deny ALL
</Limit>

<snip>

<Limit LIST PWD XPWD>
AllowAll
</Limit>

dfg.conf(注意:使用所有默认值)

<Directory /path/to/DFG/uploads>

<snip>

<Limit LOGIN>
AllowGroup uploader-dfg
Deny ALL
</Limit>

<snip>

<Limit LIST MLSD MLST NLST SIZE>
AllowAll
</Limit>

TestUploader.conf(注意自定义上传目录)

<Directory /path/to/TestUploader/uploads>

<snip>

<Limit LOGIN>
AllowGroup uploader-testuploader }}
Deny ALL
</Limit>

<snip>

<Limit LIST MLSD MLST NLST SIZE>
AllowAll
</Limit>

我完成此任务的失败尝试是:

- name: Copy in the configs for various labs
  template:
    src: conf.d.j2
    dest: "/etc/proftpd/conf.d/{{ item.initials }}.conf"
    mode: '0644'
    owner: root
    group: root
  with_dict: "{{ uploaders }}"

在创建这些配置文件的同时,维护可用于其他 playbook 的事实来源时,每个人的最佳建议是什么?(我们处于 ansible 过程的早期阶段,因此可以更改结构。我关心的是尽可能前瞻性地考虑可扩展性。

谢谢!

循环 ansible ansible-template

评论


答:

1赞 user17330997 9/29/2023 #1

好吧,事实证明我非常接近。

需要进行两项更改:

  1. 我的任务需要“循环”而不是“with_dict”。
- name: Copy in the configs for various labs
  template:
    src: conf.d.j2
    dest: "/etc/proftpd/conf.d/{{ item.initials }}.conf"
    mode: '0644'
    owner: root
    group: root
  loop: "{{ uploaders }}"
  1. 我的模板需要访问带有“item.”前缀的变量:
{% if item.ftps_upload_directory is defined %}
<Directory {{ item.ftps_upload_directory }}>
{% else %}
<Directory /path/to/{{ item.initials|upper }}/uploads>
{% endif %}

我的剧本现在可以正常工作了。