【问题标题】:Templating multiple yum .repo files with Ansible template module使用 Ansible 模板模块模板化多个 yum .repo 文件
【发布时间】:2015-04-14 12:44:54
【问题描述】:

我正在尝试模板化 yum .repo 文件。我们有多个内部和外部 yum 存储库,我们管理的各种主机可能使用也可能不使用。

我希望能够指定任意数量的存储库以及它们将被模板化的 .repo 文件。将这些存储库分组在同一个 .repo 文件中是有意义的,因为它们具有共同的目的(例如所有 centos 存储库)

我无法确定如何结合 ansible、yaml 和 j2 来实现这一点。我尝试使用 ansible 'with_items'、'with_subelements' 和 'with_dict' 失败。

YAML 数据

yum_repo_files:
- centos:
  - name: base
    baseurl: http://mirror/base
  - name: updates
    baseurl: http://mirror/updates
- epel:
  - name: epel
    baseurl: http://mirror/epel

Ansible 任务

- name: create .repo files
  template: src=yumrepos.j2 dest="/etc/yum.repos.d/{{ item }}.repo"
  with_items: yum_repo_files

j2 模板

{% for repofile in yum_repo_files.X %} {# X being the relative index for the current repofile, e.g. centos = 0 and epel = 1 #}
{% for repo in repofile %}
name={{ repo.name }}
baseurl={{ repo.baseurl }}
{% endfor %}
{% endfor %}

【问题讨论】:

标签: jinja2 ansible ansible-playbook


【解决方案1】:

当您将 with_items 与模板模块一起使用时,特殊变量 item 将被传递到您的 jinja 模板中。

试试这个:

{% for repofile in item %} 
{% for repo in repofile %}
name={{ repo.name }}
baseurl={{ repo.baseurl }}
{% endfor %}
{% endfor %}

【讨论】:

  • 感谢您提供此信息。我似乎在 ansible 文档中的任何地方都找不到它。
【解决方案2】:

user24364 的回答帮助解决了一半的问题,然后我使用了一些 python 方法从列表和字典中获取正确的数据。

提供完整的文件名“centos.repo”而不是“centos”简化了逻辑(并且与其他任务的逻辑更好地对齐):

yum_repo_files:
- centos.repo:
  - name: base
    baseurl: http://mirror/base
  - name: updates
    baseurl: http://mirror/updates
- epel.repo:
  - name: epel
    baseurl: http://mirror/epel

.iterkeys() 和 .next() 方法用于项目以从 dicts 列表中获取 repo 文件名:

- name: create .repo files
  template: src=yumrepos.j2 dest="/etc/yum.repos.d/{{item.iterkeys().next()}}"
  with_items: yum_repo_files

.itervalues() 方法用于获取包含每个给定 repo 的所有键/值的字典列表:

{% for repofile in item.itervalues() %}
{% for repo in repofile %}
[{{repo.repo}}]
name={{ repo.name }}
baseurl={{ repo.baseurl }}
{% endfor %}
{% endfor %}

我还添加了一些其他任务来清理非托管文件等。一旦我清理了代码,我会将其发布到 ansible Galaxy,因为似乎没有其他人担任过这样的角色。

【讨论】:

    【解决方案3】:

    您的文件将被命名为:*.repo.j2;然后,您可以使用 fileglob:

    - name: create x template
    - template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
    - with_fileglob:
      - files/*.j2
    

    参考:

    https://serverfault.com/questions/578544/deploying-a-folder-of-template-files-using-ansible

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多