Ansible: Komutun stdout'u yeni değişkende saklansın mı?


86

Başucu kitabımın içinde, harici bir komutun çıktısını tutan bir değişken oluşturmak istiyorum. Daha sonra bu değişkeni birkaç şablonda kullanmak istiyorum.

Başucu kitabının ilgili bölümleri şunlardır:

  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 şablonum:

[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

(Dikkat edin {{ string_to_echo }})

Yani temelde aradığım şey, içeriğini command_output.stdout(ilk görev sırasında üretilen / alınan) yeni bir değişkende depolamanın bir yolu string_to_echo.
Daha sonra birden çok şablonda kullanmak istediğim bu değişken.

Sanırım sadece {{command_output.stdout}}şablonlarımda kullanabilirim , ancak .stdoutokunabilirlik için bundan kurtulmak istiyorum .

Yanıtlar:



71

Bir gerçek oluşturmaya gerek yok.

    - shell: cat "hello"
      register: cat_contents

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

14
Bu yararlıdır, ancak daha sonra değişkeni kullandığınızda kullanmayı da hatırlamanız gerektiği anlamına gelir .stdout.
Tim Malone

21

@ Udondan'ın cevabının ötesinde küçük bir değişiklik. set_factKarışıklığı minimumda tutmaya yardımcı olmak için kayıtlı değişken adlarını ile yeniden kullanmayı seviyorum .

Yani değişkeni kullanarak kaydolacak pskolsaydım, aynı değişken adını set_fact.

Misal

- 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

Sonra çalıştırdığımda:

$ 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

8

Ansible'da acemiyim, ancak bir sonraki çözümü öneririm:

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

Çalışmalı (ve benim için çalışıyor) çünkü Ansible tembel değerlendirme kullanıyor. Ama lansmandan önce geçerliliği kontrol ediyor gibi görünüyor, bu yüzden command_output_full.stdoutdeğişkenler içinde tanımlamam gerekiyor .

Ve tabii ki, eğer varsbölümde bu türden çok sayıda değişken varsa, çirkin görünecektir.


7

Metin sonucunu karşılaştırmak için karmaşık bir komutu depolamak istemeniz durumunda, örneğin işletim sisteminin sürümünü karşılaştırmak için, belki bu size yardımcı olabilir:

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

1

Daha ileri gitmek ve Başucu Kitabı sonuçlarından tam olarak istediğiniz bilgileri çıkarmak istiyorsanız, jmespath gibi JSON sorgu dilini kullanın, bir örnek:

  - name: Sample Playbook
    // Fill up your task
    no_log: True
    register: example_output

  - name: Json Query
    set_fact:
      query_result:
        example_output:"{{ example_output | json_query('results[*].name') }}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.