Ansible - 将多行输出写入文件

时间:2017-07-11 13:02:07

标签: ansible

我使用ansible从远程节点收集信息,然后使用此信息更新相关的RPM。

我遇到的问题是各种应用程序的集合版本号,并将它们写入文件。

Playbook:

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

以上部分简单而有效。现在我想将输出写入文件。

现在我试图将这些信息写入文件。我想要类似的东西:

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

我试图找出为什么我只看到一个值,而我应该看到我的库存文件中每个节点的版本。我究竟做错了什么?

2 个答案:

答案 0 :(得分:2)

  

我做错了什么?

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 :(得分:1)

根据这篇文章

Ansible register result of multiple commands

您所需的变量位于db=> \z pg_catalog.pg_index; Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies ------------+----------+-------+-------------------------+------------------ -+---------- pg_catalog | pg_index | table | =r/postgres +| | | | | report=arwdDxt/postgres | | (1 row) 要访问它,您需要使用模板,只需迭代它:

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 %}
相关问题