Ansible/Study

Ansible 기초 정리

식사법 2024. 1. 9. 10:31

1. Ansible 기초 용어 정리

1) 제어 노드 ( Control Node)

  • 관리 노드에 Ansible을 통해 명령을 전달하는 주체 대체로 Ansible 명령어는 이 제어노드를 통해 실행됨

2) 관리 노드 ( Managed Node )

  • 관리 노드의 PlayBook에 정의된 작업들을 실제로 수행하는 노드

3) 인벤토리 ( Inventory)

  • 관리 노드 및 playbook에 사용될 변수를 정의한 파일

4) 모듈 ( Modules )

  • PlayBook 작성시 작업( task ) 를 정의할 때 사용함

5) 플레이북 ( Playbook)

  • 관리노드에서 수행할 작업들을 Yaml 문법을 통해 정의해 둔 파일
용어 설명
제어 노드 (Control Node) 관리 노드에 Ansible을 통해 명령을 전달하는 주체
대체로 Ansible 명령어는 이 제어노드를 통해 실행됨
관리 노드( Managed Node) 관리 노드의 PlayBook에 정의된 작업들을 실제로 수행하는 노드
인벤토리 ( Inventory ) 관리 노드 및 관리노드에서 사용되는 변수가 정의되어 있는 파일
모듈 ( Modules) PlayBook 작성시 작업( task ) 를 정의할 때 사용함
플레이북 ( Playbook ) 관리노드에서 수행할 작업들을 Yaml 문법을 통해 정의해 둔 파일

2. 인벤토리 ( Inventory ) 설명

  • 관리 노드들에 대한 정보를 기입한다.

1) 관리 노드 설정

  • IP를 이용한 관리 노드 설정
# inventory 파일 생성
cat <<EOT > inventory
10.10.1.11
10.10.1.12
10.10.1.13
EOT

# inventory 검증 : -i 특정 인벤토리 지정
ansible-inventory -i ./inventory --list | jq
  • 호스트명을 이용한 관리 노드 설정 ( 단, /etc/hosts 상 노드와 ip 가 기입되어 있을 것)
# /etc/hosts 파일 확인
cat /etc/hosts

# inventory 파일 생성
cat <<EOT > **inventory**
tnode1
tnode2
tnode3
EOT

# inventory 검증
ansible-inventory -i ./inventory --list | jq

2) 관리 노드 그룹 설정

  • webservers 와 db-servers 라는 그룹 생성
    • 해당 그룹등록시 PlayBook 에서 Host 등록시 그룹명으로 여러 관리 노드에 작업 실행 가능하다.
[webservers]
10.10.1.11
10.10.1.13

[db-servers]
10.10.1.12
  • 중첩 그룹
    • 그룹 M 개를 1개의 그룹으로 묶을 수 있다
    • 단, :children 이라는 접미사를 추가하여아함
[webservers]
web1.example.com
web2.example.com

[db-servers]
db01.example.com
db02.example.com

[datacenter:children]
webservers
dbservers
  • 선언 간소화
#10.0.0.1~10.0.0.10 까지의 관리노드 선언
10.0.0.[1:10]

#test1, test2, test3 라는 이름의 관리 노드 선언
test[1:3]

3. 플레이북 ( Playbook ) 설명

중요) ansible.cfg 설정

  • ansible.cfg 이란 ansible명령어를 실행하면서 특정 옵션값을 미리 설정해 놓는 파일이다. 예시) inventory , playbook 등

1) 플레이북 작성 && 구조 설명 (주석 참조)

# 제어 노드에 메세지를 출력하고, 관리노드에 메세지를 출력하는 Playbook

- hosts: all #어떤 host에 task를 전달할 것인가
  tasks: # 작업 정의
    - name: Print message # task 명 지정
      **debug**: # 어떤 module을 사용하는지 명시
        **msg**: Hello CloudNet@ Ansible Study # msg 내용 기입
  tasks: # 작업 정의
        - name: shell module # 작업명 정의
            shell: | # 어떤 module을 사용하는지 명시
                echo "testtesttest" # 관리 노드에 전달할 명령어

2) 플레이북 실행

  • 플레이북 문법 체크
ansible-playbook --syntax-check first-playbook.yml
  • 플레이북 실행하기
ansible-playbook first-playbook.yml

PlayBook 실행

4. 변수 설명

1) 그룹 변수

  • 인벤토리에 정의된 호스트 그룹에 적용되는 변수
#inventory
[web]
tnode1
tnode2

[db]
tnode3

[all:children]
web
db

[all:vars]
user=ansible
  • [all:vars] 하위에 선언되며 이렇게 선언된 변수는 모든 관리 노드에 적용된다

2) 호스트 변수

  • 인벤토리에 정의된 호스트 하나에 적용되는 변수
#inventory
[web]
tnode1
tnode2

[db]
tnode3 user=ansible1

[all:children]
web
db

[all:vars]
user=ansible
  • [db] 하위의 tnode3에만 변수가 적용된다

3) 플레이 변수

  • 플레이북 내에서 선언되는 변수
#playbook.yml

- hosts: all 
    vars:
        - message: test
  tasks: 
    - name: Print message 
      debug: 
        msg: "{{msg}}"
  tasks: 
        - name: shell module 
            shell: | 
                echo "{{msg}}"
  • hosts 하위 vars에 message 라는 변수 선언

4) 추가 변수

ansible-playbook -e message=test test.yml
  • -e 를통해 변수 값 전달

번외) 변수 우선 순위

추가변수 > 플레이 변수 > 호스트 변수 > 그룹 변수

[도전과제1] Ansible 모듈을 활용하여 user 생성 및 삭제

1) 유저 생성 yml

- hosts: all
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present

PlayBook 실행

 

관리 노드에 정상적으로 leechad 유저 생성 확인

2) 유저 삭제 yml

- hosts: all
  tasks:
  - name: Delete User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present
      remove: yes

PlayBook 실행

 

관리노드에 leechad 유저 삭제 확인 가능

[도전과제2] Ansible 모듈을 활용하여 관리 노드의 uptime 시간 확인 하기

1) uptime 시간 체크 yml

- hosts: all
  tasks:
  - name: Utime
    ansible.builtin.shell: /usr/bin/uptime
    register: result

  - ansible.builtin.debug:
      var: result

각 관리 노드의 uptime 이 출력됨을 확인 가능

 

[도전과제3] Ansible 모듈을 활용하여 관리 노드의 Kernel Version 과 OS 종류 출력하기

1) Kernel Version 과 OS check yml

- hosts: all

  tasks:
  - name: Print all facts
    ansible.builtin.debug:
      msg: >
        The Kernel_version is {{ ansible_facts.kernel_version }} and os is {{ ansible_facts.lsb.description }}

 

각 관리 노드의 Kernel Version과 OS 버전이 출력됨을 확인가능