2016-03-17 21 views
21

Oyun kitabımın içinde harici bir komutun çıkışını tutan bir değişken oluşturmak istiyorum. Daha sonra bu değişkeni birkaç şablonda kullanmak istiyorum. İşte Ansible: Komutun stdout'unu yeni değişkende mi saklıyorsunuz?

başucu kitabının ilgili kısımları şunlardır:

[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 

Temelde değilim Peki

({{ string_to_echo }} edin):

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 

ve diyelim ki bu benim şablon Ardından, string_to_echo numaralı yeni bir değişkendeki command_output.stdout (ilk görev sırasında oluşturulan/alınan) içeriğini saklamanın bir yolu vardır.
Bu değişken sonradan birden çok şablonda kullanmak istiyorum.

Şablonlarımda sadece {{command_output.stdout}} kullanabilirim, ancak okunabilirlik için .stdout'dan kurtulmak istiyorum.

cevap

18

bir gerçeği ayarlamak için gerek yoktur.

- shell: cat "hello" 
     register: cat_contents 

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

Ben yanıtlayıcı 'bir acemi değilim, ama bir sonraki çözüm öneriyoruz: yanıtlayıcı' tembel değerlendirme kullanması nedeniyle

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

Bu işe (ve benim için çalışıyor) olmalıdır

playbook.yml . Ama lansman öncesi geçerliliği kontrol ediyor gibi görünüyor, bu yüzden vars içinde command_output_full.stdout tanımlamalıyım.

Ve tabii ki, vars bölümünde bu kadar çok var ise, çirkin görünecektir.

0

Eğer OS sürümü karşılaştırmak için örneğin, metin sonucunu karşılaştırmak için karmaşık bir komut depolamak istediğiniz daha bir durumda, belki bu size yardımcı olabilir:

işi yapmak gibi görünüyor
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