티스토리 뷰

DevOps_Programming/Ansible

Ansible 구조의 이해

청년정신 2019. 6. 14. 01:48
Ansible을 올바르게 사용하기 위해서는 몇가지의 기초지식과 동작 구조를 이해하면 접근하기 용이하다.
아래 몇가지 사항들을 정리한다.

우선 제일 먼저 전체적인 Ansible의 아키텍쳐를 이해하는 것이 좋다.

2개의 주요 컴포넌트는 Ansible Controller와 Ansbile Target이다.
이 가운데 컨트롤러는 Target에 대해 어떤 구성을 내려 보낼지에 대한 Task들을 정의하게 된다.
YAML 파일 또는 ini 파일형식 모두 지원한다.
아래는 Inventory 파일에 대해 예제로 기술한 내용이다.

# inventory에 대한 환경/전역변수 내용 정의
[all:vars]
ansible_become=yes
ansible_become_method=enable
ansible_network_os=nxos
ansible_connection=httpapi
#ansible_connection=network_cli
ansible_httpapi_port=443
ansible_httpapi_use_ssl=yes
ansible_httpapi_validate_certs=no
ansible_user=ansible
ansible_password=1234Qwer

# Host Group화 정의 - ‘ [ ] ‘ 대괄호로 구분
# 그룹 내부에 host명을 정의.
[oob]
dcoob ansible_host=10.72.86.1

[spine]
NXOS-SPINE-1001 ansible_host=10.72.86.143
NXOS-SPINE-1002 ansible_host=10.72.86.144

[leaf]
NXOS-LEAF-1003  ansible_host=10.72.86.145
NXOS-LEAF-1004  ansible_host=10.72.86.146
NXOS-LEAF-1005  ansible_host=10.72.86.147
NXOS-LEAF-1006  ansible_host=10.72.86.148

그룹이 많아지고, 각 그룹에 대한 환경변수를 별도로 지정하려면 아래와 같이 디렉토리 내부에 환경변수와 인벤토리 파일을 분리해서 지정해 주면 좀 더 체계화된 관리가 가능하다.





2. Module

Ansible은 앞서 블로깅에서도 언급했던 것 처럼, Python Code를 호출해서 실행하는 방식이다.
따라서 Ansible을 설치한 이후 살펴보면 상당히 많은 모듈이 설치되어 있는 것을 확인 할 수 있다.
이러한 이유로 Ansible은 제공되는 모듈에 따라 Python version 에 따라 일부 종속성이 생기며, 기본 Python이 설치되어 있어야 한다.

[root@ansible ~]# ansible-doc -l | grep 'nxos'
nxos_aaa_server                                      Manages AAA server global configuration.
nxos_aaa_server_host                                 Manages AAA server host-specific configuration.
nxos_acl                                             Manages access list entries for ACLs.
nxos_acl_interface                                   Manages applying ACLs to interfaces.
nxos_banner                                          Manage multiline banners on Cisco NXOS devices
nxos_bgp                                             Manages BGP configuration.
nxos_bgp_af                                          Manages BGP Address-family configuration.
이하 생략

[root@ansible ~]# ansible-doc -l | grep 'vmware'
vmware_about_facts                                   Provides information about VMware server to which user is ...
vmware_category                                      Manage VMware categories
vmware_category_facts                                Gather facts about VMware tag categories
vmware_cfg_backup                                    Backup / Restore / Reset ESXi host configuration
vmware_cluster                                       Manage VMware vSphere clusters
vmware_cluster_facts                                 Gather facts about clusters available in given vCenter
vmware_datacenter                                    Manage VMware vSphere Datacenters
이하 생략

[root@ansible ~]# ansible-doc -l | grep 'aci'
aci_aaa_user                                         Manage AAA users (aaa:User)
aci_aaa_user_certificate                             Manage AAA user certificates (aaa:UserCert)
aci_access_port_to_interface_policy_leaf_profile     Manage Fabric interface policy leaf profile interface sele...
aci_aep                                              Manage attachable Access Entity Profile (AEP) objects (inf...
aci_aep_to_domain                                    Bind AEPs to Physical or Virtual Domains (infra:RsDomP)
aci_ap                                               Manage top level Application Profile (AP) objects (fv:Ap)
aci_bd                                               Manage Bridge Domains (BD) objects (fv:BD)
이하 생략


3. Playbook

다른 블로깅에서 언급했지만, Ansible Target에 구성정보를 내리거나, 정보를 가져올 때 사용할 수 있는 2가지 방법이 있다.
하나는 Playbook기반으로 Task를 정의하는 것이고, 하나는 Adhoc 기반으로 단일 Task를 모듈과 함께 사용하는 방법이 있다.
후자의 경우에는 단일 모듈과 Task를 수행하는 일로 단순 작업이나 정보를 Gathering 할 때 사용하는 것이 유용하다.
하지만 여러개의 Task를 수행하거나, 서로 다른 역할을 기반으로 Config를 Target에 전달할 때는 , Playbook을 통해 나만의 플레이북을 만들어서 사용하면 매우 유용하다.

Playbook은 YAML로 구성되어야 하며, 아래 간단하게 코드로 예제를 소개한다.
시스코 네트워크 장비인   Nexus 스위치에 Config 정보를 수집하는 간단한 Playbook 예제이다.

---
- name: nxos_fact.yml

  hosts: all

  tasks:
    - name: nxos_facts gather config

      nxos_facts:
        gather_subset:
          - config

      register: output

     - debug:

        var: output


4. 기본 언어 - YAML

Ansible의 핵심 중에 하나는 실제 구성정보를 Ansible Target으로 전달해서 수행해야 하는데, 이 때 사용되는 언어가 YAML이다.
YAML은 일반적인 언어보다는 가독성과 직관성이 뛰어난 편이며, 몇가지 문법적 규칙을 가지고 사용할 수 있다.
특히 Playbook과 Role을 정의하는 데 사용되는 언어이므로, YAML은 반드시 정리하고 숙지해야 한다.
몇가지 주요 사항을 정리한다.

  • 시작은 “ --- “ 으로 표현하며, 마지막은 “ … “ 으로 마무리 한다.

---
- hosts: all
...

  • 주석 처리는 “#”를 통해서 표현한다.

# Playbook for the Multipackage install --> 주석에 대한 표현
---
- hosts: all

  tasks:
    - name: install the latest version of "net-tools"

  • 해시 또는 사전정의는  key : value 를 통해서 표현이 가능하며, 한줄에 하나를 표현하거나, 한줄에 모아 사용할 경우에는 “ { } “를 통해서 표현한다.
  • 리스트는 멀티 라인으로 표현할 때는 “ - “ 으로 구분한다.

---
- name: nxos_l3_interface.yml

  hosts: all

  connection: httpapi

  tasks:
    - name: Set IP addresses on aggregate
      nxos_l3_interface:
        aggregate:
          - { name: Ethernet1/22, ipv4: 192.168.2.1/24 }

          - { name: Ethernet1/23, ipv4: 192.168.3.1/24 }

        state: present


추가적인 문법들은 Ansible Playbook과 Role을 구현하며 학습할 수 있다.
특히 변수와 Loop등은 자주 사용하게 되므로 익혀두는 것이 좋다.


추가적으로 아래 Cisco Nexus OS 기반에서의 Ansible 구조를 정리하였다.
참고하면 Ansible을 이해하는 데 도움이 된다.






'DevOps_Programming > Ansible' 카테고리의 다른 글

Cisco NXOS Ansible 활용 - 유용한 Adhoc 명령  (0) 2019.06.15
Vagrant기반 Ansible 구성  (0) 2019.05.10
Ansible 기본 개념 및 설치  (5) 2019.05.07
공지사항