在Ansible清单中动态构建字符串

时间:2017-01-16 09:38:35

标签: ansible ansible-playbook nfs nfsclient

当我使用Ansible角色NFS时,我有一个问题。

NFS角色: https://github.com/geerlingguy/ansible-role-nfs

我的情况是这样的:我们将创建一个NFS客户端的VM列表。我们需要在NFS服务器上进行访问控制。因此,我们根据上述角色在Ansible清单中设置了一个名为'nfs_exports'的列表。

部分虚拟机将在完全工作负载后终止并停用。我们将重新运行包含NFS角色的playbook来更新NFS服务器设置。因此,有一个主机组'client_group',主机的数量是可变的。

如果有一个VM,则nfs_exports列表将为:

nfs_clients: "{{ groups['client_group'] }}"
nfs_exports:
- "{{ nfs_dirs[0] }}  {{ nfs_clients[0] }}(rw)"
- "{{ nfs_dirs[1] }}  {{ nfs_clients[0] }}(ro)"

如果有两个虚拟机,

nfs_clients: "{{ groups['client_group'] }}"
nfs_exports:
- "{{ nfs_dirs[0] }}  {{ nfs_clients[0] }}(rw) {{ nfs_clients[1] }}(rw)"
- "{{ nfs_dirs[1] }}  {{ nfs_clients[0] }}(ro) {{ nfs_clients[1] }}(ro)"

如果有三个虚拟机,

nfs_clients: "{{ groups['client_group'] }}"
nfs_exports:
- "{{ nfs_dirs[0] }}  {{ nfs_clients[0] }}(rw) {{ nfs_clients[1] }}(rw) {{ nfs_clients[2] }}(rw)"
- "{{ nfs_dirs[1] }}  {{ nfs_clients[0] }}(ro) {{ nfs_clients[1] }}(ro) {{ nfs_clients[2] }}(ro)"

这在我们的案例中并不好。因为每次VM的数量发生变化,我都需要手动更改'nfs_exports'。

我需要动态地在列表'nfs_exports'中构建字符串。因此,如果有一个VM,'nfs_exports'中只有一个客户端。如果有多个虚拟机,则所有虚拟机都应自动包含在“nfs_exports”中。

任何人都可以提供有关在'nfs_exports'中构建字符串的解决方案,而不是在'client_group'更改时手动更改'nfs_exports'吗?

1 个答案:

答案 0 :(得分:4)

你走了:

- hosts: localhost
  gather_facts: no
  vars:
    nfs_clients:
      - server1
      - server2
      - server3
    nfs_dirs:
      - path1
      - path2
    nfs_exports:
      - "{{ nfs_dirs[0] }} {{ ' '.join(nfs_clients | map('regex_replace','$','(rw)')) }}"
      - "{{ nfs_dirs[1] }} {{ ' '.join(nfs_clients | map('regex_replace','$','(ro)')) }}"
  tasks:
    - debug: var=nfs_exports

输出:

ok: [localhost] => {
    "nfs_exports": [
        "path1 server1(rw) server2(rw) server3(rw)",
        "path2 server1(ro) server2(ro) server3(ro)"
    ]
}