Ansible 네트워크 자동화 – 3

Ansible 네트워크 자동화 -3

앤시블 인벤토리(Inventory) 만들기

 

인벤토리 없이 플레이북을 실행하려면 명령어에 여러 플래그들이 필요하다. 또한 하나의 장비에 대해 플레이북을 실행하는 것은 같은 작업을 수동으로 하는 것과 비교하여 크게 효율적이지도 않다.
ansible_network_os 와 ssh 사용자같은 정보를 가지는 managed node를 구성하기위해 인벤토리 파일을 사용한다. 모든 기능을 가지는 인벤토리 파일은 네트워크의 진짜 소스로 쓰일 수 있다.
인벤토리 파일을 사용하여 한 플레이북에서 단일 명령으로 수백개의 네트워크 장비를 유지할 수 있다.

기본 인벤토리

먼저, 인벤토리를 논리적으로 그룹화한다. 우수 사례는 용도(어플리케이션, 스택이나 마이크로서비스), 장소(데이터센터나 지역), 시점(개발 단계)별로 서버와 네트워크 장비를 그룹화 하는 것이다.

그룹 이름에 공백, -, 숫자를 사용하면 안된다. 그룹이름은 대소문자를 구별한다.

아래 간단한 datacenter 예제는 기본 그룹 구조를 보여준다. 그룹은 [metagroupname:children] 문법을 사용하고 메타그룹의 멤버로 그룹을 나열한다. network 그룹은 모든 leap와 spine을 v포함한다. datacenter 그룹은 모든 네트워크장비와 모든 웹서버를 추가한다.

아래 INI 포맷의 인벤토리는 위와 정확히 동일하다.

인벤토리에 변수 추가하기.

인벤토리에 ansible 명령어에 필요한 변수와 값을 설정하여 ansible-play 명령을 단순화할 수 있다.
아래의 인벤토리 예제는 각 네트워크 장비의 IP, OS, ssh 사용자가 포함된다.
네트워크 장비를 IP 주소로만 접근할 수 있는 경우 인벤토리 파일에 IP 주소를 추가해야한다.
만약 네트워크장비를 호스트네임을 사용하여 접근 가능하면 IP 주소는 필요 없다.

인벤토리 내의 그룹 변수

OS나 ssh 사용자 같은 변수 값을 공유하는 그룹의 장비에서 그룹 변수로 통합해 중복을 줄이고 유지관리를 단순하게 할 수 있다.

변수 문법

변수 값의 문법은 인벤토리, 플레이북, group_vars 파일에서 다르다.
플레이북과 grup_vas 파일 모두 YAML로 작성되지만 변수 사용에는 차이가 있다.

ini 스타일의 인벤토리 파일에서는 key=value 형식을 사용해야한다. (예: ansible_network_os=vyos.vyos.vyos)
플레이북이나 group_vars를 포함하는 .yml 이나 .yaml 확장자를 가지는 파일에서는 반드시 YAML 문법을 사용해야한다. (예: key: value)
group_vars 파일에서는 전체 key 이름을 사용한다. (예: ansible_network_os: vyos.vyos.vyos)
플레이북에서 ansible 접두사를 생략하는 짧은 형식의 key 이름을 사용한다. (예: network_os: vyos.vyos.vyos)

플랫폼별 인벤토리 그룹

인벤토리가 커질수록 플랫폼별로 장비를 구룹화 할 수 있다. 이것으로 해당 플랫폼의 모든 장비에 대해 플랫폼별 변수를 쉽게 지정할 수 있다.

이 설정에서 first_playbook.yml은 두개의 플래그로 실행할 수 있다.
ansible-playbook -i inventory.yml -k first_playbook.yml

-k 플래그는 ssh 비밀번호를 묻는 프롬프트를 제공한다.
ansible-vault를 사용하여 group_vars 파일에 ssh 비밀번호를 안전하게 저장할 수 있다.

인벤토리 확인

테스트 인벤토리를 다음과 같이 작성.

ansible-inventory 명령으로 ansible이 보는것 처럼 인벤토리를 표시할 수 있다.

ansible-vault로 민감한 변수 보호하기

ansible-vault 명령은 비밀번호같은 개별 변수나 파일의 암호화를 제공한다.
아래와 같은 명령으로 데이타베이스 비밀번호, 권한 상승 비밀번호, ssh 접속 비밀번호같은 민감한 정보를 암화화 할 수 있다.

1. ansible-vault 를 위한 비밀번호를 만든다.
비밀번호는 ansible-vault-password 를 사용할 것이다.

2. 위에서 만든 ansible-vault 비밀번호 파일을 사용하여 cisco ios 장비의 비밀번호를 암호화한다.

id 뒤에 파일을 지정하는 대신 prompt를 사용하면, 아래처럼 비밀번호를 입력하는 프롬프트를 내보낸다.

–vault-id 플래그는 다른 사용자나 다른 접근 수준에 대하여 서로다른 vault 암호를 허용한다.
출력은 ansible-vault 명령의 사용자 admin이 포함되며 YAML 구문을 사용한다.

INI 포맷은 인라인 vault를 지원하지 않으므로, YAML포맷을 사용해야한다.

테스트 인벤토리를 아래처럼 수정한다.

vault 비밀번호 파일로 플레이북을 실행.

비밀번호 파일 대신 직접입력하려면 파일 이름대신 prompt를 사용한다.(당연히 입력하는 비밀번호는 파일에 있는것과 동일해야함)

원래의 값을 보기위해 디버그 모듈을 사용할 수 있다.
YAML 파일에 ansible_connection 변수를 정의하는경우, 아래 명령처럼 실행해야 적용된다.
이것을 방지하려면 ansible_connection 변수 없이 복사본을 만들면 된다.

참고문서: https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html#inventory

답글 남기기

Your email address will not be published.

%d bloggers like this: