2016-03-17 12 views
21

All'interno del mio playbook mi piacerebbe creare una variabile che trattiene l'output di un comando esterno. Successivamente voglio utilizzare questa variabile in un paio di modelli.Ansible: Store stdout del comando nella nuova variabile?

Ecco le parti pertinenti del Playbook:

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 

e diciamo che questo è il mio modello:

[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 

(notare il {{ string_to_echo }})

Quindi quello che sto praticamente cercare è un modo per memorizzare il contenuto di command_output.stdout (che viene generato/recuperato durante la prima attività) in una nuova variabile string_to_echo.
Quella variabile mi piacerebbe utilizzare in più modelli in seguito.

Immagino di poter usare solo {{command_output.stdout}} nei miei modelli, ma voglio liberarmi di quella risoluzione .stdout.

risposta

18

Non c'è bisogno di impostare un dato di fatto.

- shell: cat "hello" 
     register: cat_contents 

    - shell: echo "I cat hello" 
     when: cat_contents.stdout == "hello" 
3

Sono un novizio in Ansible, ma vorrei suggerire soluzione successiva:

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

Si dovrebbe funzionare (e lavora per me) perché Ansible usa valutazione pigra . Ma sembra che controlli la validità prima del lancio, quindi devo definire command_output_full.stdout in vars.

E, naturalmente, se si tratta di troppi tali vars nella sezione vars, apparirà brutto.

0

In caso di quanto si desidera memorizzare un comando complesso per confrontare risultato del testo, ad esempio, per confrontare la versione del sistema operativo, forse questo può aiutare:

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 
Problemi correlati