2016-12-05 65 views
2

所以我有點卡在一個問題上。從本質上講,我想運行一個嵌套循環與列表和字典,我似乎無法弄清楚如何。與列表和字典的嵌套循環

我的用例正在運行一個劇本,該劇本將通過使用主體列表簽署公鑰來生成SSH證書。

我有一個作爲跳轉主機的主機列表(組名稱爲bastionHosts)。這些主機上有最終用戶和他們的SSH密鑰對。

[bastionHosts] 
10.100.0.10 
10.100.0.11 

我還有一個用戶及其SSH主體字典。這本字典是這樣的:

users: 
    webuser01: "webservers-principal" 
    dbuser01: "dbservers-principal" 
    webadmin01: "webservers-principal" 

我使用提取模塊下載公鑰(「id_ecdsa.pub」爲每個用戶這將創建一個看起來像一個目錄結構:「/ tmp目錄/ public_keys/<> /家庭/ < <用戶名>> /。SSH/id_ecdsa.pub

例如,獲取公共密鑰webuser01在堡壘10.100.0.10將放置鑰匙插入/tmp/public_keys/10.100.0.10/home/webuser01 /.ssh/id_ecdsa.pub在主機上。

我的目標是緩存到這個目錄結構中用適當的校長簽署每個公鑰,但我無法弄清楚如何做到這一點。

如果我只是獲取一組文件並且它是一個平面提取(即每個主機的目錄結構未被使用),那麼下面的代碼將起作用。 item.key是用戶名,item.value是主體集合。

- name: create signed certificates with appropriate principals 
    command: ssh-keygen -s /etc/ssh/CA/CA -I {{ item.key }} -n {{ item.value }} -V +1d /tmp/public_keys/{{ item.key }}.pub 
    with_dict: 
    "{{ users }}" 

我需要一種方法來同時指定由主機內置的groups.bastionHosts,這樣我可以遍歷下面的代碼目錄structure.The是什麼,我希望做一個粗略的想法,但我找不到一種方法來獲取with_nested以處理列表和字典。

- name: create signed certificates with appropriate principals 
    command: ssh-keygen -s /etc/ssh/CA/CA -I {{ item.key }} -n {{ item[1].value }} -V +1d /tmp/public_keys/{{ item[0] }}/home/{{ item[1].key }}/.ssh/id_ecdsa.pub 
    with_nested: 
    - "{{ groups.bastionHosts }} 
    - "{{ users }}" 

本質上,如果上述工作,這將走到每個目錄的每個堡壘主機(item0)和用戶(項目[1]的.key)並簽署與合適的主體的關鍵(項目[1 ]。值)。但是,這不起作用。我得到的錯誤是項目[1]沒有元素「值」。我想這是因爲with_nested應該用於列表,而不是字典。

所以基本上:有沒有辦法讓with_nested處理字典和列表,這樣我可以引用列表的元素,同時引用字典中的項目?如果沒有,我是否可能讓這個過於複雜,有一個更簡單的方法?提前致謝!

回答

3

有一個黑客在那裏:你可以做一個列表從dict dictsort過濾器:

- hosts: localhost 
    gather_facts: no 
    vars: 
    bastionHosts: 
     - 10.100.0.10 
     - 10.100.0.11 
    users: 
     webuser01: "webservers-principal" 
     dbuser01: "dbservers-principal" 
     webadmin01: "webservers-principal" 
    tasks: 
    - debug: msg="Host={{item.0}} User.Key={{item.1}} User.Value={{item.2}}" 
     with_nested: 
     - "{{ bastionHosts }}" 
     - "{{ users | dictsort }}" 
+0

這是一個黑客攻擊的一位,但它完美地工作。謝謝! –