Ansible 활용
IaC(Infrastructure as Code) 도구 중 하나인 Ansiable에 대한 Playbook을 제공
Table of Contents
NO | ITEM | Content | 비고 |
---|---|---|---|
1 | OS Maintenance ITEMs | GO | |
2 | INFRA Maintenance ITEMs | GO | |
3 | WEB Server Maintenance ITEMs | GO | |
4 | DBMS Maintenance ITEMs | GO | |
5 | Users Management ITEMs | GO | |
6 | Virtualization Maintenance ITEMs | GO | |
7 | Secure Vulnerability ITEMs | GO |
Overview
Facts 란?
Ansible에서 Node에 대한 정보를 변수로 수집하는 정보를 말하며, Playbook 사용 시 gather_facts:no
로 설정하지 않는다면, 기본적으로 수집된다.
# cat test.yml
---
- hosts: all
#gather_facts: no
tasks:
Facts 변수는 다음의 스크립트를 통해 간단하게 수집할 수 있다.
#!/bin/bash
host=""
if [[ "$1" = "" ]]; then
host="현재 디렉토리의 hosts 파일에 호스트를 입력하십시오!"
echo $host
exit;
else
host=$1
fi
ansible -i hosts $1 -m setup
단, 단일 시스템에 대한 수집을 기준으로 한다.
!참고 : 만약 다음과 같은 에러가 발생되면서 Playbook의 실행이 안될 경우
호스트명 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
이는 최초 접속 시에 대부분 발생되며, 근본원인 원인은 ssh의 공개키 교환이 안됐기 때문이다. 따라서 다음과 같이 설정하면 된다.
- 전역 설정 : /etc/ansible/ansible.cfg
- 지역 설정 : ./ansible.cfg
- 설정 내역 :
[defaults]
host_key_checking = False
멱등성(idempotent)이란 ?
연산 수행을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 멱등성 이라고 한다.
여기서 Ansible에서의 멱등성은 여러 번 수행하더라도 동일한 결과 값이 나오도록 제공되는 형태를 의미 한다. 예를 들어, Node에 test 계정을 생성한 후 다시 수행하게 되면, 좀 전에 생성되었기 때문에 동일한 작업을 수행하지 않는 것을 의미한다.
Playbook 이란?
YAML(야물이라고 읽는다) 문법을 기반으로 정의된 다수의 Task를 수행하는 툴 이다.
Task 란?
Ansible 모듈의 호출을 의미한다. Role을 좀 더 편하게 관리하기 위해 미리 정의된 YAML 파일의 include을 하는 것이 가능하다. 예를 들어 다음의 두 명령을 각가 실행하고 싶다면, Task는 두 개가 되는 것이다.
# cat test.yml
- hosts: all
tasks:
- name: test command 1
command: ls -al
- name: test command 2
command: pwd
원격 Node에 ls -al 및 pwd 명령을 실행한다. 물론, 다음과 같이 Shell의 세미콜론을 이용해 한 개의 Task로 실행할 수도 있다.
# cat test.yml
- hosts: all
tasks:
- name: test command
shell: ls -al; pwd
inventory 란?
원격 Node에 대한 META 데이터를 기술하는 파일이다. Ansible은 inventory 파일에 yaml을 적용하지 않는다. 기본 파일은 /etc/ansible/hosts(Global 기본 값)를 읽게 하거나, 별도 inventory 파일을 만들고 옵션(ansible-Playbook 명령 시 -i 옵션)을 주어 동작하게 할 수 있다.
# ls
host_vars hosts test.yml
# ansible-playbook -i hosts test.yml
그리고 hosts inventory 파일은 다음과 같이 정의해서 사용한다.
# cat hosts
[SERVERS]
172.16.0.111
- [SERVERS] : 호스트 그룹을 의미한다.
- 172.16.0.111 : SERVERS 호스트 그룹의 호스트를 의미 한다.
만약 호스트 그룹에 변수를 적용하고 싶다면, 다음과 같이 작성한다.
# cat hosts
[SERVERS]
172.16.0.111
[SERVERS:vars]
managed_ip=10.10.10.10
호스트 / 그룹 변수
inventory에 정의된 호스트의 변수를 지정하는 파일이다.
- ./host_vars : 호스트에 대한 변수를 정의
- ./group_vars : 호스트 그룹에 대한 변수를 적용
# cat host_vars/172.16.0.111
ansible_ssh_host: 172.16.0.111
ansible_ssh_port: 2222
ansible_ssh_user: 유저 아이디
ansible_ssh_pass: "유저 패스워드"
ansible_become: yes
ansible_become_method: su
ansible_become_user: root
ansible_become_pass: "root 패스워드"
ansible_python_interpreter: python2.7
위의 호스트는 일반 유저 -> su - 명령 => root 유저 로그인 방식으로 정의하며, python은 2.7 버전을 지정한 내역이다.
Jinja2 Template
Jinja2(진자2)는 Python으로 작성된 템플릿 엔진이다. Ansible에서 Playbook에 있는 변수 정보를 확장할 때 사용한다.
다음과 같이 변수를 정의한 후 이 변수의 결과를 출력하는 간단한 YAML 파일을 보자.
---
- name: Ansible Jinja2 Example
hosts: all
vars:
my_var: hongsnet
task:
- name: Debugging for my_var
debug:
msg: "my_var value is {{ my_var }}"