2017-01-16 62 views
4

我在使用Ansible角色NFS时遇到问题。在Ansible库存中动态构建字符串

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

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

部分虚拟机将在完成工作负载后终止并退出。我们将重新运行包括NFS角色的剧本来更新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)" 

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

我需要动态地在列表'nfs_exports'中建立字符串。所以如果有一个VM,'nfs_exports'中只有一个客户端。如果有多个虚拟机,所有的虚拟机都应该自动包含在'nfs_exports'中。

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

回答

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)" 
    ] 
} 
+0

我已经验证你的代码,它工作正常。非常感谢! –