使用Ansible模板模板模板化多个yum .repo文件

时间:2014-08-21 04:15:44

标签: jinja2 ansible ansible-playbook

我正在尝试模板yum .repo文件。我们有多个内部和外部yum回购,我们管理的各种主机可能会或可能不会使用。

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

我无法确定如何组合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

安排任务

- 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 %}

3 个答案:

答案 0 :(得分:1)

当您对模板模块使用with_items时,特殊变量item将传递到您的jinja模板。

试试这个:

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

答案 1 :(得分:1)

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

给出完整的文件名'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()方法从repts列表中获取repo文件名:

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

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

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

我还添加了一些其他任务来清理非托管文件等。一旦我对代码进行了清理,我就会把它发布到ansible galaxy,因为似乎没有其他人可以共享这样的角色。

答案 2 :(得分:0)

您的文件名称为:* .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