2017-07-11 22 views
1

私はリモートノードから情報を収集するのに援助し、この情報を使用して関連するRPMを更新します。不可能 - 複数行の出力をファイルに書き込む

私が抱えている問題は、さまざまなアプリケーションのコレクションバージョン番号とファイルへの書き込みです。

脚本:

--- 
    - 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 1.4.0 Kubernetes 1.4.0 Kubernetes 1.4.0 Kubernetes 1.4.0

をだから私は追加下の行:

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

マイ/tmp/testは、次のようになります。

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

ここには1つの値しかありません。

私は別の何かをしようとしました。私は私のインベントリ・ファイル内のすべてのノードのバージョンが表示されるはずのに対し、私は一つの値だけを参照してください理由を理解しようと

# cat /tmp/foo 
Kubernetes v1.4.0 

イム:

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

これがでました。私は間違って何をしていますか?

+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 

もう一つの方法は、との値を抽出することであろうがmapからhostvarsまでですが、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 %} 

完全な脚本は、次のようになります。

--- 
    - 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

関連する問題