我正在尝试通过使用 Ansible 生成 /etc/exports 文件来动态配置系统中的多个 NFS 服务器。我希望能够使用 jinja2 模板来做到这一点。这是我根据导出列表无法确定的 jinja2 模板。
我在我的 nfs 角色中定义了以下变量:
site_nfs_servers: ['ansibletarget1', 'ansibletarget2']
exports:
- server: "ansibletarget1"
shares:
- path: "/my/first/share/path"
client: "*"
options: "rw,sync"
- path: "/my/second/share/path"
client: "*"
options: "rw,sync,root_squash"
- server: "ansibletarget2"
shares:
- path: "/another/shared/path/different/server"
client: "*"
options: "ro,sync"
然后我有以下 ansible play 来生成模板:
- name: Generate the exports file.
template:
src: exports.j2
dest: /etc/exports
owner: root
group: root
mode: '0750'
我的模板目前看起来像这样:
{% for export in exports %}
{% if ansible_hostname in export.server %}
{% for share in shares %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}
{% endif %}
{% endfor %}
我认为我离正确的模板结构还差得很远。到底是如何遍历这个列表的?
export
您在第二个循环中缺少对 the 的引用。但是,最好在主机变量中定义共享,如 Vladimir 的回答所示。
创建库存
并将股份放入host_vars
为测试创建一个简化的角色
然后,使用清单组和剧本中的角色
运行剧本并创建文件
请参阅示例 Ansible 设置。
如果您想将共享保留在一个对象中,请将列表放入groups_vars中。为了简化代码,将列表转换为字典。例如,您可以使用community.general.groupby_as_dict
给
然后修改模板。这应该创建与以前相同的文件。