원문 바로가기

처음으로 Ansible 명령과 플레이북 실행해보기

배운 개념을 이 튜토리얼을 통해 직접 활용해봅니다. Ansible을 설치하고, 네트워크 설정 명령을 수동으로 실행한 후, 똑같은 명령을 Ansible 로 실행해봅니다. 그 후에, 명령을 언제든 여러 대의 네트워크 기기에 사용할 수 있도록 플레이북으로 만들어보겠습니다.

요구 사항

이 튜토리얼을 따라하기 위해서는 다음과 같은 것들이 필요합니다.

Ansible 설치하기

Ansible을 선호하는 방법으로 설치해주세요. Ansible 설치하기를 참조해주세요. 설치가 끝나면 이 튜토리얼로 돌아오시기 바랍니다.

Ansible 버전을 확인해봅니다 (2.10 이상이어야 합니다).

ansible --version

매니지드 노드로 수동 접속하기

사용자 정보가 맞는지 확인하기 위해, 네트워크 기기에 수동으로 접속해서 설정 정보를 가져옵니다. 샘플 유저와 기기 이름을 진짜 사용자 정보 및 기기의 호스트명으로 바꿔주세요. 예를 들어, VyOS 라우터에 접속하는 경우를 보여드리겠습니다.

ssh my_vyos_user@vyos.example.net
show config
exit

이렇게 수동으로 접속하게 되면, 알려진 호스트 목록에 해당 기기의 RSA키 지문을 등록하여 네트워크 기기를 신뢰합니다 (이전에 해당 기기에 연결한 적이 있다면, 이미 신뢰하는 기기로 등록되어 있을 것입니다).

자신의 첫 Ansible 명령을 실행하기

네트워크 기기에 수동으로 접속해서 명령을 실행하지 않아도, 단 한 줄의 Ansible 명령만을 통해 설정 내용을 가져올 수 있습니다.

ansible all -i vyos.example.net, -c ansible.netcommon.network_cli -u my_vyos_user -k -m vyos.vyos.vyos_facts -e ansible_network_os=vyos.vyos.vyos

이 명령에 나오는 플래그들은 일곱 가지의 값을 설정합니다.

  • 이 명령이 적용되어야 할 하나 이상의 호스트 그룹 (이 경우, all)
  • 인벤토리 (-i, 대상 디바이스. 끝에 쉼표 없이 그냥 -i를 적을 경우 이는 인벤토리 파일을 가리킵니다)
  • 연결 방식 (-c, 연결과 Ansible 실행 방식)
  • 사용자 (-u, SSH 연결을 위한 사용자명)
  • SSH 연결 방식 (-k, 패스워드 입력 방식으로 설정할 경우)
  • 모듈 (-m, 실행할 Ansible 모듈. 컬렉션의 fully qualified collection name; FQCN을 사용합니다)
  • 기타 변수 ( -e, 이 경우 네트워크 OS의 값을 설정)

참고: ssh 키를 이용하여 ssh-agent를 사용할 경우, Ansible은 키를 자동으로 불러옵니다. 이때는 -k 옵션을 사용하지 않아도 됩니다.

참고: 만약 가상 환경에서 Ansible을 실행할 경우, ansible_python_interpreter=/path/to/venv/bin/python 변수를 사용해야 할 필요가 있을 것입니다.

자신만의 첫 네트워크 플레이북을 만들고 실행하기

만약 이 명령을 매일 실행하고 싶다면, 이 명령을 플레이북에 저장해서 ansible 대신 ansible-playbook 명령으로 실행하면 됩니다. 플레이북은 명령줄에서 플래그와 함께 입력했던 많은 매개변수들을 저장할 수 있기 때문에, 명령줄에 입력할 내용이 줄어듭니다. 이를 위해서는 두 개의 파일 (플레이북과 인벤토리 파일) 이 필요합니다 (역자주: 아래에선 인벤토리 파일 없이 플레이북만으로 실행).

  1. first_playbook.yml 을 다운로드합니다. 아래와 같이 생겼습니다.
 
---

- name: 플레이북으로 네트워크 시작하기 첫 플레이북
  connection: ansible.netcommon.network_cli
  gather_facts: false
  hosts: all
  tasks:

    - name: VyOS 기기에서 설정 가져오기
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: 설정을 화면에 표시
      debug:
        msg: "호스트명은 {{ ansible_net_hostname }}  이고 OS는 { { ansible_net_version }} 입니다."

플레이북은 위의 명령줄에서 봤던 7개의 값 중 3개, 즉 그룹 (hosts: all), 연결 방법 (connection: ansible.netcommon.network_cli), 그리고 모듈 (각 작업마다) 을 설정해놓고 있습니다. 이러한 값들이 이미 플레이북에 설정되어 있기 때문에, 명령줄에서는 생략할 수 있습니다. 또한 설정 내용 아웃풋을 표시하기 위한 작업이 플레이북에 추가되어 있습니다. 모듈이 플레이북에서 실행될 때, 출력은 콘솔에 기록되는 대신 향후 작업에서 사용할 수 있도록 메모리에 보존됩니다. 여기서 debug 작업을 사용하면 셸에서 결과를 볼 수 있습니다.

  1. 다음 명령으로 플레이북을 실행합니다.
ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook.yml

이 플레이북은 두 개의 작업을 가진 하나의 플레이로 구성되어 있으며, 다음과 같은 출력이 나타날 것입니다.

$ ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook.yml

PLAY [플레이북으로 네트워크 시작하기 첫 플레이북]
***************************************************************************************************************************

TASK [VyOS 기기에서 설정 가져오기]
***************************************************************************************************************************
ok: [vyos.example.net]

TASK [설정을 화면에 표시]
***************************************************************************************************************************
ok: [vyos.example.net] => {
    "msg": "호스트명은 vyos 이고 OS는 VyOS 1.1.8 입니다."
}

기기 설정을 가져와봤으니, Ansible로 설정을 변경해봅시다. 첫 플레이북의 확장 버전인 first_playbook_ext.yml 을 다운로드해보세요.

 
---

- name: Network Getting Started First Playbook Extended
  connection: ansible.netcommon.network_cli
  gather_facts: false
  hosts: all
  tasks:

    - name: Get config for VyOS devices
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: Display the config
      debug:
        msg: "The hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"

    - name: Update the hostname
      vyos.vyos.vyos_config:
        backup: yes
        lines:
          - set system host-name vyos-changed

    - name: Get changed config for VyOS devices
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: Display the changed config
      debug:
        msg: "The new hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"

이 확장된 첫 플레이북은 하나의 플레이에 다섯 개의 작업을 가지고 있습니다. 위에서 사용한 것과 같은 명령어로 실행해봅니다. Ansible로 설정을 변경했다는 사실이 출력될 것입니다.

$ ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook_ext.yml

PLAY [Network Getting Started First Playbook Extended]
************************************************************************************************************************************

TASK [Get config for VyOS devices]
**********************************************************************************************************************************
ok: [vyos.example.net]

TASK [Display the config]
*************************************************************************************************************************************
ok: [vyos.example.net] => {
    "msg": "The hostname is vyos and the OS is VyOS 1.1.8"
}

TASK [Update the hostname]
*************************************************************************************************************************************
changed: [vyos.example.net]

TASK [Get changed config for VyOS devices]
*************************************************************************************************************************************
ok: [vyos.example.net]

TASK [Display the changed config]
*************************************************************************************************************************************
ok: [vyos.example.net] => {
    "msg": "The new hostname is vyos-changed and the OS is VyOS 1.1.8"
}

PLAY RECAP
************************************************************************************************************************************
vyos.example.net           : ok=5    changed=1    unreachable=0    failed=0

네트워크 기기에서 팩트 수집하기

gather_facts 키워드는 표준화된 키-값 쌍으로 네트워크 기기의 정보 (팩트) 를 수집할 수 있도록 합니다. 이렇게 얻어진 팩트를 이후의 다른 작업에 전달하여 네트워크 디바이스를 관리할 수 있습니다. 또한 아래와 같이 네트워크 *_facts 모듈(이를테면 arista.eos.eos_facts)과 함께 새로운 gather_network_resources 매개변수를 사용하여 기기 구성의 일부가 반환되게 할 수 있습니다.

- hosts: arista
  gather_facts: True
  gather_subset: interfaces
  module_defaults:
    arista.eos.eos_facts:
      gather_network_resources: interfaces

위 플레이북은 다음과 같은 인터페이스 팩트를 반환합니다.

"network_resources": {
      "interfaces": [
          {
              "description": "test-interface",
              "enabled": true,
              "mtu": "512",
              "name": "Ethernet1"
          },
          {
              "enabled": true,
              "mtu": "3000",
              "name": "Ethernet2"
          },
          {
              "enabled": true,
              "name": "Ethernet3"
          },
          {
              "enabled": true,
              "name": "Ethernet4"
          },
          {
              "enabled": true,
              "name": "Ethernet5"
          },
          {
              "enabled": true,
              "name": "Ethernet6"
          },
      ]
  }

gather_network_resources는 지원되는 모든 리소스 (인터페이스, bgp, ospf 등)에 대한 설정 데이터 (역자주: 인터페이스 구성 등)를 팩트로 표시해주는 반면, gather_subset은 주로 운영 데이터 (역자주: 인터페이스 상태 등)를 가져오는 데 사용됩니다. 이러한 팩트를 저장하고 eos_interfaces 리소스 모듈과 같은 다른 작업에서 직접 사용할 수 있습니다.

Updated:

Leave a comment