내 플레이 북 안에 외부 명령의 출력을 포함하는 변수를 만들고 싶습니다. 나중에 몇 가지 템플릿에서 해당 변수를 사용하고 싶습니다.
다음은 플레이 북의 관련 부분입니다.
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.stdout
vars 에서 정의해야합니다 .
물론 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') }}"