Ansible: 변수 및 Hostvar 작업
14371 단어 ansibleinfrastructure
이 기사에서는 호스트 팩트가 무엇인지, 어떻게 보는지 배우고, 이제 작업 실행에서 변수를 정의하는 방법을 배웁니다.
이 기사는 원래 my blog 에 게재되었습니다.
호스트 사실 수집 및 표시
Ansible이 작업을 실행할 때마다 첫 번째 단계는 노드에 대한 정보를 수집하는 것입니다. 이러한 사실은
hostvars
변수를 사용하여 액세스할 수 있습니다. 각 노드에 대해 hostvars
를 인쇄하는 플레이북을 작성해 보겠습니다.- name: Retrieve host vars
hosts:
- raspis
- server
tasks:
- debug:
var=hostvars[inventory_hostname]
노드
raspi-4-1
에 대해서만 이 플레이북을 실행할 것입니다.ansible-playbook retrieve_host_vars —limit "raspi-4-1"
TASK [get variables] **********************************************************************************
ok: [raspi-4-1] => {
"hostvars[inventory_hostname]": {
"_facts_gathered": true,
"all_ipv4_addresses": [
"192.168.2.111"
],
"architecture": "armv7l",
"distribution": "Debian",
"distribution_release": "buster",
"distribution_version": "10",
"hostname": "raspi-4-1",
"hostnqn": "",
"kernel": "4.19.97-v7l+",
"kernel_version": "#1294 SMP Thu Jan 30 13:21:14 GMT 2020",
[...]
"machine": "armv7l",
"machine_id": "edaca707ad4b4b8991d2341c902160f5",
"memfree_mb": 3670,
"memtotal_mb": 3906,
"nodename": "raspi-4-1",
"os_family": "Debian",
"pkg_mgr": "apt",
"processor_cores": 1,
"processor_count": 4,
"processor_threads_per_core": 1,
"processor_vcpus": 4,
"product_name": "",
"product_serial": "",
"product_uuid": "",
"product_version": "",
"service_mgr": "systemd",
"uptime_seconds": 8359
}
}
출력에는 변수의 일부만 표시됩니다. 보시다시피 Ansible은 운영 체제, 하드웨어 아키텍처, 메모리 및 CPU, IP 주소에 대한 정보를 검색합니다. 이 정보에 액세스하고 사용하는 흥미로운 사용 사례가 있습니다. 예를 들어 호스트의 IP 주소를 수집하고 이를 사용하여 Nginx 구성 파일을 생성할 수 있습니다.
이 명령을 임시 작업으로 실행할 수도 있습니다.
ansible -i hosts all -m debug -a "var=hostvars[inventory_hostname]"
사실에 익숙해지면 다음 명령을 사용하여 노드를 빠르게 쿼리할 수 있습니다.
ansible -i hosts all -m setup -a "filter=architecture"
변수 정의 및 사용
노드의 호스트 이름을 검색하는 플레이북을 작성해 보겠습니다. 플레이북
tutorial_retrieve_hostname.yml
을 열고 다음을 작성합니다.- name: Retrieve hostname
hosts:
- raspis
- server
tasks:
- name: Retrieve the hostname
command: hostname
이 플레이북을 실행하면 다음 출력을 볼 수 있습니다.
ansible-playbook playbook/retrieve_hostname.yml --limit raspis
PLAY [Retrieve and show hostname of nodes] *****************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [raspi-4-2]
ok: [raspi-4-1]
ok: [raspi-3-2]
ok: [raspi-3-1]
TASK [Retrieve the hostname] **************************************************************************
changed: [raspi-4-1]
changed: [raspi-4-2]
changed: [raspi-3-1]
changed: [raspi-3-2]
PLAY RECAP ********************************************************************************************
raspi-3-1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi-3-2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi-4-1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
raspi-4-2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
명령이 작동하지만 출력이 표시되지 않습니다. 명령의 반환 값을 어떻게 저장할 수 있습니까?
hostname
명령의 결과를 변수에 저장하고 이 변수를 콘솔에 인쇄해야 합니다.- name: Retrieve hostname
hosts:
- raspis
- server
tasks:
- name: Retrieve the hostname
command: hostname
register: result
- debug:
var: hostname
이 플레이북을 실행해 보겠습니다.
TASK [debug] ******************************************************************************************
ok: [raspi-3-1] => {
"result": {
"changed": true,
"cmd": [
"hostname"
],
"delta": "0:00:00.006215",
"end": "2020-02-23 10:35:52.757907",
"failed": false,
"rc": 0,
"start": "2020-02-23 10:35:52.751692",
"stderr": "",
"stderr_lines": [],
"stdout": "raspi-3-1",
"stdout_lines": [
"raspi-3-1"
]
}
}
여기서 무슨 일이? 생각보다 많이 보입니다! 각 Ansible 모듈은 시간, 반환 코드, 작업 실패 등과 같은 data structure that includes information을 반환합니다. 그러나 우리는 특히
stdout
값에 관심이 있습니다. 또한 이 변수를 set_fact module 을 사용하여 호스트의 사실로 저장하려고 합니다. 그러면 이 변수는 플레이북 전체의 모든 후속 작업에서 사용할 수 있습니다.이 버전은 다음과 같습니다.
- name: Retrieve hostname
hosts:
- raspis
- server
tasks:
- name: Retrieve the hostname
command: hostname
register: result
- set_fact:
hostname: {{ result.stdout }}
- debug:
var: hostname
이 플레이북의 결과를 살펴보겠습니다.
TASK [debug] ******************************************************************************************
ok: [raspi-3-1] => {
"hostname": "raspi-3-1"
}
ok: [raspi-3-2] => {
"hostname": "raspi-3-2"
}
ok: [raspi-4-1] => {
"hostname": "raspi-4-1"
}
ok: [raspi-4-2] => {
"hostname": "raspi-4-2"
}
정확히 우리가 원했던 것입니다.
결론
Ansible은 호스트에 대한 유용한 정보를 많이 수집합니다. 이 기사에서는 액세스하고 인쇄하는 방법을 배웠습니다. 또한 작업 결과를 변수로 캡처하고 플레이북을 실행하는 동안 호스트에 팩트로 저장하는 방법도 배웠습니다. 변수를 효과적으로 처리하는 것은 Ansible로 작업할 때 매우 중요합니다.
Reference
이 문제에 관하여(Ansible: 변수 및 Hostvar 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/admantium/ansible-working-with-variables-and-hostvars-4m8k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)