5 ansible
我正在使用 ansible 从远程节点收集信息,然后将使用此信息更新相关的 RPM。
我遇到的问题是各种应用程序的集合版本号并将它们写入文件。
剧本:
---
- name: Check Application Versions
hosts: kubernetes
tasks:
- name: Check K8S version.
shell: kubectl --version
register: k8s_version
- debug: msg="{{ k8s_version.stdout }}"
Run Code Online (Sandbox Code Playgroud)
库存文件:
[kubernetes]
172.29.219.102
172.29.219.105
172.29.219.104
172.29.219.103
Run Code Online (Sandbox Code Playgroud)
输出:
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"
}
Run Code Online (Sandbox Code Playgroud)
上面的部分很简单并且有效。现在我想将输出写入文件。
现在我正在尝试将此信息写入文件。我想要类似的东西:
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
Run Code Online (Sandbox Code Playgroud)
我的/tmp/test样子:
# cat /tmp/test
["Kubernetes v1.4.0"]
Run Code Online (Sandbox Code Playgroud)
这里只有一个值。
我当时尝试做一些不同的事情。
- local_action: lineinfile dest=/tmp/foo line="{{ k8s_version.stdout }}" insertafter=EOF
Run Code Online (Sandbox Code Playgroud)
这导致:
# cat /tmp/foo
Kubernetes v1.4.0
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚为什么我只看到一个值,而我应该在我的清单文件中看到每个节点的版本。我究竟做错了什么?
我究竟做错了什么 ?
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
Run Code Online (Sandbox Code Playgroud)
map另一种方法是使用from提取值hostvars,但考虑到您只需要来自主机组的值kubernetes,我不确定它会更漂亮。模板中的for可以让您轻松添加主机名。