[IaC] μ•€μ„œλΈ”(Ansible) κ°œλ… 및 μ„€μΉ˜

2025. 12. 23. 21:07Β·Cloud/IaC

λ‹€μŒ 글은 Cloud Wave ꡐ윑 λ‹Ήμ‹œ λ‚΄μš©μ„ μ°Έκ³ ν•΄ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

Ansibleμ΄λž€?

μ•€μ„œλΈ”μ€ μ˜€ν”ˆ μ†ŒμŠ€ μžλ™ν™” ν”Œλž«νΌμ΄λ‹€. μžλ™ν™” μž‘μ—…μ„ κ΄€λ¦¬ν•˜κ³  λ‹€μ–‘ν•œ μ›Œν¬ν”Œλ‘œμš° 및 ν™˜κ²½μ— 맞게 μ‘°μ •ν•  수 μžˆλ‹€. 처음 μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžμ˜ κ²½μš°μ—λ„ 생산성을 높이기 μœ„ν•΄ 맀우 λΉ λ₯΄κ²Œ ν™œμš©ν•  수 μžˆλ‹€. μ•€μ„œλΈ”μ€ λ‹€μŒκ³Ό 같은 μ„Έ κ°€μ§€ νŠΉμ§•μ„ κ°–λŠ”λ‹€.

  • μ•€μ„œλΈ”μ€ κ°•λ ₯ν•˜λ‹€.
    ꡬ성 관리 μ›Œν¬ν”Œλ‘œμš° μžλ™ν™”, λ„€νŠΈμ›Œν¬ μžλ™ν™”μš© μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 배포할 수 μžˆλ‹€. κ·Έλž˜μ„œ 전체 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 라이프 사이클을 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ ν•  수 μžˆλ‹€.
  • μ•€μ„œλΈ”μ€ μ—μ΄μ „νŠΈκ°€ ν•„μš” μ—†λ‹€.
    일반적으둜 μ•€μ„œλΈ”μ€ OpenSSH λ˜λŠ” WinRM을 μ‚¬μš©ν•˜μ—¬ κ΄€λ¦¬ν•˜λŠ” ν˜ΈμŠ€νŒ…μ„ μ—°κ²°ν•˜κ³  λͺ¨λ“ˆμ΄λΌλŠ” μ†Œν˜• ν”„λ‘œκ·Έλž¨μ„ λ‚΄λ³΄λ‚΄μ„œ ν•΄λ‹Ή ν˜ΈμŠ€νŠΈμ— μ—°κ²°ν•œλ‹€. μ΄λŸ¬ν•œ ν”„λ‘œκ·Έλž¨μ€ μ‹œμŠ€ν…œμ„ μ›ν•˜λŠ” νŠΉμ • μƒνƒœλ‘œ λ§Œλ“œλŠ” 데 μ‚¬μš©μ΄ 되고 μž‘μ—…μ„ μ™„λ£Œν•˜λ©΄ μ œκ±°λœλ‹€. μ—μ΄μ „νŠΈλ‚˜ μΆ”κ°€ μ‚¬μš©μž μ§€μ • λ³΄μ•ˆ 인프라가 μ—†κΈ° λ•Œλ¬Έμ— Ansible은 훨씬 효율적이고 μ•ˆμ „ν•˜λ‹€.
  • μ•€μ„œλΈ”μ€ κ°„λ‹¨ν•˜λ‹€.
    μ•€μ„œλΈ” μ½”λ“œλŠ” μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” μžλ™ν™”λ₯Ό μ œκ³΅ν•œλ‹€. 즉, μ‚¬λžŒμ΄ 읽기 μ‰¬μš°λ©° μ΄ν•΄ν•˜κ³  λ³€κ²½ν•  수 μžˆλŠ” μžλ™ν™” 도ꡬ이닀. μž‘μ„±ν•˜λŠ λ°λŠ” νŠΉλ³„ν•œ μ½”λ”© 기술이 ν•„μš”ν•˜μ§€ μ•Šλ‹€. κ·Έλž˜μ„œ 처음 μ•€μ„œλΈ”μ„ μ ‘ν•˜λŠ” μ‚¬μš©μžλ“€λ„ 금방 λ°°μ›Œμ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

Ansible μ•„ν‚€ν…μ²˜

μ•€μ„œλΈ”μ„ κ΅¬μ„±ν•˜λŠ” λ…Έλ“œλŠ” μ œμ–΄ λ…Έλ“œμ™€ 관리 ν˜ΈμŠ€νŠΈλΌλŠ” 두 κ°€μ§€ μœ ν˜•μœΌλ‘œ κ΅¬μ„±λœλ‹€. μ•€μ„œλΈ” νŒ¨ν‚€μ§€λŠ” μ œμ–΄ λ…Έλ“œμ— μ„€μΉ˜ν•˜κ³  μ €μž₯λ˜μ–΄ μžˆλŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. 관리 ν˜ΈμŠ€νŠΈλŠ” 인벀토리라고 λΆ€λ₯΄λŠ” νŒŒμΌμ— λ‚˜μ—΄λ˜μ–΄ 있으며 μ‹œμŠ€ν…œμ„ 그룹으둜 κ΅¬μ„±ν•΄μ„œ 보닀 μ‰½κ²Œ 일괄 관리할 수 μžˆλ‹€. μΈλ²€ν† λ¦¬λŠ” ν…μŠ€νŠΈ νŒŒμΌμ— μ •μ μœΌλ‘œ μ •μ˜ν•˜κ±°λ‚˜ 슀크립트λ₯Ό μ‹€ν–‰ν•΄μ„œ μ™ΈλΆ€ μ†ŒμŠ€μ—μ„œ κ·Έλ£Ή 및 호슀트 정보λ₯Ό 가져와 λ™μ μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€. Ansible을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ μž‘μ„±λœ μ½”λ“œλ₯Ό κ°€μ§„ 파일이 ν•„μš”ν•˜λ©° 이것은 크게 3κ°€μ§€ μœ ν˜•μ΄ μžˆλ‹€.

  • κ΅¬μ„±νŒŒμΌ
  • 인벀토리 파일
  • ν”Œλ ˆμ΄λΆ 파일

μ‚¬μš©μžλŠ” μ„Έκ°€μ§€ μœ ν˜•μ˜ νŒŒμΌμ„ μ €μž₯ν•  μž‘μ—… 디렉터리λ₯Ό λ”°λ‘œ μƒμ„±ν•˜κ³  νŒŒμΌμ΄λ‚˜ ν•˜μœ„ λ””λ ‰ν„°λ¦¬λ‘œ μœ„μΉ˜μ‹œν‚¨λ‹€.


Ansible μ„€μΉ˜

μ•€μ„œλΈ”μ€ communityμ—μ„œ μ œκ³΅ν•˜λŠ” 무료 버전과 redhatμ—μ„œ μ œκ³΅ν•˜λŠ” 유료 버전이 μžˆλ‹€. λ‚˜λŠ” 무료 버전을 μ„€μΉ˜ν•  것이닀. 그리고 μ•€μ„œλΈ” 엔진은 Python으둜 μž‘μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ— 버전에 λ§žλŠ” Python νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€.

Pythonκ³Ό pip이 μ„€μΉ˜λ˜μ–΄ μžˆλ‹€λ©΄ λ‹€μŒ λͺ…λ Ήμ–΄λ‘œ κ°„λ‹¨ν•˜κ²Œ μ„€μΉ˜ν•  수 μžˆλ‹€. λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œμΈ 경우 λ¦¬λˆ…μŠ€ 별 νŒ¨ν‚€μ§€ 관리 도ꡬλ₯Ό 톡해 μ„€μΉ˜ν•  수 μžˆλ‹€. 그리고 μ„€μΉ˜ν•œ ν›„ ν™•μΈν•˜κΈ° μœ„ν•΄ 버전 정보λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€.

pip install ansible

# RHEL 기반
yum install epel-release
yum install ansible

# Ubuntu
apt-get install software-properties-common
apt-add-repository -y ppa:ansible/ansible
apt-get update
apt-get install -y ansible

ansible --version

κ΅¬μ„±νŒŒμΌ

μ‚¬μš©μžλŠ” Ansible을 μ‚¬μš©ν•˜κΈ° 전에 μ—°κ²° μ„€μ •μ΄λ‚˜ κΆŒν•œ μ„€μ • 등을 λ³€κ²½ν•  수 μžˆλ‹€. Ansible의 λ™μž‘λ°©λ²•μ„ μ„€μ •ν•˜λŠ” νŒŒμΌμ„ κ΅¬μ„±νŒŒμΌμ΄λΌκ³  λΆ€λ₯΄λ©° 이 νŒŒμΌμ€ 기본적으둜 /etc/ansible/ansible.cfg에 μœ„μΉ˜ν•΄ μžˆλ‹€. ν•˜μ§€λ§Œ 보톡 일반적인 경우 μ‚¬μš©μžκ°€ ν”„λ‘œμ νŠΈ λ³„λ‘œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μž‘μ—… 디렉터리λ₯Ό λ”°λ‘œ 생성해 ꡬ성 νŒŒμΌμ„ κ΄€λ¦¬ν•œλ‹€.

Ansible ꡬ성 νŒŒμΌμ€ 각 μ„Ήμ…˜μ— ν‚€-κ°’ 쌍으둜 μ •μ˜λœ 섀정이 ν¬ν•¨λœ μ—¬λŸ¬ 개의 μ„Ήμ…˜μœΌλ‘œ κ΅¬μ„±λ˜λ©° μ„Ήμ…˜ 제λͺ©μ€ λŒ€κ΄„ν˜Έλ‘œ λ¬Άμ—¬ μžˆλ‹€. λ‹€μŒμ€ κ°€μž₯ 일반적으둜 κ΄€λ¦¬ν•˜λŠ” μ„Ήμ…˜κ³Ό λ‚΄μš©μ΄λ‹€.

[defaults] #  μ„Ήμ…˜ 이름. 기본적인 λ‚΄μš©μ„ μ„€μ •
inventory = ./inventory # 인벀토리 파일 경둜 μ§€μ •
remote_user = user # 관리 ν˜ΈμŠ€νŠΈμ— μ—°κ²°ν•  λ•Œ μ‚¬μš©ν•  μ‚¬μš©μž 이름 μ§€μ •(μ§€μ •ν•˜μ§€ μ•Šμ€ 경우 ν˜„μž¬ μ‚¬μš©μž μ΄λ¦„μœΌλ‘œ μ§€μ •)
ask_pass = false # 관리 ν˜ΈμŠ€νŠΈμ— ssh μ—°κ²°ν•  λ•Œ μ•”ν˜Έλ₯Ό λ¬»λŠ” λ©”μ‹œμ§€ ν‘œμ‹œ μ—¬λΆ€ μ§€μ •

[privilege_escalation] # κΆŒν•œ μƒμŠΉμ„ μœ„ν•œ μ‚¬μš©μž μ „ν™˜ μ„€μ •
become = true # μ—°κ²° ν›„ 관리 ν˜ΈμŠ€νŠΈμ—μ„œ μžλ™μœΌλ‘œ μ‚¬μš©μžλ₯Ό μ „ν™˜ν• μ§€ μ—¬λΆ€ μ§€μ •(일반적으둜 root둜 μ „ν™˜)
become_method = sudo # μ‚¬μš©μž μ „ν™˜ 방식 μ§€μ •(일반적으둜 κΈ°λ³Έκ°’ sudoλ₯Ό μ‚¬μš©, suλŠ” μ˜΅μ…˜)
become_user = root # 관리 ν˜ΈμŠ€νŠΈμ—μ„œ μ „ν™˜ν•  μ‚¬μš©μžλ₯Ό μ§€μ •(일반적으둜 기본값인 root)
become_ask_pass = false #become_method 맀개 λ³€μˆ˜μ— λŒ€ν•œ μ•”ν˜Έλ₯Ό λ¬»λŠ” λ©”μ‹œμ§€ ν‘œμ‹œ μ—¬λΆ€ μ§€μ •

μ‚¬μš©μžκ°€ ꡬ성 νŒŒμΌμ— μ„€μ •λœ λ‚΄μš©μ„ 확인할 수 μžˆλ„λ‘ `ansible-config view`λͺ…λ Ήμ–΄λ₯Ό μ§€μ›ν•œλ‹€.

μ—°κ²° μ„€μ •

Ansible은 μ œμ–΄λ…Έλ“œμ—μ„œ κ΄€λ¦¬ν˜ΈμŠ€νŠΈλ‘œ μ—°κ²°ν•˜κΈ° μœ„ν•΄ sshλ₯Ό μ„€μ •ν•œλ‹€. 이것은 defaults μ„Ήμ…˜μ— μ •μ˜ν•  수 μžˆλ‹€. ssh둜 μ—°κ²°ν•  λ•Œ μ‚¬μš©μžλͺ…을 λ³„λ„λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ Ansible λͺ…령을 μ‹€ν–‰ν•˜λŠ” 둜컬 μ‚¬μš©μžμ™€ 같은 μ‚¬μš©μž 이름을 μ‚¬μš©ν•˜μ—¬ 관리 ν˜ΈμŠ€νŠΈμ— μ—°κ²°ν•œλ‹€. λ‹€λ₯Έ 원격 μ‚¬μš©μžλ₯Ό μ§€μ •ν•˜λ €λ©΄ remote_user 맀개 λ³€μˆ˜λ₯Ό ν•΄λ‹Ή μ‚¬μš©μž μ΄λ¦„μœΌλ‘œ μ„€μ •ν•œλ‹€. Ansible을 μ‹€ν–‰ν•˜λŠ” 둜컬 μ‚¬μš©μžμ—κ²Œ 개인 ssh ν‚€κ°€ μžˆκ±°λ‚˜ 관리 ν˜ΈμŠ€νŠΈμ—μ„œ 원격 μ‚¬μš©μžλ‘œ 인증할 수 μžˆλ„λ‘ ν‚€κ°€ κ΅¬μ„±λœ 경우 Ansible은 μžλ™μœΌλ‘œ λ‘œκ·ΈμΈλœλ‹€. 인증을 μœ„ν•œ ν‚€λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•΄μ„œ ssh-keygen λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν‚€νŽ˜μ–΄λ₯Ό 생성할 수 μžˆλ‹€. λ˜ν•œ ν‚€νŽ˜μ–΄ 쀑 κ³΅κ°œν‚€λ₯Ό λ°°ν¬ν•˜κΈ° μœ„ν•΄ ssh-copy-id λͺ…λ Ήμ–΄λ₯Ό μ§€μ›ν•œλ‹€. μ œμ–΄ λ…Έλ“œμ—μ„œ λ‹€μŒμ²˜λŸΌ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ ν‚€λ₯Ό μƒμ„±ν•˜κ³  λ°°ν¬ν•œλ‹€.

ssh-keygen -H '' -f ~/.ssh/id_rsa
ssh-copy-id web1.test.com

κΆŒν•œ μƒμŠΉ

λ³΄μ•ˆ 및 κ°μ‚¬λ‘œ 인해 Ansible을 원격 ν˜ΈμŠ€νŠΈμ— κΆŒν•œμ΄ μ—†λŠ” 일반 μ‚¬μš©μžλ‘œ μ—°κ²°ν•œ ν›„ κΆŒν•œμ„ μƒμŠΉν•˜μ—¬ 관리 μ•‘μ„ΈμŠ€ κΆŒν•œμ„ κ°€μ§„ root μ‚¬μš©μžλ‘œ μ „ν™˜ν•  수 μžˆλ‹€. 이것은 Ansible ꡬ성 파일의 [privilege_escalation] μ„Ήμ…˜μ— μ„€μ •ν•  수 μžˆλ‹€.

기본적으둜 κΆŒν•œ μƒμŠΉμ„ ν™œμ„±ν™”ν•˜λ €λ©΄ ꡬ성 νŒŒμΌμ— become = true 맀개 λ³€μˆ˜λ₯Ό μ„€μ •ν•œλ‹€. κΆŒν•œμ΄ 기본적으둜 μ„€μ •λ˜μ–΄ μžˆλ”λΌλ„ λ‚˜μ€‘μ— λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ 이λ₯Ό μž¬μ •μ˜ν•  수 μžˆλ‹€. become_method 맀개 λ³€μˆ˜λŠ” κΆŒν•œμ„ μƒμŠΉν•˜λŠ” 방법을 μ§€μ •ν•œλ‹€. 기본값은 sudoλ₯Ό μ‚¬μš©ν•˜λ©° become_user 맀개 λ³€μˆ˜λ₯Ό 톡해 μ–΄λ–€ μ‚¬μš©μžλ‘œ μƒμŠΉν• μ§€ μ§€μ •ν•  수 μžˆλ‹€. 기본값은 root이닀. μ„ νƒν•œ become_methodλ©”μ»€λ‹ˆμ¦˜μ—μ„œ κΆŒν•œμ„ μƒμŠΉν•˜κΈ° μœ„ν•΄ μ‚¬μš©μžκ°€ μ•”ν˜Έλ₯Ό μž…λ ₯ν•΄μ•Ό ν•˜λŠ” 경우, ꡬ성 νŒŒμΌμ— become_ask_pass = true 맀개 λ³€μˆ˜λ₯Ό μ„€μ •ν•˜λ©΄ λœλ‹€.

관리 ν˜ΈμŠ€νŠΈμ—λŠ” ssh둜 μ—°κ²°ν•œ μ‚¬μš©μžμ—κ²Œ sudoλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” κΆŒν•œμ΄ μ„€μ •λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. /etc/sudoers νŒŒμΌμ— μž‘μ„±ν•˜κ±°λ‚˜ ν˜Ήμ€ /etc/sudoers.d/ 디렉토리에 μΆ”κ°€ νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ μ„€μ •ν•  수 μžˆλ‹€. λ‹€μŒμ€ sudo κΆŒν•œμ„ μ„€μ •ν•˜λŠ” λ‚΄μš©μ΄λ‹€.

ansible_user ALL=(ALL) NOPASSWD:ALL	# 이 방법도 κ°€λŠ₯ν•˜μ§€λ§Œ
usermod -aG wheel ansible-user 		# ν„°λ―Έλ„μ—μ„œ 이 λͺ…λ Ήμ–΄λ‘œ wheel 그룹에 μΆ”κ°€ν•˜λŠ” 것을 ꢌμž₯

인벀토리(Inventory)

인벀토리 νŒŒμΌμ—λŠ” Ansibleμ—μ„œ 관리할 호슀트 λͺ©λ‘μ„ μ •μ˜ν•œλ‹€. νŠΉμ • ν˜ΈμŠ€νŠΈλŠ” 그룹에도 ν• λ‹Ήν•˜μ—¬ μ§‘ν•©μ μœΌλ‘œ 관리할 μˆ˜λ„ μžˆλ‹€. 그룹은 ν•˜μœ„ 그룹을 포함할 수 있으며, ν˜ΈμŠ€νŠΈλŠ” μ—¬λŸ¬ 그룹의 멀버가 될 수 μžˆλ‹€. 그리고 μΈλ²€ν† λ¦¬λŠ” 호슀트 및 그룹에 μ μš©λ˜λŠ” λ³€μˆ˜λ₯Ό μ„€μ •ν•  수 μžˆλ‹€.

호슀트 μΈλ²€ν† λ¦¬λŠ” 두 κ°€μ§€ λ°©λ²•μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€. ν…μŠ€νŠΈ νŒŒμΌμ„ μ‚¬μš©ν•΄μ„œ 정적 호슀트 인벀토리λ₯Ό μ •μ˜ν•  수 μžˆλ‹€. 그리고 μ™ΈλΆ€ 정보 ν”„λ‘œλ°”μ΄λ”λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•„μš”μ— 따라 μ •μ˜ν•˜λ €λ©΄ Ansible ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

정적 인벀토리

정적 인벀토리 νŒŒμΌμ€ ν…μŠ€νŠΈ 파일이며 μ•€μ„œλΈ”μ΄ 관리할 호슀트λ₯Ό λͺ©λ‘μœΌλ‘œ μ§€μ •ν•œλ‹€. 이 νŒŒμΌμ€ 일반적인 INIμŠ€νƒ€μΌ ν˜•μ‹ λ˜λŠ” YAML을 ν¬ν•¨ν•œ λ‹€μ–‘ν•œ ν˜•μ‹μ„ μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•  수 있으며 호슀트λͺ… ν˜Ήμ€ IPμ£Όμ†Œλ₯Ό ν•œ 쀄에 μž…λ ₯ν•œλ‹€. IPλŠ” λ…ΈμΆœλ˜λ©΄ λ³΄μ•ˆμƒμœΌλ‘œ μ·¨μ•½ν•˜λ―€λ‘œ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

#INI μŠ€νƒ€μΌ ν˜•μ‹
web1.test.com
web2.test.com
db1.test.com
db2.test.com

그리고 인벀토리 νŒŒμΌμ—λŠ” 호슀트 그룹을 μ§€μ •ν•  μˆ˜λ„ μžˆλ‹€. 호슀트 그룹을 μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ ν˜ΈμŠ€νŠΈλ“€μ„ μΌκ΄„μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆμ–΄μ„œ 훨씬 νš¨κ³Όμ μ΄λ‹€. 그룹은 λŒ€κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ—¬ 이름을 μ§€μ •ν•œ λ’€ λ‹€μŒ ν–‰λΆ€ν„° ν•œ 쀄씩 그룹의 ꡬ성원 ν˜ΈμŠ€νŠΈλ“€μ„ λ‚˜μ—΄ν•  수 μžˆλ‹€.

[web-servers] # κ·Έλ£Ή
web1.test.com # 그룹의 ꡬ성원 호슀트
web2.test.com

[db-servers]
db1.test.com
db2.test.com

ν˜ΈμŠ€νŠΈλŠ” μ—¬λŸ¬ 개의 그룹에 μžˆμ„ 수 μžˆλ‹€. μ‹€μ œλ‘œ 호슀트λ₯Ό μ—¬λŸ¬ 그룹으둜 κ΅¬μ„±ν•˜λ©΄ 호슀트의 μ—­ν• , μ‹€μ œ μœ„μΉ˜, ν”„λ‘œλ•μ…˜ μ—¬λΆ€ 등에 따라 λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ ꡬ성할 수 μžˆμœΌλ―€λ‘œ 이 방법을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. 그러면 νŠΉμ„±, μš©λ„ λ˜λŠ” μœ„μΉ˜μ— 따라 νŠΉμ • 호슀트 집합에 Ansible ν”Œλ ˆμ΄λ₯Ό μ‰½κ²Œ μ μš©ν•  수 μžˆλ‹€. λ˜ν•œ νŽΈμ˜μƒ 두 개의 호슀트 그룹을 μžλ™μœΌλ‘œ κ΅¬μ„±ν•˜κ³  μžˆλ‹€.

  • all: λͺ¨λ“  호슀트 λͺ©λ‘μ„ ν¬ν•¨ν•˜λŠ” κ·Έλ£Ή
  • ungrouped: μΈλ²€ν† λ¦¬μ—μ„œ 그룹에 μ†ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  호슀트 λͺ©λ‘μ€‘첩 κ·Έλ£Ή Ansible 호슀트 인벀토리에 호슀트 그룹을 μ—¬λŸ¬ 개 포함할 수 μžˆλ‹€. 이 μž‘μ—…μ€ 호슀트 κ·Έλ£Ή 이름 생성 μ‹œ :children 접미사λ₯Ό μΆ”κ°€ν•˜λ©΄ λœλ‹€.
[dev]
web1.test.com
web2.test.com

[prod]
web3.test.com
web4.test.com

[web-servers:children] # dev, prod의 λΆ€λͺ¨ κ·Έλ£Ή
dev
prod

λ²”μœ„ μ§€μ •

호슀트 이름 및 IPμ£Όμ†Œλ₯Ό μž‘μ„±ν•  λ•Œ λ²”μœ„λ₯Ό μ§€μ •ν•˜μ—¬ 인벀토리 νŒŒμΌμ„ κ°„λ‹¨νžˆ μž‘μ„±ν•  수 μžˆλ‹€. 관리 호슀트 κ°œμˆ˜κ°€ λ§Žμ•„μ§μ— 따라 ν–‰μ˜ μˆ˜κ°€ λŠ˜μ–΄λ‚˜ 가독성이 λ–¨μ–΄μ§€λŠ” 상황을 λ°©μ§€ν•˜κ³  μ’€ 더 가독성을 높일 수 μžˆλ‹€. λ²”μœ„λŠ” μˆ«μžμ™€ μ˜λ¬Έμ— ν•΄λ‹Ήν•˜λŠ” 값을 처음 κ°’κ³Ό λ§ˆμ§€λ§‰ 값을 μž…λ ₯ν•˜μ—¬ ν‘œν˜„ν•œλ‹€.

[처음 κ°’:λ§ˆμ§€λ§‰ κ°’]

인벀토리 파일 μœ„μΉ˜ μž¬μ •μ˜

인벀토리 파일의 κΈ°λ³Έ μœ„μΉ˜λŠ” /etc/ansible/hostsμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 거의 λŒ€λΆ€λΆ„ μž‘μ—… 디렉토리λ₯Ό λ”°λ‘œ μƒμ„±ν•˜μ—¬ ν”Œλ ˆμ΄λΆ 파일과 ν•¨κ»˜ μœ„μΉ˜μ‹œμΌœ κ΄€λ¦¬ν•œλ‹€. ansible λͺ…λ Ήμ–΄μ˜ -i μΈμžλŠ” 인벀토리 파일의 κΈ°λ³Έ μœ„μΉ˜κ°€ μ•„λ‹Œ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” 파일둜 λŒ€μ²΄ν•˜λŠ” μ˜΅μ…˜μ΄λ‹€. μ‚¬μš©μžλŠ” μ•€μ„œλΈ” κ΅¬μ„±νŒŒμΌμ˜ defaults μ„Ήμ…˜μ—μ„œ 인벀토리 파일의 μœ„μΉ˜λ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€.

[defaults]  
inventory = ./inventory

동적 인벀토리

Ansible 인벀토리가 μ‹œκ°„μ΄ 지남에 따라 λ³€ν•˜λ‹€κ°€ λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ— 따라 ν˜ΈμŠ€νŠΈκ°€ μ’…λ£Œλ˜λŠ” 경우, 인벀토리 ꡬ좕 방법에 μ„€λͺ…λœ 정적 인벀토리 μ†”λ£¨μ…˜μ€ μš”κ΅¬μ— λΆ€ν•©ν•˜μ§€ μ•Šλ‹€.
동적 μ™ΈλΆ€ 인벀토리 μ‹œμŠ€ν…œμ„ 톡해 μ΄λŸ¬ν•œ μ˜΅μ…˜μ„ ν†΅ν•©ν•©λ‹ˆλ‹€.
Ansible은 인벀토리 ν”ŒλŸ¬κ·Έ 및 인벀토리 슀크립트λ₯Ό μ‹€ν–‰ν•΄ μ™ΈλΆ€ 인벀토리 연결을 μ§€μ›ν•œλ‹€. 인벀토리 ν”ŒλŸ¬κ·ΈμΈμ€ κ°€μž₯ 졜근의 μ—…λ°μ΄νŠΈμ˜ κ°€μž₯ 졜근의 μ—…λ°μ΄νŠΈμ˜ 이점을 ν™œμš©ν•  수 μžˆλ‹€. 동적 인벀토리에 ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”μ²œν•œλ‹€. μΆ”κ°€ 동적 인벀토리 원본에 μ—°κ²°ν•  수 μžˆλ‹€. μ„ νƒν•œ 경우 인벀토리 슀크립트λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 인벀토리 ν”ŒλŸ¬κ·ΈμΈμ„ κ΅¬ν˜„ν•˜λ©΄ 슀크립트 인벀토리 ν”ŒλŸ¬κ·ΈμΈμ„ 톡해 λ‹€μ‹œ ν˜Έν™˜μ„±μ„ 보μž₯ν•œλ‹€.


ν”Œλ ˆμ΄λΆ(Playbook)

Ansible은 νŠΉμ •ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ ν”Œλ ˆμ΄λΆ νŒŒμΌμ— μž‘μ—… λ‚΄μš©μ„ 미리 μ •μ˜ν•΄ λ†“λŠ”λ‹€. μ΄λ•Œ ν”Œλ ˆμ΄λΆ νŒŒμΌμ—λŠ” 단일 ν˜Ήμ€ μ—¬λŸ¬ 개의 ν”Œλ ˆμ΄κ°€ μž‘μ„±λ  수 μžˆλ‹€. 단일 ν”Œλ ˆμ΄μ—λŠ” μž‘μ—… λŒ€μƒμ΄ λ˜λŠ” 관리 호슀트 정보와 μž‘μ—… λ‚΄μš©μ„ λ‹΄κ³  μžˆλŠ” 정보가 ν•„μš”ν•˜λ‹€. μž‘μ—…μ€ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ λͺ¨λ“ˆ λͺ©λ‘μ„ κ΅¬μ„±ν•œ ν•„λ“œμ΄λ©° 여기에 μž‘μ„±λœ λ‚΄μš©μ€ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λœλ‹€.
ν”Œλ ˆμ΄λΆμ€ YAML 포맷으둜 μž‘μ„±λœ ν…μŠ€ν”„ 파일이며, 일반적으둜 ν™•μž₯자λͺ…. yml을 μ‚¬μš©ν•˜μ—¬ μ €μž₯λœλ‹€. ν”Œλ ˆμ΄λΆμ€ λ°μ΄ν„°μ˜ ꡬ쑰λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ 곡백 문자λ₯Ό μ‚¬μš©ν•˜μ—¬ λ“€μ—¬μ“°κΈ°ν•œλ‹€. YAMLμ—μ„œλŠ” 듀여쓰기에 ν•„μš”ν•œ 곡백 μˆ˜μ— λŒ€ν•΄ 두 κ°€μ§€ κΈ°λ³Έ κ·œμΉ™μ΄ μ μš©λœλ‹€.

  • 계측 ꡬ쑰상 λ™μΌν•œ μˆ˜μ€€μ˜ 데이터 μš”μ†ŒλŠ” 곡백이 동일해야 ν•œλ‹€.
  • ν•˜μœ„ λͺ©λ‘μ€ μƒμœ„ λͺ©λ‘λ³΄λ‹€ λ“€μ—¬ 써야 ν•œλ‹€.

ν”Œλ ˆμ΄λΆμ€ λ¬Έμ„œμ˜ μ‹œμž‘μ„ λ‚˜νƒ€λ‚΄λŠ” μ‹œμž‘ 마컀인 μ„Έ 개의 ν•˜μ΄ν”ˆ---기호둜 쀄을 μ‹œμž‘ν•˜λ©° μ’…λ£Œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ’…λ£Œ 마컀인 μ„Έ 개의 λ„νŠΈ...λ₯Ό μž…λ ₯ν•  수 μžˆμ§€λ§Œ 보톡 μƒλž΅ν•  수 μžˆλ‹€.
ν”Œλ ˆμ΄λΆμ€ μ‹œμž‘ λ§ˆμ»€μ™€ μ’…λ£Œ 마컀 사이에 ν”Œλ ˆμ΄λ“€ λͺ©λ‘μ„ κ΅¬μ„±ν•œλ‹€. μ΄λ•Œ λͺ©λ‘μ€ ν•˜λ‚˜μ˜ λŒ€μ‹œ 기호둜 곡백으둜 μ‹œμž‘ν•œλ‹€.

---

-   name: test play  
    hosts: web1.test.com # μž‘μ—… λŒ€μƒ  
    tasks: # μž‘μ—… λ‚΄μš©
    -   name: create new user  
        user:  
        name: user01  
        uid: 4000  
        state: present
-   name: play2

ν”Œλ ˆμ΄ λ‚΄λΆ€μ—μ„œλŠ” 킀와 κ°’ 쌍으둜 μž‘μ„±λœ 데이터듀을 μž…λ ₯ν•œλ‹€. λ™μΌν•œ μˆ˜μ€€μ˜ μ„Έ κ°€μ§€ 킀인 name, hosts, tasksλ₯Ό μ§€μ •ν•˜κ³  각 ν•­λͺ©λ³„λ‘œ 값을 μž…λ ₯ν•œλ‹€.

name ν‚€λŠ” ν”Œλ ˆμ΄μ˜ λͺ©μ  및 λͺ©ν‘œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 정보이며 μž„μ˜μ˜ λ¬Έμžμ—΄μ„ μž…λ ₯ν•  수 μžˆλ‹€. name ν•­λͺ©μ€ ν•„μˆ˜ ν•­λͺ©μ€ μ•„λ‹ˆμ§€λ§Œ 가독성을 λ†’μ—¬μ£ΌκΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€. hosts에 μž…λ ₯된 값은 인벀토리에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” λͺ©λ‘μ„ 선택할 수 μžˆλ‹€. μ΄λ•Œ ν˜ΈμŠ€νŠΈλ‚˜ κ·Έλ£Ή ν˜Ήμ€ 호슀트 νŒ¨ν„΄μ„ κ°’μœΌλ‘œ μž…λ ₯ν•  수 μžˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ tasks ν•­λͺ©μ—μ„œλŠ” μ‹€μ œλ‘œ μˆ˜ν–‰ν•  μž‘μ—… λͺ©λ‘μ„ κ΅¬μ„±ν•œλ‹€. tasks ν•˜μœ„μ—λŠ” λŒ€μ‹œ 기호λ₯Ό μž…λ ₯ν•˜μ—¬ 단일 ν•­λͺ©μ„ μ§€μ •ν•˜κ³  μžˆλŠ”λ° μ΄λ•Œ nameκ³Ό userλΌλŠ” 두 κ°€μ§€ ν‚€λ₯Ό μž…λ ₯ν•˜κ³  μžˆλ‹€. name ν•­λͺ©μ€ λ§ˆμ°¬κ°€μ§€λ‘œ λͺ©μ μ„ μ„€λͺ…ν•˜λŠ” 정보이며 ν•„μˆ˜ ν•­λͺ©μ€ μ•„λ‹ˆλ‹€. 그리고 userλΌλŠ” ν•­λͺ©μ€ λͺ¨λ“ˆμ΄λΌκ³  λΆ€λ₯΄λ©° ν•˜μœ„ μˆ˜μ€€μœΌλ‘œ μž…λ ₯된 인자λ₯Ό 톡해 μ›ν•˜λŠ” μž‘μ—… λ‚΄μš©μ„ ꡬ성할 수 μžˆλ‹€.

λͺ¨λ“ˆμ€ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” μž‘μ—… λ‚΄μš©μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ 미리 μ„€κ³„λ˜μ–΄ 있으며 ν‚€μ›Œλ“œλ§Œ μž…λ ₯ν•˜λ©΄ κ·Έ μ¦‰μ‹œ λͺ¨λ“ˆμ„ μ‹€ν–‰ν•  수 μžˆλ‹€. λ˜ν•œ μž‘μ—… λͺ©λ‘μ—λŠ” 단일 λͺ¨λ“ˆ ν˜Ήμ€ μ—¬λŸ¬ 개의 λͺ¨λ“ˆμ΄ μ •μ˜λ  수 μžˆλ‹€.

ν”Œλ ˆμ΄λΆ μ‹€ν–‰

ansible-playbook은 μ œμ–΄λ…Έλ“œμ—μ„œ ν”Œλ ˆμ΄λΆ 파일의 λ‚΄μš©μ„ 읽어 ν”Œλ ˆμ΄λ₯Ό μ‹€ν–‰ν•˜λŠ” λͺ…령어이닀. ν”Œλ ˆμ΄λΆμ„ μ‹€ν–‰ν•˜λ©΄ μ‹€ν–‰ 쀑인 ν”Œλ ˆμ΄μ™€ μž‘μ—…μ„ ν‘œμ‹œν•˜λŠ” 좜λ ₯이 μƒμ„±λœλ‹€. 좜λ ₯μ—λŠ” μ‹€ν–‰ν•œ 각 μž‘μ—…μ˜ κ²°κ³Όκ°€ λ³΄κ³ λœλ‹€.
일반적으둜 Ansible ν”Œλ ˆμ΄λΆμ˜ μž‘μ—…μ€ 멱등이며, ν”Œλ ˆμ΄λΆμ„ μ—¬λŸ¬ 번 μ‹€ν–‰ν•˜λŠ” 것이 μ•ˆμ „ν•˜λ‹€. 관리 ν˜ΈμŠ€νŠΈκ°€ 이미 μ˜¬λ°”λ₯Έ μƒνƒœμΈ 경우 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.
μƒμ„Έν•œ μž‘μ—…μ˜ κ²½κ³Όλ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” -v μ˜΅μ…˜μ„ μ‚¬μš©ν•  수 μžˆλ‹€. v문자의 κ°œμˆ˜μ— 따라 μˆ˜μ€€μ„ μ‘°μ ˆν•  수 μžˆλ‹€.

  • -v: κ°„λ‹¨ν•œ μž‘μ—… κ²°κ³Όλ₯Ό ν‘œμ‹œ
  • -vv: μž‘μ—… 결과와 ꡬ성 λ‚΄μš©μ„ ν‘œμ‹œ
  • -vvv: 관리 ν˜ΈμŠ€νŠΈμ— μ—°κ²°ν•˜κΈ° μœ„ν•œ μΆ”κ°€ 정보도 ν‘œμ‹œ
  • -vvvv: 슀크립트λ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ κ΄€λ ¨ λ‚΄μš©λ„ ν•¨κ»˜ ν‘œμ‹œ

Ansible은 ν”Œλ ˆμ΄λΆμ„ μ‹€ν–‰ν•˜κΈ° 전에 --syntax-check μ˜΅μ…˜μœΌλ‘œ ν•΄λ‹Ή ꡬ문의 μœ νš¨μ„±μ„ 미리 κ²€μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ§€μ›ν•œλ‹€. ꡬ문에 λ¬Έμ œκ°€ μžˆμ„ 경우 였λ₯˜λ₯Ό λ³΄κ³ ν•œλ‹€. λ˜ν•œ λΉ„μŠ·ν•œ κΈ°λŠ₯으둜 --checkμ˜΅μ…˜μ„ 톡해 μ‹€μ œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜μ§€ μ•Šμ§€λ§Œ μž‘μ—…μ— λŒ€ν•œ κ²°κ³Όκ°€ μ–΄λ–»κ²Œ λ³΄κ³ λ˜λŠ”μ§€ 확인할 수 μžˆλŠ” κΈ°λŠ₯을 μ§€μ›ν•œλ‹€.

닀쀑 ν”Œλ ˆμ΄

단일 ν”Œλ ˆμ΄λΆμ€ μ—¬λŸ¬ 개의 ν”Œλ ˆμ΄λ₯Ό μ •μ˜ν•  수 μžˆλ‹€. ν”Œλ ˆμ΄λŠ” μˆœμ„œκ°€ μ§€μ •λœ μž‘μ—… λͺ©λ‘κ³Ό μž‘μ—… λŒ€μƒμ΄ μ§€μ •λ˜μ–΄ μžˆλ‹€. μ΄λ•Œ λ‹€μ–‘ν•œ μž‘μ—… λŒ€μƒμ„ μ§€μ •ν•΄μ„œ 각각의 λŒ€μƒμ—κ²Œ λ§žλŠ” μž‘μ—… λͺ©λ‘λ“€μ„ ꡬ성할 수 μžˆλ‹€.
μ΄λŸ¬ν•œ κΈ°λŠ₯은 μ—¬λŸ¬ ν˜ΈμŠ€νŠΈμ—μ„œ λ‹€μ–‘ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” λ³΅μž‘ν•œ 배포λ₯Ό μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ν•  λ•Œ 맀우 μœ μš©ν•˜λ‹€. ν•˜λ‚˜μ˜ 호슀트 집합에 λŒ€ν•΄ ν•˜λ‚˜μ˜ ν”Œλ ˆμ΄λ₯Ό μ‹€ν–‰ν•˜κ³ , ν•΄λ‹Ή ν”Œλ ˆμ΄κ°€ μ™„λ£Œλ˜λ©΄ λ‹€λ₯Έ 호슀트 집합에 λŒ€ν•΄ λ‹€λ₯Έ ν”Œλ ˆμ΄λ₯Ό μ‹€ν–‰ν•˜λŠ” ν”Œλ ˆμ΄λΆμ„ μž‘μ„±ν•  수 μžˆλ‹€.

- name: first play
  hosts: dbservers
  tasks:
    - name: first task
      service: 
        name: mariadb
        enabled: true
- name: secodn play
  hosts: webservers
  tasks: 
    - name: first task
      service:
        name: httpd
        enabled: true

ν”Œλ ˆμ΄μ—μ„œ μ„€μ •ν•  수 μžˆλŠ” ν•­λͺ©μ€ hosts 및 tasks 이외에도 μ„œλ²„μ— μ—°κ²°ν•  μ‚¬μš©μžλ₯Ό μž¬κ΅¬μ„±ν•˜κ±°λ‚˜ κΆŒν•œ μƒμŠΉμ„ μ‘°μ •ν•  수 μžˆλ‹€.

- name: sample play
  hosts: demo-host
  remote_user: ansible-user
  become: true
  tasks:
    - name: sample task
      service:
        name: httpd
        enabled: true

λ‹€μŒμ€ λ³€μˆ˜ 관리에 λŒ€ν•΄ μž‘μ„±ν•˜κ² λ‹€.

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'Cloud > IaC' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[IaC] Terraform Module둜 AWS IAMκ³Ό Security Group 생성  (0) 2025.11.12
[IaC] Terraform Module둜 AWS Network 생성  (0) 2025.11.11
[IaC] Terraform module 생성  (1) 2025.07.18
[IaC] Terraform으둜 AWS 인프라 관리 및 μžλ™ν™”  (0) 2025.06.30
[IaC] ν…ŒλΌνΌ(Terraform)μ΄λž€?  (0) 2025.06.28
'Cloud/IaC' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [IaC] Terraform Module둜 AWS IAMκ³Ό Security Group 생성
  • [IaC] Terraform Module둜 AWS Network 생성
  • [IaC] Terraform module 생성
  • [IaC] Terraform으둜 AWS 인프라 관리 및 μžλ™ν™”
The Engineer, Lucy
The Engineer, Lucy
  • The Engineer, Lucy
    Growing up for My FutureπŸ’•
    The Engineer, Lucy
    • Instagram
    • GitHub
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (192) N
      • Linux (27)
      • Infra (9)
      • Cloud (31) N
        • AWS (3)
        • GCP (4)
        • Docker (4)
        • Kubernetes (14)
        • IaC (6) N
      • NGINX (1)
      • DevOps (3)
      • Computer Science (17)
        • Data Structure (0)
        • Algorithms (1)
        • Operating System (3)
        • Network (11)
        • Database System (2)
      • Coding Test (97)
        • Algorithms (89)
        • SQL (7)
      • ETC (7)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 곡지사항

  • 링크

    • Lucy's Instagram
    • Lucy's GitHub
  • 인기 κΈ€

  • νƒœκ·Έ

    λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
    K8s
    Kubernetes
    μ…Έ 슀크립트
    network
    Baekjoon
    λ„ˆλΉ„μš°μ„ νƒμƒ‰
    terraform
    programmers
    도컀
    Shell Script
    μ˜€λΈ”μ™„
    Linux
    bfs
    λ„€νŠΈμ›Œν¬ 기초 지식
    μ‰˜ 슀크립트
    λ„€νŠΈμ›Œν¬
    AWS
    cs 기초 지식 정리
    Java
    μΏ λ²„λ„€ν‹°μŠ€
    λ¦¬λˆ…μŠ€λ§ˆμŠ€ν„° 2κΈ‰
    docker
    ν‹°μŠ€ν† λ¦¬μ±Œλ¦°μ§€
    Shell
    μ½”λ”©ν…ŒμŠ€νŠΈ 곡뢀
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    λ°±μ€€
    λ¦¬λˆ…μŠ€
    μžλ°”
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
The Engineer, Lucy
[IaC] μ•€μ„œλΈ”(Ansible) κ°œλ… 및 μ„€μΉ˜
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”