2017-01-16 78 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

我已經驗證你的代碼,它工作正常。非常感謝! –