Name
Last commit
Last update
..
DBMS vm init
INFRA NTP, modify
MISC ansible, 2021-03-08, update16
OS NTP, modify
SECURE secure fix complete
USER ansible, 2021-03-08, update9
VM vm init
WEB web, modify
README.md file_fetch init

logo

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 }}"