2017-09-18 87 views
0

我在物理主機上調配了一堆系統(VM)。我一直在VM的運行階段。現在我需要通過他們的DHCP地址登錄虛擬機。我可以從服務器上獲取IP地址,但我需要一種將這些設置爲host_vars的方法。這裏是我組:Play劇本中的Ansible動態變量

ok: [kvm01] => { 
    "msg": { 
     "all": [ 
      "kvm01", 
      "dcos-master-1", 
      "dcos-agent-1", 
      "dcos-agent-2", 
      "dcos_bootstrap" 
     ], 
     "dcos": [ 
      "dcos-master-1", 
      "dcos-agent-1", 
      "dcos-agent-2", 
      "dcos_bootstrap" 
     ], 
     "dcos-agents": [ 
      "dcos-agent-1", 
      "dcos-agent-2" 
     ], 
     "dcos-bootstraps": [ 
      "dcos_bootstrap" 
     ], 
     "dcos-masters": [ 
      "dcos-master-1" 
     ], 
     "kvm": [ 
      "kvm01" 
     ], 
     "ungrouped": [] 
    } 
} 

這裏是我的命令:

- name: Get the IP of the VM (DHCP) 
    command: "/getip.sh {{ item }}" 
    register: "result" 
    with_items: "{{ groups['dcos'] }}" 

- name: List the output of the variables 
    debug: msg="{{item.stdout}}" 
    with_items: "{{result.results}}" 

當我運行的劇本,我得到的結果,但他們的命令,而不是標準輸出的完整JSON結果。可能有一種方法可以提取標準輸出並將其分配給一個事實,但它是一個複雜的散列。這是最後的結果:

TASK [vm_install : Get the IP of the VM (DHCP)] *************************************************************************** 
changed: [kvm01] => (item=dcos-master-1) 
changed: [kvm01] => (item=dcos-agent-1) 
changed: [kvm01] => (item=dcos-agent-2) 
changed: [kvm01] => (item=dcos_bootstrap) 

TASK [vm_install : List the output of the variables] ********************************************************************** 
...... 
    ok: [kvm01] => (item={'_ansible_parsed': True, 'stderr_lines': [u'] => { 
    "item": { 
     "changed": false, 
     "cmd": [ 
      "/getip.sh", 
      "dcos_bootstrap" 
     ], 
     "delta": "0:00:00.056193", 
     "end": "2017-09-18 15:45:45.409693", 
     "invocation": { 
      "module_args": { 
       "_raw_params": "/getip.sh dcos_bootstrap", 
       "_uses_shell": false, 
       "chdir": null, 
       "creates": null, 
       "executable": null, 
       "removes": null, 
       "warn": true 
      } 
     }, 
     "item": "dcos_bootstrap", 
     "rc": 0, 
     "start": "2017-09-18 15:45:45.353500", 
     "stderr": " ", 
     "stdout": "192.168.1.130", 
     "stdout_lines": [ 
      "192.168.1.130" 
     ] 
    }, 
    "msg": "192.168.1.130" 
} 

如何將命令的輸出放入數組中,以便稍後在我的playbook中使用它?

+1

重新讀取ansible文檔有關[循環和註冊(https://docs.ansible.com /ansible/latest/playbooks_loops.html#using-register-with-a-loop),看看是否有幫助。你的第二個任務需要遍歷第一個任務的結果(和「register:」{{item}}。ip'可能是錯誤的;你需要註冊一個簡單的命名變量,比如'register:hostips'。 – larsks

+0

我已經更新了我的問題,做了一些調試後,實際得到了一個結果。我現在的問題是,我回來的結果不是標準輸出...它是完整的結果數據從ansible轉儲。顯然,我只想要什麼從命令返回 –

+0

不,你得到了你想要的東西,看看你的輸出結果的底部,在那裏你看到「msg」:「192.168.1.130」'這就是調試的「輸出」 '任務(也就是'msg:'鍵的結果),你看到的其他東西都是調試信息,可以忽略,我想你已經全部設置好了 – larsks

回答

1

所以,就像我在我的評論中所說的,你已經設法將你想要的信息提取到一個數組中。可以遍歷使用with_items在後續的任務,將每一個主機創建ip_address這些項目:

- set_fact: 
    ip_address: "{{ item.stdout }}" 
    with_items: "{{ results.results }}" 
    delegate_to: "{{ item.item }}" 
    delegate_facts: true 

或者你可以創建一個包含所有使用神社過濾器的地址的單個陣列:

- set_fact: 
    all_ip_addresses: "{{ results.results|map(attribute='stdout')|list }}" 

或者你可以創建一個具有相同信息的字典:

- set_fact: 
    all_ip_addresses: > 
     {{ all_ip_addresses 
     |default({}) 
     |combine({ item.item: item.stdout })}} 
    with_items: "{{ results.results }}" 
+0

這是一個很好的開始。是否有可能將結果映射到主機名和相關IP的散列? –

+1

看我的更新重新:創建字典。 – larsks

+0

太棒了!正是我在找什麼! –