본문 바로가기
IT study/Linux

02. yaml 파일 설정

by 핸조 2022. 12. 10.
ansible 2.8 based CentOS 7.6

ansbile control node 요구사항

- Python2, or Python3 
- OS 는 Redhat, Debian, CentOS, MacOS, BSD 계열 리눅스
* Microsoft Windows 는 제어노드로는 사용불가
- ansible package
- ssh service

ansible managed node 요구사항

- Python2, or Python3
- ssh service(default로 sftp 사용, scp 로 변경가능하며, 변경하는경우에는
              ansible.cfg 수정)


ansible 설치
1. 컨트롤서버에 공개키를 생성
managed node 에 공개키를 업로드.

2. ansible 설치
yum -y install ansible
(패키지를 찾을수 없는 경우 epel-release 를 먼저 설치  yum -y install epel-release)

3. inventory 파일에 managed node 등록

디폴트 설정파일은 /etc/ansible/hosts 파일
[web_servers] : group name
192.168.10.20
node2.example.com

[db_servers]
node3.example.com

4. 설치 후 확인
ansible all -m ping
SUCESS 메세지가 출력이 되어야 한다.

* 관리대상 호스트에서 selinux 가 활성화 되어 있는경우에는
libselinux-python 패키지가 설치되어 있어야 한다.

* ansible raw 모듈은 파이썬이 필요없다.
- raw 모듈에 전달된 인수는 원격 shell을 통해 직접 실행된다.
python 이 설치안된 장비를 관리할 경우 유용하게 사용할수 있다.
단점은 멱등성을 보장할 수 없다.

ansible 특징
ansbile 은 다양한 워크플로우 및 환경에 맞게 조정할수 있는 오픈소스 자동화 플랫폼.
ansible 을 사용하면 Linux, Microsoft windows, Unix 를 실행하는 서버와
네트워크 장치를 포함하여 다양한 유형의 시스템을 관리할 수 있다.

- 멱등성
- agent 가 필요없다
- 설정은 비교적 이해하기 쉬운 yaml 파일을 사용한다
- ssh 와 같은 표준 네트워크 프로토콜을 사용한다.

ansible inventory
- ansible 에서 관리할 호스트 컬렉션을 정의. 호스트를 그룹에 할당하여
일괄적으로 관리할 수도 있다.
- 그룹은 하위 그룹을 포함할 수 있다.


정적인벤토리 - hosts 파일 및 yaml 파일에 설정.

hosts 파일에 설정

[test]
host1.test.com
host2.test.com
host3.test.com

[db_servers]
host4.test.com
192.168.10.100

[ftp_servers]
ftpsrv[1:5].example.com

[1:5] 는 1,2,3,4,5 를 의미한다.
ftpsrv[1:5].exampe.com
-> 
ftpsrv1.example.com
ftpsrv2.example.com
ftpsrv3.example.com
ftpsrv4.example.com
ftpsrv5.example.com

[db-ftpservers:chidren]
db_servers
ftp_servers

yaml 파일에 설정
- hosts: all
- hosts: host1.test.com
- hosts:
    one.example.com
    two.example.com
  dbservers:
    hosts:
      foo.example.com
      bar.example.com
  webservers:
    hosts:
      three.example.com
      four.example.com

동적인벤토리
- 외부 데이터베이스에서 제공하는 정보(Amazon EC2등...)를 사용하여 동적으로 생성

Ansible 설정 파일
- /etc/ansible/ansible.cfg
$HOME/.ansible.cfg
./ansible.cfg

우선 순위는 ./ansible.cfg , $HOME/.ansible.cfg , /etc/ansible/ansible.cfg
* $ANISIBLE_CONFIG 변수가 설정되어 있는 경우 이변수를 가장 먼저 참조한다.

ansible ad-hoc 명령 실행

ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
example)
ansible all -m ping
ansbile all -m ping -i ./inventory

ansible 모듈은 /usr/lib/python2.7/site-packages/ansible/modules 디렉토리에
저장되어 있다.
모듈에 대한 도움말은 ansible-doc 명령어로 확인할수 있다.
example)
ansible-doc -l ping

ansible all -m command -a 'hostname'

ansible myserver2.example.com -m user -a 'uid=1000 shell=/bin/bash state=present' (x)

ansible myserver2.example.com -m user -a 'name=user1 uid=1000 state=present' (o)

* name 은 생략할 수 없다. ansible-doc 참조

* command 모듈은 관리대상 호스트의 shell 로 처리되지 않는다. 그러므로 셀환경변수를 사용하거나 리디렉션,파이프등
셀의 기능은 사용할 수 없다.

managed node 의 shell 환경을 사용하려면 shell 모듈을 사용해야 한다.

ansible myserver2.example.com -m command -a 'echo $PATH' -u devops
ansible myserver2.example.com -m shell -a 'echo $PATH' -u devops

* raw 모듈은 모듈하위시스템을 거치지 않고 원격셀에서 직접 명령을 실행할 수 있다.
이는 python 을 설치할수 없는 시스템을 관리할때 유용하게 사용할수 있다.

ansible command line 주요 옵션
ansible --help

-i : inventory
-u : remote_user
-b(--become) : 
--become-method : 권한얻는방법, 디폴트는 sudo
--become-user : 이 사용자로 명령어 실행, default=root
--ask-become-pass(-K) :

권한 에스컬레이션

[실습]
제어노드에서 ansible servera -a 'head -n 1 /etc/shadow' -u usera
위의 명령이 성공적으로 실행되도록 usera 계정을 생성하고 설정하시오.


[playbook 작성]
Playbook 은 한개이상의 play를 포함하고 있으며
play는 순서가 지정된 작업의 집합니다.

ansible myserver2 -m user -a 'name=user1 uid=1000 state=present' 
이 ansible adhoc 명령을 playbook 으로 작성하면 아래와 같다.

---
- name : check exist user info
  hosts: myserver2
  tasks:
    - name: check user1 info
      user:
        name: user1
        uid: 1000
        state: present
...

플레이북 
- yaml 형식의 설정파일
- 확장자는 yml 또는 yaml 을 사용한다
- 입력을 할때 일정한 간격으로 들여쓰기를 해야 한다.
- 가독성을 위해서 빈줄을 추가할 수 있다.
- 들여쓰기에는 스페이스키만 사용할수 있고 tab 은 사용할수 없다.
* vim 을 사용하는 경우에는 환경설정파일에서 tab 키를 space 키처럼
사용할 수 있다.
autocmd FileType yaml setlocal autoindent tabstop=2 shiftwidth=2 expandtab
또는 autocmd FileType yaml setlocal ai ts=2 sw=2 et  로 생략해서 사용할수 있다.

플레이북 문법
--- 로 시작(생략가능)
... 로 종료(생략가능, 거의 사용되지 않는다)

yaml 리스트는 '-' 로 시작
play는 딕셔너리이다(연관배열,해시) - key: value
동일한 플레이의 key는 동일한 들여쓰기를 해야 한다.

playbook 형식
---
- name: playbook test
  hosts: servara
  tasks:
    - name: copy file
      copy: /etc/issue
      dest: /tmp/issue.txt
   
     - name: run command
       command: /bin/echo hello >> /tmp/issue.txt   

--------------------------------------------
playbook 실행

ansible-playbook test.yml

실행하기전에 문법을 체크하고 싶으면
ansible-playbook --syntax-check test.yml

      
ansible dry-run(실제 실행하지 않고 변경되는 내용을 알려준다)

ansible-playbook --check test.yml

--------------------------------------------
멀티 플레이 작성
---
- name : first play
  hosts: servera
  tasks:

- name: first task
  yum:
    name: httpd
    status: present

- name: second task
  yum
    name: vsftpd
    status: absent

- name : second play
  hosts: serverb
  tasks:

- name: first task
  service:
    name: mariadb
    enabled: true

---------------------------------------------------

'IT study > Linux' 카테고리의 다른 글

05. ansible addhook  (0) 2022.12.10
05. ansible vault  (0) 2022.12.10
04. ansible 실습  (0) 2022.12.10
03.yaml syntax 설정  (0) 2022.12.10
01. ansible 및 yaml 실습  (0) 2022.12.10