it-swarm.com.de

Ansible: Stdout des Befehls in neuer Variable speichern?

In meinem Playbook möchte ich eine Variable erstellen, die die Ausgabe eines externen Befehls enthält. Anschließend möchte ich diese Variable in einigen Vorlagen verwenden.

Hier sind die relevanten Teile des Spielbuchs:

  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

und sagen wir mal das ist meine vorlage:

[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

(Beachten Sie den {{ string_to_echo }})

Ich suche also grundsätzlich nach einer Möglichkeit, den Inhalt von command_output.stdout (Der während der ersten Aufgabe generiert/abgerufen wird) in einer neuen Variablen string_to_echo Zu speichern.
Diese Variable möchte ich anschließend in mehreren Vorlagen verwenden.

Ich denke, ich könnte einfach {{command_output.stdout}} In meinen Vorlagen verwenden, aber ich möchte dieses .stdout Aus Gründen der Lesbarkeit entfernen.

64
Forivin

Sie müssen den Inhalt als Fakt speichern :

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

Es besteht keine Notwendigkeit, eine Tatsache festzulegen.

    - Shell: cat "hello"
      register: cat_contents

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

Eine geringfügige Änderung, die über die Antwort von @udondan hinausgeht. Ich verwende die registrierten Variablennamen gerne mit dem set_fact, um die Unordnung auf ein Minimum zu beschränken.

Wenn ich mich also mit der Variablen psk registrieren würde, würde ich denselben Variablennamen beim Erstellen der set_fact.

Beispiel

- 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

Dann, wenn ich es laufen lasse:

$ 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

Wenn Sie einen komplexen Befehl zum Vergleichen von Textergebnissen speichern möchten, um beispielsweise die Version des Betriebssystems zu vergleichen, kann dies möglicherweise hilfreich sein:

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

Ich bin ein Neuling in Ansible, aber ich würde die nächste Lösung vorschlagen:

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

Es sollte funktionieren (und funktioniert für mich), da Ansible eine verzögerte Auswertung verwendet. Aber es scheint, dass es die Gültigkeit vor dem Start überprüft, also muss ich command_output_full.stdout In vars definieren.

Und natürlich wird es hässlich aussehen, wenn es im Abschnitt vars zu viele solcher Variablen gibt.

4
Dmitry