본문 바로가기

study/Ansible101 1기

Ansible101 1기 1주차

안녕하세요, 덴고입니다.

본격적으로 CloudNet@에서 주관하는 Ansible101 Study가 시작됐습니다.

거두절미하고 바로 스터디 내용을 공유하겠습니다.

 

 

Ansible은 쉽게 말해서 자동화 도구입니다. IT 업무를 코드 기반으로 작성하고 여려 환경에 동일하게 적용될 수 있도록 돕는 역할을 합니다.

앤서블 아키텍처를 살펴보면

그림처럼 제어노드와 관리 노드로 구성돼 있습니다.

 

제어노드는 앤서블이 설치되는 노드입니다. 이 노드에는 파이썬 모듈을 이용하기 때문에 파이썬이 필수로 설치돼 있어야 합니다.

 

관리노드는 앤서블이 제어하는 원격 시스템 또는 호스트를 의미합니다. 이 노드는 제어노드와 SSH 통신이 가능해야 하며 마찬가지로 파이썬이 설치돼 있어야 합니다.

 

인벤토리는 제어노드가 제어하는 관리 노드의 목록을 나열해 놓은 파일입니다. 인벤토리에 사전에 정의되어 있는 관리노드에만 접근할 수 있습니다. 또한 아래와 같이 그룹핑 할 수 있습니다. 인벤토리 작성법은 아래에서 자세히 설명하겠습다.

$ vi inventory
192.168.10.101

[WebServer]
web1.example.com
web2.example.com

[DBServer]
db1.example.com
db2.example.com

 

플레이 북(Play Book)은 관리노드에서 수행할 작업들을 YAML 문법을 이용해 순서대로 작성해 놓은 파일입니다. 이렇게 작성된 플레이북을 활용해 관리노드에 SSH로 접근해 작업을 수행합니다.

---
- hosts: webservers
  serial: 5  # 한 번에 5대의 머신을 업데이트하라는 의미
  roles:
  - common
  - webapp

- hosts: content_servers
  roles:
  - common
  - content

 

 

이제부터 본격적인 실습에 들어가겠습니다.

먼저, 제어노드에 앤서블을 설치합니다.

# 작업 기본 디렉터리 확인
whoami
pwd
/root/my-ansible

# 파이썬 버전 확인
python3 --version
Python 3.10.12

# 설치
apt install software-properties-common -y
add-apt-repository --yes --update ppa:ansible/ansible
apt install ansible -y

# 확인 : 책 버전(파이썬 3.11.2, jinja 진자 3.1.2)
ansible --version
ansible [core 2.15.8]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] (/usr/bin/python3)
  jinja version = 3.0.3
  libyaml = True

cat /etc/ansible/ansible.cfg
which ansible

# 책 저자 코드 확인
tree /root/my-ansible/Easy-Ansible/ -L 1
tree /root/my-ansible/Easy-Ansible/

 

위 코드대로 실행 후 확인해 보겠습니다.

 

설치가 잘 되었습니다.

 

위에서 설명한 것 처럼 이제 제어노드와 관리노드를 SSH연결을 해야합니다.

왜냐하면 앤서블은 로컬 사용자에게 개인 SSH 키가 있거나 관리 호스트에서 원격 사용자임을 인증 가능한 키가 구성된 경우 자동으로 로그인하기 때문입니다.

 

1. 먼저 ssh-keygen 명령어를 이용하여 SSH 키를 생성합니다.

tree ~/.ssh
watch -d 'tree ~/.ssh'

# Create SSH Keypair
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa

 

 

2. 공개 키를 관리 노드에 복사합니다.

# 공개 키를 관리 노드에 복사
for i in {1..3}; do ssh-copy-id root@tnode$i; done

# 복사 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i cat ~/.ssh/authorized_keys; echo; done

# ssh 접속 테스트
ssh tnode1
whoami
exit

ssh tnode2
exit

ssh tnode3
exit

 

호스트 선정

이제 인벤토리를 이용한 자동화 대상 호스트 설정을 하겠습니다.

방식은 다양합니다. IP나 호스트명 등을 통해 인벤토리 파일을 생성하면 됩니다.

# IP를 이용한 인벤토리 생성
##my-ansible/inventory
# 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 파일 확인
cat /etc/hosts

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

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


##### 역할에 따른 호스트 그룹 설정
cat /etc/ansible/hosts


######그룹별 호스트 설정
[webservers]
web1.example.com
web2.example.com

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


##여려 그룹을 호스트로 설정
[webservers]
web1.example.com
web2.example.com
192.0.2.42

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

[east-datacenter]
web1.example.com
db01.example.com

[west-datacenter]
web2.example.com
db02.example.com

[production]
web1.example.com
web2.example.com
db01.example.com
db02.example.com

[development]
192.168.0.42



##########중첩 그룹 설정
[webservers]
web1.example.com
web2.example.com

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

[datacenter:children]
webservers
dbservers


# IP 범위 설정 : 192.168.4.0 ~ 192.168.4.255 사이의 IP 범위를 표현
[defaults]
192.168.4.[0:255]

# 호스트명 범위 설정 : com01.example.com ~ com20.example.com 의 범위를 표현
[compute]
com[01:20].example.com

# DNS 범위 설정 : a.dns.example.com , b.dns.example.com , c.dns.example.com 을 의미함
[dns]
[a:c].dns.example.com

# IPv6 범위 설정 : 2001:db08::a ~ 2001:db08::f 사이의 IPv6 범위를 표현
[ipv6]
2001:db8::[a:f]

 

실습을 위해 인벤토리 그룹을 구성하겠습니다.

# inventory 그룹 구성
cat <<EOT > inventory
[web]
tnode1
tnode2

[db]
tnode3

[all:children]
web
db
EOT

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

 

실행 결과

 

 

 

위 명령어중 -i 는 직접적인 인벤토리 경로를 지정해주는 것 입니다. 

매번 지정하는 것이 번거롭기 때문에 

현재 프로젝트 디렉터리 내에 ansible.cfg 라는 앤서블 환경 설정 파일을 구성 시, -i 옵션을 사용하지 않아도 ansible.cfg 설정 파일에 정의된 인벤토리의 호스트 정보를 확인할 수 있습니다.

# ansible.cfg 파일 생성
cat <<EOT > ansible.cfg
[defaults]
inventory = ./inventory
EOT

# inventory 목록 확인
ansible-inventory --list | jq

 

아래를 보면 잘 확인이 되는 것을 볼 수 있습니다.

 

 

플레이북 작성

이제 진짜 Ansible을 이용하겠습니다.

참고로 '가시다'님은 플레이북 파일을 만들 때 직접 손으로 작성해보라고 강력 권고 하셨습니다.

전 스터디에 뒤쳐지고 싶지 않아서 손으로 직접 쳐보겠습니다.

 

먼저 플레이북 환경 설정이 필요합니다.

앤서플 프로젝트 디렉토리에서 ansible.cfg 파일을 생성하면 다양한 앤서블 설정을 적용할 수 있습니다.

키-값 쌍으로 정의된 설정이 포함되고 여러개의 섹션으로 구성됩니다.

섹션 제목은 대괄호로 묶여 있으며, 기본적인 실행을 위해 다음 예제와 같이 [defaults]와 [privilge_escalation] 두개의 섹션으로 구성합니다.

cat ~/my-ansible/Easy-Ansible/chapter_05.1/ansible.cfg

[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

 

 

 

실습을 위해서 아래와 같이 환경 설정을 합니다.

cat <<EOT > ansible.cfg
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

 

인벤토리 경로와 user등의 정보가 들어가 있습니다.

 

 

ping모듈을 통해서 호스트에 정상 연결을 확인해 보겠습니다. 참고로 네트워크상 ping을 날리는 것이 절대 아닙니다.

#
ansible -m ping web

#
ansible -m ping db

# 암호 입력 후 실행
ansible -m ping --ask-pass web
SSH password: <암호입력>

# root 계정 대신 ubnutu 계정으로 실행
ansible -m ping web -u ubuntu
ansible -m ping web -u ubuntu --ask-pass
ansible -m ping db -u ubuntu --ask-pass

 

매우 잘 됩니다. 다행입니다.

 

 

이제 playbook을 직접 손으로 쳐보겠습니다.

##my-ansible/first-playbook.yml
---
- hosts: all
  tasks:
    - name: Print message
      debug:
        msg: Hello CloudNet@ Ansible Study
        
        
###my-ansible/first-playbook-with-error.yml
---
- hosts: all
  tasks:
    - name: Print message
      debug:
      msg: Hello CloudNet@ Ansible Study

 

 

참고로 앤서블을 문법 검사 기능을 지원해줍니다.

ansible-playbook --syntax-check first-playbook.yml

 

손으로 직접 쳐보니 에러가 속출하는 것을 볼 수 있습니다.

 

다시 검사 후 실행해보겠습니다.

 

다행입니다. 정상 작동 했습니다.

 

 

이제는 서비스를 재 시작하는 플레이북을 작성해 보겠습니다.

###my-ansible/restart-service.yml

---
- hosts: all
  tasks:
    - name: Restart sshd service
      ansible.builtin.service:
        name: sshd
        state: restarted

 

참고로 상태등은 공식 홈페이지에서 더 자세히 공부할 수 있습니다.

state - https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html#parameter-state

 

ansible.builtin.service module – Manage services — Ansible Documentation

Forces a ‘global’ task that does not execute per host, this bypasses per host templating and serial, throttle and other loop considerations Conditionals will work as if run_once is being used, variables used will be from the first available host This a

docs.ansible.com

started : Start service httpd, if not started

stooped : Stop service httpd, if started

restarted : Restart service httpd, in all cases

reloaded : Reload service httpd, in all cases

 

 

모니터리을 실행 후 플레이북을 실행하겠습니다.

 

# (신규터미널) 모니터링 : 서비스 재시작 실행 여부 확인
ssh tnode1 tail -f /var/log/syslog

# 실행 전 check 옵션으로 플레이북의 실행 상태를 미리 점검 가능 : 출력 중 changed=1 확인
ansible-playbook --check restart-service.yml 


# 플레이북 실제 실행
ansible-playbook restart-service.yml
...

 

잘 보이시는 지 모르겠지만 정상적으로 restart가 된 것을 볼 수 있습니다.

 

.... 추가로 글을 작성했는데 저장을 안했네요.. 다시 작성해보겠습니다.

 

 

 

변수에 대해 알아보겠습니다.

앤서블은 변수를 사용하여 사용자, 설치하고자 하는 패키지, 재시작할 서비스, 생성 또는 삭제할 파일명 등 시스템 작업 시 사용되는 다양한 값을 저장할 수 있습니다.

이런 변수를 활용하면 얼마든지 플레이북을 재사용할 수 있으며, 사용자로부터 받은 값도 쉽게 적용할 수 있습니다.

앤서블에서 사용되는 변수는 그룹 변수, 호스트 변수, 플레이 변수, 추가 변수가 있으며 플레이 결과를 저장하기 위한 작업 변수도 있습니다.

 

일단 변수별 우선 순위는

추가변수(실행 시 파라미터) > 플레이 변수 > 호스트 변수 > 그룹 변수 입니다.

 

그럼 그룹변수에 대해 알아보겠습니다.

 

먼저 변수와 값을 선언합니다.

my-ansible/inventory

[web]
tnode1
tnode2

[db]
tnode3

[all:children]
web
db

[all:vars]
user=ansible

 

 

 

그리고 유저를 생성하는 플레이북을 실행

my-ansible/create-user.yml

---

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

 

결과를 보면 유저가 잘 생성된 것을 볼 수 있습니다.

 

 

멱등성을 확인해보기위해서 node1에서 유저를 다시 지우고 돌려보겠습니다,.

# tnode1 에 ansible 사용자 삭제 후 확인
ssh tnode1 userdel -r ansible
ssh tnode1 tail -n 2 /etc/passwd

# 실행
ansible-playbook create-user.yml

 

확인해보면

 

잘 들어가 있습니다.

 

호스트변수는 말 그대로 호스트에서만 사용할 수 있습니다.

my-ansible/inventory

[web]
tnode1
tnode2

[db]
tnode3 user=ansible1

[all:children]
web
db

[all:vars]
user=ansible

 

그리고 플레이북 생성

my-ansible/create-user1.yml

---

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

 

실행해 보면 잘 생성되 있습니다.

 

결과를 보면 node3에는 ansible 유저가 아닌 ansible1유저가 생성돼 있습니다. 다시말해서 호스트변수가 그룹변수보다 우선시 된다는 것을 알 수 있습니다.

 

 

이제 플레이북 변수를 알아보겠습니다.

my-ansible/create-user2.yml

---

- hosts: all
  vars:
    user: ansible2

  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present
      
# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i tail -n 3 /etc/passwd; echo; done

 

결과를 보면 플레이북 변수가 우선시 된 것을 볼 수 있습니다.

 

이 변수를 별도의 파일로 분리하여 정의한 후 플레이북에서 선언하는 방법으로 변수를 사용해보겠습니다.

my-ansible/vars/users.yml

mkdir vars
echo "user: ansible3" > vars/users.yml


###my-ansible/create-user3.yml
---

- hosts: all
  vars_files:
    - vars/users.yml

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

 

실행해보면 잘 들어가네요

 

 

이제 추가변수에 대해 알아보겠습니다. 추가변수는 우선순위가 제일 높습니다.

 

실행 시 -e(extra_vars 약자) 옵션으로 추가 변수 선언

my-ansible/create-user3.yml ← 바로 위 플레이 변수에서 작성한 플레이북임

ansible-playbook -e user=ansible4 create-user3.yml

# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i tail -n 5 /etc/passwd; echo; done

 

 

번외로 작업변수를 알아보겠습니다.

작업변수는 플레이북의 태스트 수행 결과저장. 특정 작업 수행 후 그 결과를 후속 작업에서 사용할 때 주로 사용됩니다.

  1. 파일 복사 후 수정, Create User 태스트에 register: result 라는 문구를 추가.
    • register를 선언하면 태스트를 실행한 결과를 register 다음에 나오는 result라는 변수에 저장하겠다는 의미가 됩니다.
    • 그리고 result라는 변수에 저장한 결과를 debug 모듈을 통해 출력합니다.
my-ansible/create-user4.yml

---

- hosts: db
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present
    register: result
  
  - ansible.builtin.debug:
      var: result

 

 

Ansible Vault

패스워드나 API 키 등 중요한 데이터들은 인벤토리 변수나 일반 앤서블 플레이북에 텍스트로 저장됩니다. 이때 앤서블 파일에 접근 권한이 있는 사용자라면 모두 파일 내용을 볼 수 있는데, 이런 파일은 외부로 유출될 수 있다는 보안상의 위험을 야기하게 됩니다. 따라서 앤서블은 사용되는 모든 데이터 파일을 암호화하고 암호화된 파일의 내용을 해독할 수 있는 Ansible Vault라는 기능을 제공합니다.

 

이제 암호화된 파일을 만들어보겠습니다.

[ansible-server] ansible-vault create 로 생성하려는 플레이북 파일명을 입력 → 해당 파일에서 사용할 패스워드 입력

my-ansible/mysecret.yml

# ansible-vault create 로 생성하려는 플레이북 파일 생성
ansible-vault -h
ansible-vault create mysecret.yml
New Vault password: P@ssword!
Confirm New Vault password: P@ssword!

##vi 에디터와 같이 파일을 편집할 수 있는 창으로 전환되면 아래와 같이 입력 후 저장하고 빠져나옵니다

user: ansible
password: P@ssword!

:wq


# 파일을 생성한 소유자만 읽고 쓸수 있음을 확인
ll -rtl mysecret.yml
-rw------- 1 root root 484 Dec 27 14:46 mysecret.yml

# ubuntu 유저로 파일 확인 시도
su - ubuntu -c 'cat /root/my-ansible/mysecret.yml'

# 파일 내용 확인 : 암호화되어 있음
cat mysecret.yml
$ANSIBLE_VAULT;1.1;AES256
38656334303839613837666364363938643032366561393032626330346430656537636634316632
6165353664396261373132636139383431643833636463650a653035663661623064363563356464
39663634653931396663396535313038643564356532306261376136313662306663383361346539
6635343333633265340a356630653934343938663432663232303837313137343063373739366534
32366631633234653938613130346539383936633338363865363539393935373736336330633235
3338663837623364316663393238663938613038666566306362

# 원래 파일 내용 확인(복호화)
ansible-vault view mysecret.yml
Vault password: P@ssword!   # 복붙 잘 안되면 직접 암호 입력하자

user: ansible
password: P@ssword!

 

 

파일을 이용한 암호화 만들어 보게습니다.

1. 별도의 암호가 저장된 파일 생성
my-ansible/vault-pass

echo 'P@ssw0rd!' > vault-pass


# ansible-vault create 로 생성하려는 플레이북 파일 생성
ansible-vault create --vault-pass-file ./vault-pass mysecret1.yml

#암호 묻지 않고 바로 에디터 창으로 전환 → 아래 내용 입력 후 저장하고 빠져나오기

user: ansible
password: P@ssword!

:wq


#생성된 파일 확인 : 접근 권한, 파일 내용 확인

# 파일을 생성한 소유자만 읽고 쓸수 있음을 확인
ll mysecret1.yml
-rw------- 1 root root 484 Dec 27 14:56 mysecret1.yml

# 파일 내용 확인 : 암호화되어 있음
cat mysecret.yml1

# 원래 파일 내용 확인(복호화)
ansible-vault view --vault-pass-file ./vault-pass mysecret1.yml

user: ansible
password: P@ssword!

 

 

기존 파일 암호화 해보겠습니다.

#1. 기존 평문 파일 암호화 설정 후 확인
my-ansible/create-user.yml

# 기존 평문 파일 확인
ll create-user.yml
-rw-r--r-- 1 root root 131 Dec 26 14:16 create-user.yml

# 기존 평문 파일 암호화 설정
ansible-vault encrypt create-user.yml
New Vault password: P@ssw0rd!
Confirm New Vault password: P@ssw0rd!

# 암호화 설정 후 확인 : 파일소유자만 읽고 쓸수 있음
ll create-user.yml
-rw------- 1 root root 873 Dec 28 04:18 create-user.yml

cat create-user.yml

2. 암호화된 파일 복호화(output 옵션) 설정 및 확인

ansible-vault decrypt create-user.yml --output=create-user-decrypted.yml

# 확인 : 암호화,복호화 파일은 파일 소유자만 읽고 쓸 수 있음
ll create-user*
cat create-user-decrypted.yml

# ubuntu 유저로 파일 확인 시도
su - ubuntu -c 'cat /root/my-ansible/create-user-decrypted.yml'


## 다시복호화
#
ansible-vault decrypt create-user.yml
cat create-user.yml

 

 

암호화된 파일의 패스워드 변경하기

# rekey 명령어로 변경 
ansible-vault rekey mysecret.yml
Vault password: P@ssw0rd!
New Vault password: NewP@ssw0rd!
Confirm New Vault password: NewP@ssw0rd!
Rekey successful


# 패스워드 입력 파일을 이용해 패스워드 변경
cat vault-pass
P@ssw0rd!

ansible-vault rekey --new-vault-password-file=./vault-pass mysecret.yml
Vault password: NewP@ssw0rd!
Rekey successful

 

 

암호화된 플레이북 실행해보겠습니다

## 암호화된 파일 내용 확인

# mysecret.yml 파일을 vars 디렉터리로 이동
mv ./mysecret.yml ./vars/

# view로 파일 내용 확인
ansible-vault view vars/mysecret.yml
Vault password: P@ssw0rd!
user: ansible
password: P@ssword!


#플레이북 작성
my-ansible/create-user5.yml

---

- hosts: db
  vars_files:
    - vars/mysecret.yml

  tasks: 
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present
      
      
#실행확인
# 실행
ansible-playbook create-user5.yml
ERROR! Attempting to decrypt but no vault secrets found


4. 암호화된 파일이 포함된 플레이북을 실행할 때는 vault-id @prompt 옵션 사용
# (터미널2) 모니터링
watch -d "ssh tnode3 tail -n 3 /etc/passwd"

# 실행
ansible-playbook --vault-id @prompt create-user5.yml
Vault password (default): P@ssw0rd!
...

# 패드워드 입력 없이 실행
cat vault-pass
ansible-playbook --vault-password-file=./vault-pass create-user5.yml

 

 

Facts

팩트 Facts는 앤서블이 관리 호스트에서 자동으로 검색변수(자동 예약 변수)입니다. 팩트에는 플레이, 조건문, 반복문 또는 관리 호스트에서 수집한 값에 의존하는 기타 명령문의 일반 변수처럼 사용 가능한 호스트별 정보가 포함되어 있습니다. 관리 호스트에서 수집된 일부 팩트에는 다음 내용들이 포함될 수 있습니다.

 

팩트를 사용해 보겠습니다.

my-ansible/facts.yml

---

- hosts: db

  tasks:
  - name: Print all facts
    ansible.builtin.debug:
      var: ansible_facts
      
#
ansible-playbook facts.yml

 

결과를 보면 엄청 많은 정보들이 출력됩니다.

 

여기서 특정 값만 추출해보겠습니다.

my-ansible/facts1.yml

---

- hosts: db

  tasks:
  - name: Print all facts
    ansible.builtin.debug:
      msg: >
        The default IPv4 address of {{ ansible_facts.hostname }}
        is {{ ansible_facts.default_ipv4.address }}

 

이렇게 특정 정보만 추출할 수 있습니다.

 

변수로 사용할 수 있는 앤서블 팩트는

 

구버전 신버전 두가지가 존재하는데 여기서 구버전을 꺼보겠습니다.

즉 팩트수집 끄기

팩트 수집을 위해 해당 호스트에 특정 패키지를 설치해야만 하는 경우가 있습니다. 그런데 간혹 특정 이유로 패키지를 설치할 수 없는 경우에는 앤서블도 팩트 수집을 할 수 없게 됩니다. 또는 사용자가 팩트 수집으로 인해 호스트에 부하가 걸리는 것을 원치 않을 수도 있습니다. 이런 경우에는 팩트 수집 기능을 비활성화 할 수 있습니다.

 

팩트 수집 실행 시 관리 호스트에 프로세스 확인

# (터미널2) tnode3에 SSH 접속 후 아래 모니터링
ssh tnode3
watch -d -n 1 pstree

# [ansible-server]에서 아래 플레이북 실행
ansible-playbook facts.yml
ansible-playbook facts.yml
ansible-playbook facts.yml


2. 플레이북 작성
my-ansible/facts3.yml

---

- hosts: db
  gather_facts: no

  tasks:
  - name: Print all facts
    ansible.builtin.debug:
      msg: >
        The default IPv4 address of {{ ansible_facts.hostname }}
        is {{ ansible_facts.default_ipv4.address }}
        
        
# 실행 결과 확인 : 팩트를 수집하지 않았는데, 팩트에서 수집해야만 하는 변수를 사용하려고 해서 에러가 발생
ansible-playbook facts3.yml


# 파일 복사
cp facts3.yml facts3-2.yml

# facts3-2.yml 파일 편집
---

- hosts: db
  gather_facts: no

  tasks:
  - name: Print message
    debug:
      msg: Hello Ansible World

# 실행 : TASK [Print all facts] 가 없다!
ansible-playbook facts3-2.yml
PLAY [db] ***************************************************************************

TASK [Print message] ****************************************************************
ok: [tnode3] => {
    "msg": "Hello Ansible World"
}
...


4. 이번에는 매뉴얼한 방법으로 플레이북에 팩트 수집을 설정해보겠습니다
my-ansible/facts4.yml

# 파일 복사
cp facts3.yml facts4.yml

# facts4.yml 파일 편집
---

- hosts: db
  gather_facts: no

  tasks:
  - name: Manually gather facts
    ansible.builtin.setup:

  - name: Print all facts
    ansible.builtin.debug:
      msg: >
        The default IPv4 address of {{ ansible_facts.hostname }}
        is {{ ansible_facts.default_ipv4.address }}
        
#
ansible-playbook facts4.yml
...
TASK [Manually gather facts] ********************************************************
ok: [tnode3]

TASK [Print all facts] **************************************************************
ok: [tnode3] => {
    "msg": "The default IPv4 address of tnode3 is 10.10.1.13"
}

 

 

이것으로 1주차 ansible 101 스터디를 마치겠습니다.

'study > Ansible101 1기' 카테고리의 다른 글

Ansible101 1기 3주차 두번째  (0) 2024.01.28
Ansible101 1기 3주차 첫번째  (0) 2024.01.28
Ansible101 1기 2주차 두번째  (0) 2024.01.14
Ansible101 1기 2주차 첫번째  (0) 2024.01.14
Ansible101 1기 실습환경 구성  (0) 2024.01.06