web-dev-qa-db-fra.com

Ansible: Enregistrer la sortie standard de la commande dans une nouvelle variable?

Dans mon classeur, j'aimerais créer une variable contenant la sortie d'une commande externe. Ensuite, je veux utiliser cette variable dans quelques modèles.

Voici les parties pertinentes du livre de jeu:

  tasks:
    - name: Create variable from command
      command: "echo Hello"
      register: command_output
    - debug: msg="{{command_output.stdout}}"

    - name: Copy test service
      template: src=../templates/test.service.j2 dest=/tmp/test.service
    - name: Enable test service
      Shell: systemctl enable /tmp/test.service
    - name: Start test service
      Shell: systemctl start test.service

et disons que ceci est mon modèle:

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo {{ string_to_echo }}; sleep 1; done"

[Install]
WantedBy=multi-user.target

(Remarquez le {{ string_to_echo }})

Donc, ce que je recherche fondamentalement, c'est un moyen de stocker le contenu de command_output.stdout (qui est généré/récupéré lors de la première tâche) dans une nouvelle variable string_to_echo.
Cette variable que je voudrais utiliser dans plusieurs modèles par la suite.

Je suppose que je pourrais simplement utiliser {{command_output.stdout}} dans mes modèles, mais je veux me débarrasser de ce .stdout pour plus de lisibilité.

64
Forivin

Vous devez stocker le contenu en tant que fait :

- set_fact:
    string_to_echo: "{{ command_output.stdout }}"
69
udondan

Il n'y a pas besoin de définir un fait.

    - Shell: cat "hello"
      register: cat_contents

    - Shell: echo "I cat hello"
      when: cat_contents.stdout == "hello"
46
Karel Striegel

Une légère modification au-delà de la réponse de @ udondan. J'aime réutiliser les noms de variable enregistrés avec le set_fact pour aider à réduire l'encombrement au minimum.

Donc, si je devais m'inscrire en utilisant la variable psk, j'utiliserais le même nom de variable pour créer le set_fact.

Exemple

- name: generate PSK
  Shell: openssl Rand -base64 48
  register: psk
  delegate_to: 127.0.0.1
  run_once: true

- set_fact: 
    psk={{ psk.stdout }}

- debug: var=psk
  run_once: true

Puis quand je le lance:

$ ansible-playbook -i inventory setup_ipsec.yml

 PLAY                                                                                                                                                                                [all] *************************************************************************************************************************************************************************

 TASK [Gathering                                                                                                                                                                     Facts] *************************************************************************************************************************************************************
 ok: [hostc.mydom.com]
 ok: [hostb.mydom.com]
 ok: [hosta.mydom.com]

 TASK [libreswan : generate                                                                                                                                                          PSK] ****************************************************************************************************************************************************
 changed: [hosta.mydom.com -> 127.0.0.1]

 TASK [libreswan :                                                                                                                                                                   set_fact] ********************************************************************************************************************************************************
 ok: [hosta.mydom.com]
 ok: [hostb.mydom.com]
 ok: [hostc.mydom.com]

 TASK [libreswan :                                                                                                                                                                   debug] ***********************************************************************************************************************************************************
 ok: [hosta.mydom.com] => {
     "psk": "6Tx/4CPBa1xmQ9A6yKi7ifONgoYAXfbo50WXPc1kGcird7u/pVso/vQtz+WdBIvo"
 }

 PLAY                                                                                                                                                                                RECAP *************************************************************************************************************************************************************************
 hosta.mydom.com    : ok=4    changed=1    unreachable=0    failed=0
 hostb.mydom.com    : ok=2    changed=0    unreachable=0    failed=0
 hostc.mydom.com    : ok=2    changed=0    unreachable=0    failed=0
9
slm

Si vous souhaitez stocker une commande complexe pour comparer le résultat du texte, par exemple, pour comparer la version du système d'exploitation, cela peut peut-être vous aider:

tasks:
       - Shell: echo $(cat /etc/issue | awk {'print $7'})
         register: echo_content

       - Shell: echo "It works"
         when: echo_content.stdout == "12"
         register: out
       - debug: var=out.stdout_lines
5
BrennQuin

Je suis un débutant dans Ansible, mais je suggérerais la solution suivante:

playbook.yml

...
vars:
  command_output_full:
    stdout: will be overriden below
  command_output: {{ command_output_full.stdout }}
...
...
...
tasks:
  - name: Create variable from command
    command: "echo Hello"
    register: command_output_full
  - debug: msg="{{ command_output }}"

Cela devrait fonctionner (et fonctionne pour moi) car Ansible utilise l'évaluation paresseuse. Mais il semble que cela vérifie la validité avant le lancement, je dois donc définir command_output_full.stdout en vars.

Et, bien sûr, s'il y a trop de tels vars dans la section vars, cela aura l'air moche.

4
Dmitry