Ansible: escriba la salida de varias líneas en el archivo
(2)
Estoy usando ansible para recopilar información de nodos remotos y luego usaré esta información para actualizar los RPM relevantes.
El problema que tengo es el número de versión de la colección de varias aplicaciones y escribirlas en un archivo.
Libro de jugadas:
---
- name: Check Application Versions
hosts: kubernetes
tasks:
- name: Check K8S version.
shell: kubectl --version
register: k8s_version
- debug: msg="{{ k8s_version.stdout }}"
Archivo de inventario:
[kubernetes]
172.29.219.102
172.29.219.105
172.29.219.104
172.29.219.103
Salida:
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"
}
La parte anterior es simple y funciona. Ahora quiero escribir la salida al archivo.
Ahora estoy tratando de escribir esta información en un archivo. Quiero algo como:
Kubernetes v1.4.0 Kubernetes v1.4.0 Kubernetes v1.4.0 Kubernetes v1.4.0
Entonces agregué la siguiente línea:
- local_action: copy content={{ k8s_version.stdout_lines }} dest=/tmp/test
Mi
/tmp/test
ve así:
# cat /tmp/test
["Kubernetes v1.4.0"]
Aquí solo hay un valor.
Intenté hacer algo diferente entonces.
- local_action: lineinfile dest=/tmp/foo line="{{ k8s_version.stdout }}" insertafter=EOF
Esto resultó en:
# cat /tmp/foo
Kubernetes v1.4.0
Estoy tratando de entender por qué solo veo un valor, mientras que debería ver las versiones de cada nodo en mi archivo de inventario. ¿Qué estoy haciendo mal?
Qué estoy haciendo mal ?
lineinfile
módulo
lineinfile
no realiza la acción "agregar una línea a un archivo", sino que garantiza que una línea determinada esté presente en el archivo.
Si todos sus nodos de destino tienen la misma versión, no agregará la misma línea varias veces.
Por otro lado, el módulo de
copy
sobrescribía el archivo.
Si necesita registrar valores para todos los hosts, puede crear, por ejemplo, una plantilla que
kubernetes
los hosts en el grupo
kubernetes
:
- copy:
content: "{% for host in groups.kubernetes %}{{ hostvars[host].k8s_version }}/n{% endfor %}"
dest: /tmp/test
delegate_to: localhost
run_once: true
Otra forma sería extraer los valores con
map
de
hostvars
, pero dado que desea los valores solo del grupo de hosts
kubernetes
, no estoy seguro de que sea más bonito.
Y tener un
for
en la plantilla le permite agregar fácilmente nombres de host.
De acuerdo con este post
Resultado de registro ansible de múltiples comandos
su variable deseada está en
k8s_version.results
Para acceder a ella, debe trabajar con una plantilla en la que simplemente la repita:
- local_action: template src=my_nodes.j2 dest=/tmp/test
Y las plantillas de
templates/my_nodes.j2
:
{% for res in k8s_version.results %}
{{ res.stdout }}
{% endfor %}
El libro de jugadas completo sería:
---
- 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