[ansible] Ansible : 명령의 stdout을 새 변수에 저장 하시겠습니까?

내 플레이 북 안에 외부 명령의 출력을 포함하는 변수를 만들고 싶습니다. 나중에 몇 가지 템플릿에서 해당 변수를 사용하고 싶습니다.

다음은 플레이 북의 관련 부분입니다.

  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

이것이 내 템플릿이라고합시다.

[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

(알림 {{ string_to_echo }})

그래서 내가 기본적으로 찾고 command_output.stdout있는 것은 (첫 번째 작업 중에 생성 / 검색되는) 내용을 새 변수에 저장하는 방법 string_to_echo입니다.
나중에 여러 템플릿에서 사용하고 싶은 변수입니다.

{{command_output.stdout}}내 템플릿에서 사용할 수 있다고 생각 하지만 .stdout가독성 을 위해 제거하고 싶습니다 .



답변

콘텐츠를 사실로 저장 해야합니다 .

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


답변

사실을 설정할 필요가 없습니다.

    - shell: cat "hello"
      register: cat_contents

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


답변

@udondan의 대답을 넘어선 약간의 수정. 저는 등록 된 변수 이름을와 함께 재사용 set_fact하여 혼란을 최소화 하고 싶습니다 .

따라서 변수를 사용하여 등록 psk하려면 set_fact.

- 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

그런 다음 실행할 때 :

$ 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


답변

저는 Ansible의 초보자이지만 다음 솔루션을 제안합니다.

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

Ansible은 게으른 평가를 사용하기 때문에 작동해야합니다. 하지만 출시 전에 유효성을 확인하는 것 같아서 command_output_full.stdoutvars 에서 정의해야합니다 .

물론 vars섹션에 이러한 변수가 너무 많으면 보기 흉하게 보일 것입니다.


답변

예를 들어 OS 버전을 비교하기 위해 텍스트 결과를 비교하기 위해 복잡한 명령을 저장하려는 경우 다음이 도움이 될 수 있습니다.

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


답변

더 나아가 플레이 북 결과에서 원하는 정확한 정보를 추출하려면 jmespath와 같은 JSON 쿼리 언어를 사용하십시오.

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


답변