ansible

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