Ansible: 변수 및 Hostvar 작업

14371 단어 ansibleinfrastructure
내가 Infrastructure@home 프로젝트에 대해 쓰기 시작했을 때 Ansible은 중앙 구성 관리 도구가 되었습니다. Ansible을 더 효과적으로 사용하기 위해 Ansible Up and RunningMastering Ansible 책을 읽기 시작했습니다. 프로젝트에 필요한 것보다 Ansible에 대해 더 많이 배웠지만 그 자체로 흥미롭고 튜토리얼 스타일로 공유하고 싶습니다. 이것은 첫 번째 기사입니다.

이 기사에서는 호스트 팩트가 무엇인지, 어떻게 보는지 배우고, 이제 작업 실행에서 변수를 정의하는 방법을 배웁니다.

이 기사는 원래 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로 작업할 때 매우 중요합니다.

좋은 웹페이지 즐겨찾기