我正在尝试模板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 %}
答案 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