주석 사용 목적: 코드 비활성화(나중에 사용을 위한), 설명
#
을 사용하는 방식: 줄 전체 주석;
을 사용하는 방식: ;
이후 문자 전부 주석ansible 의 기능 (어떤 명령어가 아닌)
애드혹 명령어
ansible host-pattern -m module [-a module-argument] [-i inventory]
ad-hoc 디렉토리 생성
mkdir ad-hoc
cd ad-hoc
inventory 파일 작성
vim inventory
192.168.56.102
ansible.cfg 파일 작성
[defaults]
inventory = ./inventory
ansible all -m ping
ansible.cfg 에서 remote_user 미 설정 시 master에서 명령어 실행한 유저로 work 노드에서 실행함
ansible-doc ping
python 2.7 이상이어야 하는 이유를 위 출력을 보면 알 수 있음. (module 사용 위함)
파일모듈
소프트웨어 패키지 모듈
시스템 모듈
Net Tools 모듈
모듈 사용을 위해 관리 호스트에서 사용자의 아이디, uid 확인
ansible -m user -a 'name=jin uid=1000 state=present' 192.168.56.102
ansible -m command -a /usr/bin/hostname 192.168.56.102
-> 단순한 명령 실행 (프로그램 실행). 쉘 환경 변수 등 사용X
= ansible -m shell -a hostname 192.168.56.102
-> 쉘 환경에서 명령어 실행함. 쉘 환경 변수 등 사용 가능
ansible -m command -a set 192.168.56.102
ansible -m shell -a set 192.168.56.102
config 파일에 넣었던 항목을 애드혹에서 명령어로 작성 가능
인벤토리: -i
remote_user: -u
become: -b (넣어주면 true)
become_method: --become-method
become_user: --become-user
cd: -K (넣주면 true)
새로운 키 생성
ssh-keygen -f ~/.ssh/ad-hoc-key
키 전달
ansible 192.168.56.102 -i inventory -m copy -a 'src=~/.ssh/ad-hoc-key.pub dest=~/.ssh/authorized_keys' -u=jin -b --become-method=sudo --become-user=jin -K
애드혹 기능과 플레이북 비교
애드혹
ansible -m user -a 'name=jin uid=1000 state=present' 192.168.56.102
플레이북 작성
mkdir playbook-adhoc
cd playbook-adhoc
vim inventory
192.168.56.102
vim ansible.cfg
[defaults]
inventory = ./inventory
규칙
---
- name: user check
hosts: 192.168.56.102
tasks:
- name: user exists with uid 1000
user:
name: user
uid: 1000
state: present
#present 존재하지 않으면 설치 (존재 여부 확인)
#latest 존재 여부 상관없이 최근 버전으로 업데이트 (최신 버전 유지)
- name: user exists with uid 1000
user:
name: user01
uid: 1000
state: present
+) 플레이북 작성 시 작업의 순서를 지켜서 작성해야 함
관리 호스트에서 httpd 패키지 제거
sudo yum -y remove httpd
실습을 위한 셋팅
mkdir playbook-webserver
cd playbook-webserver
vim inventory
192.168.56.102
vim ansible.cfg
[defaults]
inventory = ./inventory
vim webserver.yml
// yml 파일로 해봄
---
- name: play to setup web server
hosts: 192.168.56.102
tasks:
- name: latest httpd version installed
yum:
name: httpd
state: latest
---
- name: play to setup web server
hosts: 192.168.56.102
become: yes # true 와 같음
tasks:
- name: latest httpd version installed
yum:
name: httpd
state: latest
권한 문제로 become 항목 추가 (config 파일에 넣으면 전체 플레이북에 적용, 위에처럼 작성하면 해당 플레이북에만 적용)
작업 결과 확인
ansible-playbook -v [filename.yaml]
-vv
: 작업 결과와 작업 구성
-vvv
: 관리 호스트의 연결 정보까지 확인
-vvvv
: 스크립트를 사용하기 위한 사용자 정보 및 플러그인 사용 정보까지 확인
문법 확인
ansible-playbook --syntax-check [filename.yaml]
예행 연습 확인
권한 상승과 같은 보안 부분은 테스트하지 않음
ansible-playbook -C [filename.yaml]
제어 노드에서 플레이북 실행
key.pub 내용 authorized_keys 에 넣어주기
cat .ssh/id_rsa.pub > .ssh/authorized_keys
no password 권한 추가
sudo vim /etc/sudoers.d/user-sudoers
jin ALL=(ALL) NOPASSWD:ALL
디렉토리 생성
mkdir playbook-multi
cd playbook-multi
인벤토리 파일 작성, 설정 파일 작성
vim inventory
localhost
192.168.56.102
vim ansible.cfg
[defaults]
inventory = ./inventory
플레이북 작성
---
- name: first play
hosts: localhost
become: yes
tasks:
- name: first task
yum:
name: httpd
state: present
- name: second task
service:
name: httpd
enabled: true
- name: second play
hosts: 192.168.56.102
become: yes
tasks:
- name: first task
yum:
name: mariadb-server
state: present
- name: second task
service:
name: mariadb
enabled: true
vim playbook-lineinfile.yml
---
- name: /etc/hosts is up to date
hosts: 192.168.56.102
become: true
tasks:
- name: master in /etc/hosts
lineinfile:
path: /etc/hosts
line: '192.168.56.101 master'
state: present
worker node 에서 확인
+) 모듈 확인
모듈 목록 확인ansible-doc -l [| grep yum]
모듈 자세히 확인ansible-doc [module name]
+) yaml 파일 형식을 한줄로 작성할 때는 한칸 공백으로 구분
service:name=httpd enabled=true state=started...
변수의 목적
변수의 우선순위
낮은것 ------------------- 높은것 순
플레이북에서 변수를 지정하는 방법
- hosts: all
vars:
user: user
home: /home/user
---
- hosts: all
vars:
user: jin
home: /home/jin
tasks:
- name: print user variable
debug:
var: user # 지정해준 jin
- name: print home variable
debug:
var: home # 지정해준 /home/jin
inventory 에 localhost, 192.168.56.102 두개를 작성해줬기 때문에 2 개씩 결과가 나옴
플레이북에서 파일 내 변수를 지정하는 방법
많이 사용
----user.yaml----
user: user
home: /home/user
-----------------
- hosts: all
vars_files:
user.yaml
# user.yml
user: jin
home: /home/jin
# playbook-vars-files.yaml
- hosts: all
vars_files:
- user.yml
tasks:
- name: print user variable
debug:
var: user
- name: print home variable
debug:
var: home
httpd 를 변수로 지정하고 실행하는 플레이북 작성 및 실행
vim playbook-httpd-vars.yml
---
- name: httpd start
hosts: all
vars:
service: httpd
tasks:
- name: httpd start
service:
name: {{ service }}
# 위에 있는 service 와 겹쳐서 오류 발생 -> " " 로 묶어주면 변수로 받아들임
state: started
httpd 실행이 안됨
---
- name: httpd start
hosts: all
become: yes # 추가
vars:
service: httpd
tasks:
- name: httpd start
service:
name: {{ service }}
state: started
become 추가 후 실행 완료
왜지?
systemctl 명령어이기 때문에 root 권한이 필요함
systemctl status httpd
로 두 노드에서 httpd가 active 상태를 확인함
playbook 에 become: yes
만 작성 시 나머지 요소는 default 값으로 설정됨
아래에서 default 값을 확인할 수 있음
(/etc/ansible/ansible.cfg)
vim inventory
localhost hostname=master
192.168.56.102 hostname=worker
vim playbook-inventory.yaml
---
- name: inventory vars check
hosts: all
tasks:
- name: vars check
debug:
var: hostname
우선순위에 따라 변수를 찾다 찾은 곳이 inventory 파일
ansible-playbook inventory-httpd.yml -e "hostname=user
위와 같이 작성 시 일회성 변수임