플레이북은 쿠버네티스의 yaml파일과 역할이 비슷하다.
목적은 명령어의 스크립트화, 자동화다.
ansible명령어 뭉치를 하나로 테마화 해서 플레이북을 만든다.
이것을 수백 수천대의 서버에 일괄 적용할 수 있는 것이 ansible이다.
플레이북 도움말
ansible-playbook --help
패키지 설치
sudo yum install vim-ansible vim-enhanced
플레이북 작성 연습 1
httpd에 대한 설치 및 설정 명령에 대해 플레이북을 만들어보자.
name, host, task 세가지 요소만 있다면 플레이북이 성립한다.
sudo vim test2.yaml
--- # playbook 시작 선언
- name: Playbook Name # Ex. Install packages for webserver ...
hosts: webservers # 작업대상(single or group)
tasks:
- name: Install httpd package # 작업명
yum: name=httpd state=present # module & arg
- name: Service for httpd
service: # module
name: httpd # arg list
state: started
enabled: yes
... # playbook 종료선언
플레이북을 실행해보자.
각 관리 노드별로 어떤 단계가 성공했는지 잘 표시된다.
ansible-playbook test2.yaml
curl node1
플레이북 작성 연습 2
sudo vi test1.yaml
--- # playbook 시작
- name: Playbook Name # Ex. Install packages for webserver ...
hosts: webservers # 작업대상(single or group)
tasks:
- name: Install httpd package # 작업명
yum:
name: "{{ packages }}" # arg를 변수로 지정
vars: # 변수 지정
packages:
- httpd
- httpd-tools
- name: Service for httpd
service: # module
name: httpd # arg list
state: started
enabled: yes
... # playbook 종료선언
ansible-playbook test1.yaml
트러블슈팅
ansible 실행 시, 퍼미션 오류가 난다면 yaml 파일 권한을 확인해본다.
기본적으로 644 권한을 주거나, 600 이라면 파일 소유자를 ansible 사용자로 변경해야 한다.
sudo chown admin
sudo chown admin
플레이북 작성 연습 3
vim prac.yaml
--- # playbook 시작선언
#패키지 설치
- name: Name of playbook
hosts: node1
tasks:
- name: Name of tasks
yum: name=httpd state=present
- name: Name of tasks1
yum:
name: net-tools
state: present
#서비스 데몬 실행
- name: start service httpd
service:
name: httpd
state: started
enabled: true
#index파일 변경
- name: copy index file
copy:
src: "/ansible/index.html" # content: 를 사용하여 간단한 문구만 전달도 가능
dest: "/var/www/html/"
... # playbook 종료선언
변경할 index 파일 작성
sudo vi index.html
<html>
<body>
Hello, raid-1 IT world!!
</body>
</html>
yaml 파일 문법 체크
ansible-playbook --syntax-check prac.yaml
문제가 없는 경우
문제가 있는 경우
시뮬레이션
ansible-playbook --check prac.yaml
플레이북 실행
ansible-playbook prac.yaml
서비스 데몬 상태 확인
ansible node1 -m shell -a "systemctl status httpd"
서비스 enabled 상태 확인
ansible node1 -m shell -a "systemctl list-unit-files | egrep http"
curl 확인
curl node1
Handlers
Handler는 함수와 비슷하게 작동한다.
Task가 할 수 있는 일을 똑같이 할 수 있으며,
Playbook의 Task에서 Handler를 호출하게되면 해당 Handler가 호출되어 실행되는 식으로 동작한다.
코드를 짤 때 반복되는 부분을 함수로 만들어서 필요할때마다 가지고 오듯이,
Handler도 비슷하게 작성하면 된다.
플레이북 작성 연습 3 - 핸들러 추가
인덱스 파일 변경 후 notify - handler를 통해 restart httpd 실행하는 내용 추가
(notify에서 쓰는 이름은 handler에서 정의해줘야 한다)
sudo vim prac.yaml
--- # playbook 시작선언
#패키지 설치
- name: Name of playbook
hosts: node1
tasks:
- name: Name of tasks
yum: name=httpd state=present
- name: Name of tasks1
yum:
name: net-tools
state: present
#서비스 데몬 실행
- name: start service httpd
service:
name: httpd
state: started
enabled: true
#인덱스 파일 변경 + 핸들러 리스타트
- name: copy index file
copy:
src: "/ansible/index.html"
dest: "/var/www/html/"
notify: restart httpd # tasks 실행 후 handler 실행
#핸들러 리스타트 정의
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
... # playbook 종료선언
ansible-playbook --check prac.yaml
플레이북 작성 연습 3 - 페이지 체크 추가
name-host-task 를 한 플레이북 안에서 여러번 실행할 수 있다. 다중 플레이
--- # playbook 시작선언
- name: Name of playbook # play 1
hosts: node1
tasks:
- name: Name of tasks
yum: name=httpd state=present
- name: Name of tasks1
yum:
name: net-tools
state: present
- name: start service httpd
service:
name: httpd
state: started
enabled: true
- name: copy index file
copy:
src: "/ansible/index.html"
dest: "/var/www/html/"
notify: restart httpd # tasks 실행 후 handler 실행
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
#페이지 체크
- name: Name of playbook-1 # play 2
hosts: node1
tasks:
- name: Check main page
uri:
status_code: 200 # 정상 출력
url: http://node1
return_content: yes
... # playbook 종료선언
http 상태 코드
https://developer.mozilla.org/ko/docs/Web/HTTP/Status
상태체크시 페이지 체크부분은 스킵된다.
ansible-playbook --check prac.yaml
ansible-playbook prac.yaml
'Ansible' 카테고리의 다른 글
Ansible Roles (0) | 2023.01.10 |
---|---|
Ansible-Vault (0) | 2023.01.09 |
Ansible-Console (0) | 2023.01.09 |
Ansible 명령어 실습 (0) | 2023.01.06 |
미니프로젝트- awx 설치 (0) | 2023.01.05 |