플레이북을 사용하여 대상 호스트 집합에 대해 여러 개의 복잡한 작업을 쉽고 "반복적"으로 실행할 수 있다
play(플레이)는 지정된 작업 집합으로, 인벤토리에서 선택한 호스트에 대해 실행해야 합니다. playbook(플레이북)은 순서대로 실행할 1개 이상의 플레이 목록을 포함합니다.
#sudo apt install vim -y
#vi ~/.vimrc (홈 디렉터리에서)

#vi site.yml


작동 확인

앤서블은 멱등성이 특징이므로 플레이북을 여러번 실행하는게 안전하다
플레이북을 실행한 경우 변경사항이 있으면 changed가 true고 없으면 changed가 false다
실행전 플레이북 구문 체크
#ansible-playbook --syntax-check playbook.yml
#ansible-playbook -C playbook.yml
린트(점검도구)를 이용한 코드 등 체크
#ansible-lint playbook.yml
< 작업 실행>
플레이북의 작업 실행 순서는 다음과 같다.
1. Ansible은 기본적으로 호스트의 패턴과 일치하는 모든 시스템에 대해 각 작업을 순서대로 실행한다.
2. 각 작업은 지정한 모듈 옵션을 사용하여 모듈을 실행한다.
3. 하나의 작업이 호스트 패턴과 일치하는 모든 시스템에서 완료되면 다음 작업으로 이동한다.
4. 특정 호스트에서 작업이 실패하면 해당 호스트는 작업이 더 남아 있더라도 제외한다.
play 1
task1 -> 1 2 3 4
task2 -> 1 2 3 4
1번 작업이 실패한 경우 다음 task에서도 작업을 수행하지 않음.
play 1
task1 -> 1 2 3 4
task2 -> x 2 3 4
#vi site1.yml

files/index.html 을 만들어야지 실행이 됨.

디렉터리를 사용하여 호스트 및 그룹 변수 채우기
호스트 및 호스트 그룹에 대해 변수를 정의할 수 있는 기본 방법은 인벤토리 파일 또는 디렉터리와 같은 작업
디렉터리에 group_vars 및 host_vars의 두 개 디렉터리를 생성하는 것입니다. 이러한 디렉터리는 그룹
변수와 호스트 변수를 각각 정의한 파일이 들어 있습니다.
인벤토리 파일보단 해당 디렉터리 사용하여 인벤토리 변수(호스트 변수, 그룹 변수) 정의하는 것을 권장함
인벤토리 파일을 작업하기 어렵게 만들고, 같은 파일에서 호스트와 변수에 대한 정보가 합쳐지고 사용되지 않는 구문을 사용하는 몇 가지 단점
호스트 변수가 그룹변수보다 우선하지만, 플레이북에서 정의한 변수가 이 두 변수보다 우선합니다.

#vim playbook.yml



비밀번호 파일을 따로 생성해서 vault파일 생성.

암호화된 파일 편집


암호화된 파일 복호화
#ansible-vault decrypt secret.yml
다시 암호화
#ansible-vault encrypt secret.yml
비밀번호 다시 설정
#ansible-vault rekey secret.yml
파일로 암호화된 비밀번호 다시 설정

prompt 방법. (직접 비밀번호 설정.)
prod@prompt의 prod부분에는 생성할 id를 적어주면 된다.

dev 방법. (파일로 비밀번호 설정.)
dev@prompt의 dev부분에는 생성할 id를 적어주면 된다.

#ansible-vault create --vault-id prod@prompt pwdfile

#vi create_user_vault.yml

단일볼트 패스워드로 묻기 (여기서는 암호화된 파일 pwdfile 하나만 생성했기 때문에 단일볼트로 물어봐도 된다. 단, 권장하진 않음.)
#ansible-playbook --ask-vault-pass create_user_vault.yml

Vault ID를 사용하는 멀티 볼트 패스워드로 묻기

Ansible facts는 Ansible이 관리 호스트에서 자동으로 검색한 변수, 관리 호스트의 정보를 가지고 있는 변수
관리 호스트에 대해 수집된 일부 팩트에는 다음이 포함될 수 있습니다.
• 호스트 이름
• 커널 버전
• 네트워크 인터페이스
• IP 주소
• 운영 체제 버전
• 여러 환경 변수
• CPU 개수
• 사용 가능한 메모리
• 사용 가능한 디스크 공간
팩트는 관리 대상 호스트의 상태를 검색하고 해당 상태에 따라 수행할 조치를 결정하는 편리한 방법
일반적으로 모든 플레이는 팩트를 수집하기 위해 첫 번째 작업 이전에 setup 모듈을 자동으로 실행합니다.
그러면 Ansible 2.3 이상에서는 Gathering Facts 작업으로 보고함
set 모듈을 이용해 팩트 변수를 확인할 수 있다.
#ansible all -m setup

관리 호스트에 대해 수집된 팩트를 확인하는 한 가지 방법은 팩트를 수집하고 debug 모듈을 사용하는 짧은
플레이북을 실행하여 ansible_facts 변수의 값을 출력하는 것
ex)

앤서블 팩트 예시
ansible_facts["all_ipv4_addresses"]
ansible_facts.all_ipv4_addresses
ansible_all_ipv4_addresses
ansible_distribution
ansible_facts["distribution"]
ansible_local
ansible_facts["ansible_local"]
짧은 호스트 이름 ansible_facts['hostname']
정규화된 도메인 이름 ansible_facts['fqdn']
기본 IPv4 주소(라우팅 기반) ansible_facts['default_ipv4']['address']
애드혹 setup 필터로 쓰려면 ansible_default_ipv4 로 해야함.
모든 네트워크 인터페이스의 이름 목록 ansible_facts['interfaces']
/dev/sda1 디스크 파티션의 크기 ansible_facts['devices']['sda']['partitions']['sda1']['size']
DNS 서버 목록 ansible_facts['dns']['nameservers']
현재 실행되고 있는 커널의 버전 ansible_facts['kernel']



사용자 정의 팩트는 각 호스트별 사용자가 직접 정적 팩트 변수를 선언할 수 있다. 이렇게 정의된 사용자 정의 팩트는 ansible_local 변수로 참조 가능하다.
사용자 정의 팩트를 정의하는 방법은, 각 관리 노드의 /etc/ansible/facts.d 디렉토리에 JSON 또는 INI 파일 형식으로 *.fact파일을 생성한다.
ex)
#vim custom.fact

#vim setup_facts.yml

#ansible-playbook setup_facts.yml
#ansible internetweb -m setup -a "filter=ansible_local"

1번 서버 결과.

만든 사용자 정의 팩트로 playbook 작성.
#vim playbook.tml

#ansible-playbook playbook.yml
#ansible internetweb -m command -a 'systemctl status httpd'

1번 서버 결과

특수 변수는 미리 예약되어 있으며 사용자가 직접 설정할 수 없다. Ansible은 특수 변수의 값을 현재 상태를 반영하도록 재정의 한다.
ex) hostvars, groups, inventory_hostname