2017-07-11 231 views
1

我使用ansible從遠程節點收集信息,然後使用此信息更新相關的RPM。Ansible - 將多行輸出寫入文件

我遇到的問題是各種應用程序的集合版本號並將它們寫入文件。

劇本:

--- 
    - name: Check Application Versions 
    hosts: kubernetes 
    tasks: 
     - name: Check K8S version. 
     shell: kubectl --version 
     register: k8s_version 

     - debug: msg="{{ k8s_version.stdout }}" 

庫存文件:

[kubernetes] 
172.29.219.102 
172.29.219.105 
172.29.219.104 
172.29.219.103 

輸出:

TASK [debug] ******************************************************************* 
ok: [172.29.219.102] => { 
    "msg": "Kubernetes v1.4.0" 
} 
ok: [172.29.219.103] => { 
    "msg": "Kubernetes v1.4.0" 
} 
ok: [172.29.219.105] => { 
    "msg": "Kubernetes v1.4.0" 
} 
ok: [172.29.219.104] => { 
    "msg": "Kubernetes v1.4.0" 
} 

上面部分是簡單和作品。現在我想將輸出寫入文件。

現在我嘗試將此信息寫入一個file.I想是這樣的:

所以我添加

Kubernetes V1.4.0 Kubernetes V1.4.0 Kubernetes V1.4.0 Kubernetes V1.4.0下面一行:

- local_action: copy content={{ k8s_version.stdout_lines }} dest=/tmp/test 

/tmp/test樣子:

# cat /tmp/test 
["Kubernetes v1.4.0"] 

這裏只有一個值。

我試圖做一些不同的事情。

- local_action: lineinfile dest=/tmp/foo line="{{ k8s_version.stdout }}" insertafter=EOF 

這導致:

# cat /tmp/foo 
Kubernetes v1.4.0 

我試着去弄清楚爲什麼我只看到一個值,而我看到在我的清單文件中的每個節點的版本。我究竟做錯了什麼?

+0

複製模塊覆蓋該文件內容 – Luv33preet

回答

1

我在做什麼錯?

lineinfile模塊不執行「向文件添加行」操作,而是確保文件中存在給定的行。如果所有目標節點都具有相同的版本,則不會多次添加同一行。

另一方面,copy模塊覆蓋該文件。


如果您需要爲所有主機寄存器的值,例如,您可以創建一個模板,這將遍歷主機kubernetes組:

- copy: 
    content: "{% for host in groups.kubernetes %}{{ hostvars[host].k8s_version }}\n{% endfor %}" 
    dest: /tmp/test 
    delegate_to: localhost 
    run_once: true 

另一種方法是用提取值maphostvars,但由於您只需要kubernetes主機組的值,我不確定它會更漂亮。在模板中使用for可讓您輕鬆添加主機名。

1

根據這個帖子

Ansible register result of multiple commands

你想要的變量是k8s_version.results要訪問它,你需要用一個模板的工作,你只遍歷它:

- local_action: template src=my_nodes.j2 dest=/tmp/test 

而且模板templates/my_nodes.j2

{% for res in k8s_version.results %} 
    {{ res.stdout }} 
{% endfor %} 
然後至210

完整的劇本將是:

--- 
    - name: Check Application Versions 
    hosts: kubernetes 
    tasks: 
     - name: Check K8S version. 
     shell: kubectl --version 
     register: k8s_version 

     - local_action: template src=my_nodes.j2 dest=/tmp/test 
+0

這將覆蓋該文件以同樣的方式'copy'模塊一樣。另一個答案中的示例將該值註冊到「with_'循環中。這個問題中的例子沒有。 – techraf

+0

即:它會覆蓋,但實際上不會有機會。由於密鑰未定義,它會首先失敗。 – techraf