๋ฒ๊ทธ ์ ๊ณ
1.6.10 ๋ฐ 1.7
๋งฅ OSX 10.9.4
๊ฐ๋ฅํ ํ๋ ์ด๋ถ(๋๋ ๋ด ์ฝ๋/์ค์ )์์ ์ด์ํ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ํฌํจ์ ์ฌ์ฉํ์ฌ ์์ ํ๋ ์ด๋ถ์ ์ฌ์ฉํ ๋ ์ ๋ฌ๋ ๋ณ์๋ฅผ ๋ชจ๋์ '์ด๋ฆ'์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
name:
๋ณ์๋ฅผ ํฌํจํฉ๋๋ค.๋ค์์ ๋ฌธ์ ์ ์์
๋๋ค.
task_runner.yml
---
- name: Disable {{ host }}
hosts: all
gather_facts: no # for debug purposes
tasks:
- name: Run task
include: tasks.yml
vars:
host: "{{ host }}"
์์ .yml
- name: "ping {{ host }} twice"
shell: ping -c 2 {{ host }}
name: "ping {{ host }} twice"
๋ฅผ name: "ping host twice"
๋ก ๋ณ๊ฒฝํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค(์๋ "์ค์ ๊ฒฐ๊ณผ"์ ํ์๋จ).
์ค๋ฅ ๋ฉ์์ง๊ฐ ์์ต๋๋ค.
๋ค์์ ๋จ์ผ ํ๋ ์ด๋ถ์์ ์ฒ์ ์ํ๋ ์ค์ ์์ ์
๋๋ค.
task_playbook.yml
---
- name: Disable {{ host }}
hosts: all
gather_facts: no # for debug purposes
tasks:
- name: ping {{ host }} twice
shell: ping -c 2 {{ host }}
์คํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(venv) isingh$ ansible-playbook -c local task_playbook.yml -i hosts --extra-vars host=google.com
PLAY [Disable google.com] *****************************************************
TASK: [ping google.com twice] *************************************************
changed: [fionn]
PLAY RECAP ********************************************************************
fionn : ok=1 changed=1 unreachable=0 failed=0
(venv) isingh$ ansible-playbook -c local tasks_runner.yml -i hosts --extra-vars host=google.com
PLAY [Disable google.com] *****************************************************
ERROR: recursive loop detected in template string: {{host}}
๊ฐ์ฌ ํด์.
์๋ !
๊ฐ์ด host์ธ host๋ผ๋ ๋ณ์๋ฅผ ์ ์ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ ๋ฅผ ์ํด ์ค๊ณ๋ ๋๋ก ์ ํํ๊ฒ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
vars:
host: "{{ host }}"
๊ทธ๋ ๊ฒ ํ์ง ์๋ ๊ฒ์ด _NOT_ ๊ถ์ฅํฉ๋๋ค.
๋๋ด์ผ๋ก ํด์ํ์๋ฉด "์์ฌ๋, ์ด๋ ๊ฒ ํ๋ฉด ํ์ด ์ํ์"์ ๊ฐ์ ๊ฒ์ ๋๋ค. :)
๋๋ ์ด๊ฒ์ ์ค๊ณ๋ ๋๋ก ์๋ํ๋๋ก ๋ซ์ ๊ฒ์ด์ง๋ง, ๋ ๋ ผ์ํ๊ณ ์ถ๋ค๋ฉด ์์ ๋กญ๊ฒ sible-project์ ๋ค๋ฅด์ญ์์ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ด๋ ค ์์ต๋๋ค.
๋ค๋ฅธ ๊ตฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ํ๋ ์ด๋ถ์์ ์ฌํํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
vars:
app:
user: rails
home: "/home/{{ app.user }}"
๋ณ์๋ฅผ app_user
๋ฐ app_home
๋ก ํ๋ฉดํํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ณต์ญ์์์ด์ง๋ง ํนํ app
์ ๋์ฌ๊ฐ ๋ถ์ ๋ณ์๊ฐ ๋ง์ ๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ค์๋ธ ์ฌ์ฉํ๊ธฐ 1.8.3.
๋๋ ํฐ๋๊ณผ ๊ฐ์ ๋ฐฐ์ ์๋ค. ๊ณฐ๊ณฐ์ด ์๊ฐํด๋ณด๋ฉด ๋น์ฐํ ์ผ์ด์ง๋ง. ํ ๋น๋๊ธฐ ์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํฉ๋๋ค.
ํ์ด์ฌ์์ ๊ฐ์ ๊ฒ์ ์๋ํ์ญ์์ค.
>>> app = {"user": "rails", "home": "/home/" + app['user']}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'app' is not defined
๊ทธ๊ฒ์ ์ข์ ๊น๋ํ ๊ตฌ์ฑ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ถ๋๋ฝ์ต๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฌ์ฉ ๋ณ์๋ฅผ ๋ณ๋๋ก ์ ์ํ๋ ๊ฒ์
๋๋ค. ์ฆ, ๊ทํ์ ๊ฒฝ์ฐ:
app_user: "rails"
app:
user: "{{ app_user }}"
home: /home/{{ app_user }}
์ฝ๊ฐ ๋ชป์๊ฒผ์ง๋ง ์ง๊ธ๊น์ง๋ ๊ด์ฐฎ์ ์์ค์ ๋๋ค.
1.6.X์์ 1.8.4๋ก ์ด๋ํ ํ ๋น์ทํ ๊ฒ์ด ์์ต๋๋ค. ์ด์ ์๋ ์๋ํ์ง๋ง ์ด์ ์ฌ๊ท ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ๋ ์ด๋ถ์ด ์์ต๋๋ค.
- role: rsyslog
tags: ['rsyslog']
rsyslog:
reception:
tcp:
enabled: True
transmission:
tcp:
enabled: True
hosts: "{{rsyslog.producers}}"
๊ทธ๋ฐ ๋ค์ ํน์ ํ๊ฒฝ์ group_vars์์ rsyslog๋ฅผ ์ ์ํฉ๋๋ค.
rsyslog:
producers: "{% set hosts = ['localhost:5544'] %}{% for host in groups['logmaster'] %}{% do hosts.append(host + ':5140') %}{% endfor %}
rsyslog ์ญํ ์ด ์คํ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
=> ํ
ํ๋ฆฟ ๋ฌธ์์ด์์ ๊ฐ์ง๋ ์ฌ๊ท ๋ฃจํ: {{rsyslog.producers}}
์ด๊ฒ์ด ์์ ๋ ๋ฒ๊ทธ๊ฐ ์๋์๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์ด ๋ฒ๊ทธ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ๋ด ์ง๊ฐ์ ๋ณ์๊ฐ ๊ตฌ์ถ๋๋ ๋ฐฉ์์ ์์ ๋ณ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. hash_behaviour๊ฐ ๊ฐ๋ฅํ ๊ตฌ์ฑ์์ ๋ณํฉ๋๋๋ก ํ์ต๋๋ค.
๋ ๊น์ด ํ๊ณ ๋ค๊ฑฐ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฌผ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์์ ํ๊ธฐ ์ ์ ๋ชจ๋ ์๊ฐ์ด๋ ์ ์์ ํ์ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ :-1:
๋์ผํ ๋ฌธ์ ๋ "์ถฉ๋ํ๋" ๋ณ์๋ฅผ ์ด๋ํ๊ณ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค... "๋ณ์"๋ฅผ ์ถ๊ฐ ์ธ์๋ก ํฐ ์๋ฆฌ๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ ๋ฌ๋ ๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
ansible-playbook playbook.yml -e "my_var=1"
# playbook.yml
vars:
my_var: "{{ my_var | default(my_default_var) }}"
@thom-nic์ด ํ ์ผ์ ๋ฐฉ๊ธ ๋ง๋ฌ์ต๋๋ค. ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์์ ํ ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ณด๋ฉด ์๋ฒฝํ๊ฒ ์ ์๋ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์. ์ญํ ์ข ์์ฑ์ ์ค์ฒฉํ๋ฉด ์ด๋ฐ ์ผ์ด ๋ฐ์ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค. ๋ ๋ฉ์ง ํ์์ ์ฌ์ฉํ๊ณ ์ถ์์ต๋๋ค.
์ํํธ์จ์ด๋ ๋ชจ๋ ์ข ๋ฅ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ ํ์คํ ์ด๊ฒ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์๋๋ ๋์ ์์ฒด๋ฅผ ํธ์ถํ๋ ์ฌ์ ์ ํ์์ ์์ฒด ๋๋ฉ์ธ์ ์์ต๋๋ค. 1๋ ์ ๋๊ตฐ๊ฐ๊ฐ ์ด ์ง๋ฌธ์ ํ์ต๋๋ค. ํ์์ด ์ ์๋ ๊ณณ์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
๋๋ ๋ํ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์์ต๋๋ค. ๋๊ตฐ๊ฐ ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด ์ด๋ป๊ฒํด์ผํ๋์ง ๋งํด ์ค ์ ์์ต๋๊น? ์๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ ์ฌ๊ท ๋ฃจํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
maxHeapSizeAnsi: "{{(hostvars[inventory_hostname]['ansible_memtotal_mb'] * 3 / 4)|int}}"
๋๋ ๊ฑฐ๊ธฐ์ ๋น ์ง๋ค. ๊ณ ์ณ์ง๊น์? ๋ค์ ์ด์ด์ผ ํ๋?
+1
+1
+1
+1
+1
+1
+1
์ด๋ฆฌ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ ์์ฒด๊ฐ ์์ง ์์ ํ ์ด๊ธฐํ๋์ง ์์์ ๋ ์ฌ์ ์ด ์ค์ค๋ก ํค๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์์ฒญํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์๋ํ์ง ์์์ผ ํ๋ ์ด์ ๋ ์ด์น์ ๋ง์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์ญํ ์ ํตํด ํด๊ฒฐํ ๋ฐฉ๋ฒ์
๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ํ ๊ณณ์์ ๋ฒ์ ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ฏธ๋ฆฌ ํ๋ ค๊ณ ํ๋ ๊ฒ์ ๋๋ค.
application:
params:
state: present
version: "0.6.3"
download_url: "https://releases.hashicorp.com/consul/{{ consul.params.version }}/consul_{{ consul.params.version }}_linux_amd64.zip"
agent:
...
vars๋ฅผ ํํํ๊ฒ ์ ์งํ๋ฉด ๊ฐ์ ๋ก ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ๊ฐ ํด๋๋ฅผ ์ฌ์ฉํ๊ณ ๊ฑฐ๊ธฐ์ ์์์ ๊ฒ๋ค์ ์ฑ์ฐ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ vars/main.yml์ '์๋ฆ๋ค์ด' ๊ตฌ์กฐ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
.
|-roles
|---Application
|-----defaults
|-------main.yml
|-----files
|-----handlers
|-----meta
|-----tasks
|-----templates
|-----vars
|-------main.yml
defaults/main.yml์๋ ๋ค์์ด ์์ต๋๋ค.
_version: "0.6.3"
_download_url: "https://releases.hashicorp.com/consul/{{ _version }}/consul_{{ _version }}_linux_amd64.zip"
defaults/vars.yml์๋ ๋ค์์ด ์์ต๋๋ค.
consul:
params:
state: present
version: "{{ _version }}"
download_url: "{{ _download_url }}"
is_agent: false
agent:
...
์ด๋ ๊ฒ ํ๋ฉด ๋ณ์๋ฅผ ๋ ๋์ ๊ณณ์์ ๋ณ๊ฒฝํ ์ ์์ง๋ง '๊ธฐ๋ณธ ๋ณ์'๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋จ์ผ ์์ค๋ ํ์ฉํฉ๋๋ค. ;)
ํ ์คํธ ํ, (๊ด๋ก๋ฅผ ํตํด) '๋น๊ณต๊ฐ'๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ค์ด ์๋ ๊ธฐ๋ณธ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค. ๋ํ ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ณ์๋ฅผ ์ฝ๊ณ ์๋ ํ์ผ์ ์ ํํ ์ ์ ์์ต๋๋ค. ํค.
+1
+1
๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
myapp:
version: 1.6.3
download_url: http://example.org/download/myapp-{{ myapp.version }}.tgz
๋๋ ๊ทธ๋ ๊ฒํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ด์ผ๋ก ํด์ํ์๋ฉด "์์ฌ๋, ์ด๋ ๊ฒ ํ๋ฉด ํ์ด ์ํ์"์ ๊ฐ์ ๊ฒ์ ๋๋ค. :)
@mpdehaan , ๋ด๊ฐ ์ ์ ์ฌ์ฉํ ๊ฒ์ ๋์ฒดํ๊ธฐ ์ํด ๊ฐ๋ฅํ ์ํ๊ณ์ ๋ค๋ฅธ ๋ชจ๋์ ๋ฐฉ๊ธ ์ค์นํ๋ค๊ณ ์์ํด๋ณด์ญ์์ค. mysql_version
๋ผ๋ ๊ธฐ๋ณธ ๋ณ์๋ฅผ ์ค์ ํ๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ๋ฐฉ๊ธ ์ค์นํ ๋ชจ๋์ ๋ํ ๋ฉํ ์ข
์์ฑ์ด ์๋ ์ ํํ ๋์ผํ ์ด๋ฆ์ ๋ณ์๊ฐ ๋ด ๋ชจ๋์ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค.
๋ด ๋ชจ๋ ๋ด์์ ๋ณ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก ๋๋ชจ๋์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ณ์์ ์ด๋ฆ์ ๋์ผํ ๊ท์น, ์ฆ service_name_version
์ ๋ฐ๋ผ ๋ช
๋ช
๋๋ฉฐ mysql_version_another_stupid_name_because_ansible_cannot_do_that_properly
์ ๊ฐ์ ๊ฒ์ผ๋ก ํ์ ๊ตฌ์ฑํ๊ณ ์ถ์ง ์์ต๋๋ค. ํน์ ๋ณ์ ์ด๋ฆ์ ํ ๊ตฌ์ฑ์์ด ๊ธฐ์ตํด์ผ ํ๋ ๋ ๋ค๋ฅธ ๋์์ค์ด๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋์ ๊ณต์ ๊ฐ๋ฅํด์ผ ํ๋ฏ๋ก ์ธ๋ฒคํ ๋ฆฌ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ทธ ํํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์กฐ์ธ์ ๋ฌด์์ ๋๊น?
+1
+1
์ด๊ฒ์ด ์์ผ๋ฉด ๊ตฌ์ ์ ๋์ฌ ๋ฐฉ์์ผ๋ก ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ์ง๊ณ ๊นจ๋ํ ๋ณ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ณ ๋ คํ๋ค:
mysql:
version: 5.5
install_path: "/var/lib/mysql/{{ mysql.version }}"
user: mysql
group: mysql
๋
mysql_version: 5.5
mysql_install_path: "/var/lib/mysql/{{ mysql_version }}"
mysql_user: mysql
mysql_group: mysql
์ด๊ฒ์ (์ ์ด๋ ์ ์๊ฒ๋) ์ค์ ์ฌ๋ก๊ฐ ์๋ ์์ผ ๋ฟ์ด์ง๋ง ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ๋ณด์ฌ์ค๋๋ค. IMO, ํ์์ ์ ์๋ ๋จ์ง ๋ถ์พํฉ๋๋ค. ์ ์๋ ์ผ์ข ์ DRY'์์์ ์ ์ฉํฉ๋๋ค.
+1
๊ณฐ๊ณฐ์ด ์๊ฐํด๋ณด๋ฉด ๋น์ฐํ ์ผ์ด์ง๋ง. ํ ๋น๋๊ธฐ ์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ค์ ๋ก ์ ํํ ํ ๊ฐ์ง ์๋ฏธ๋ก ์ ์ ์๋์ด ์์ต๋๋ค. ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ๋ก (๋
ผ๋ฆฌ์ ์ธก๋ฉด์์)์ ์ด๋ฌํ ์ข
๋ฅ์ "์ญ์ฐธ์กฐ"์ ๋ํด ๋ชจ๋ ์ ์ ์๋์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ค์ ๋ก ๊ตฌํ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๊ดํ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ ์ ๋ถ๋ถ์ ์ผ๋ก ์๋ชป๋์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ ๊ฐ์ง ๊ตฌ๋ฌธ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค. YAML ๋ฐ ๊ฐ๋ฅํ ๋ณ์. ๋ณ์ {{ some_var_name_here }}
์ ansible ๊ฐ๋
์ YAML์์ ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์ ์์์ผ ํฉ๋๋ค(์ด ์น์
2 ์ฐธ์กฐ). ์ค์ ๋ก ๊ทธ ๋ฌธ์์ด์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ์์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์์ ๊ฐ ์์ต๋๋ค. ๋ค์ YAML ์ค์ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋น ๋ฅธ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. hash_map:
2. version: ab
3. path: "/somepath/{{hash_map.version}}"
hash_map
๋ณ์๋ ์ธ์ ์ ์๋ฉ๋๊น? ์ด๋ฏธ _๋ผ์ธ 1_์ ์์ต๋๊น? ์๋๋ฉด _๋ผ์ธ 3_ ์ดํ์๋ง ์์ต๋๊น?
์ด ๊ฒฐ์ ์ด ๊ตฌํ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ๋ด ์๋ค.
์ฃผ์: ์ด๋ฌํ ์์ ๋ ์ค์ ๋ก ๋จ์ํ๋์์ผ๋ฉฐ ์ค์ ๋ก๋ ์ด ๋ชจ๋ ๊ฒ์ด ํ์์์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ตฌํ #1 ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ ์์์ _line 3_ ์ดํ์๋ง ์ ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
variables = {}
variables["hash_map"] = {"version": "ab", "path": "/somepath/{{hash_map.version}}" }
# We cannot do this!!!
variables["hash_map"] = {"version": "ab", "path": "/somepath/%s" % variables["hash_map"]["version"] }
๊ตฌํ #2 ๋ ์์ _line 1_์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ ๋นํ๊ธฐ์ ์์ ํ ์ถฉ๋ถํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
variables = {}
variables["hash_map"] = {}
variables["hash_map"]["version"] = "ab"
# This is totally possible
variables["hash_map"]["path"] = "/somepath/%s" % variables["hash_map"]["version"]
๋ ๋ค ๊ฐ์ ๊ฒ์ ๋ํ๋ด์ง๋ง ๋ณด์๋ค์ํผ ํ์๊ฐ ์ข ๋ ๊ฐ๋ ฅํฉ๋๋ค.
์ผ๋ฐ YAML๋ก ๋ฌด์์ ๋ฌ์ฑํ ์ ์๋์ง ๋ด ์๋ค.
YAML ํ์ค ์ YAML์ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฃจํธ ๋ฐฉํฅ ๊ทธ๋ํ๋ก ์ค๋ช ํฉ๋๋ค. ๋ ธ๋๋ ์น์ 3.2.1.1์ ์ค๋ช ๋์ด ์์ต๋๋ค.
_standard_ ๊ฐ์ ๋ฐ๋ฅด๋ฉด ๋
ธ๋๋ก๋ ํ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ - ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ ์์ ์ด ์์ต๋๋ค - ๋ด๊ฐ ์๋ ํ ๋
ธ๋ ์ ํ์ด ์์ต๋๋ค. ์ด๋ ์๋ฏธ๋ก ์ ์ผ๋ก ์์ ๊ธฐ๋ฅ์ ํ๋์ ๋
ธ๋ ๋ก ์ฌ๋ฐ๋ฅด๊ฒ(์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก) ๋ํ๋ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ ์ผํ ์ค์ ์ต์
์ sequence
๋
ธ๋(YAML์ ๋ชฉ๋ก์ด๋ผ๊ณ ๋ ํจ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์์ YAML ์๋ ํ์ค์ ๋ํ ๋์ ์ดํด์ ๋ฐ๋ผ ๋ค์ ๊ทธ๋ํ๋ก ํ์๋ฉ๋๋ค.
{{hash_map.version}}
์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด anchor
๋ฐ ๋ณ์นญ ๋
ธ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ : ์ด ๊ธฐ๋ฅ์ 6.2.9์ ์ค๋ช ๋์ด ์์ต๋๋ค.
1. hash_map:
2. version: &anchor "ab" #setting the anchor
3. path:
4. - "/somepath/"
5. - *anchor # referring to the anchor, yields ab
์ด YAML ์จ๋ผ์ธ ํ์ ๋ก ์ด๊ฒ์ ํ์ธํ์ญ์์ค
๋ค์ ๊ทธ๋ํ๋ฅผ ์์ฑํฉ๋๋ค.
์์์ ์ฐ๋ฆฌ๋ ๋ ๋
ธ๋๋ฅผ ๊ฒฐํฉํ ์ ์์์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ YAML ์ ์ฉ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด ๊ธฐ๋ฅ์ ๋ฌ์ฑํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ {{ some_var_name_here }}
๋ ๋จ์ง ๊ฐ๋ฅํ ํ๊ธฐ๋ฒ์ด๋ฉฐ YAML์์๋ ์๋ฏธ๊ฐ ์์์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ํ๋ ๋๋ก ๊ทธ ์๋ฏธ๋ฅผ ์์ ๋กญ๊ฒ ์ ์ํ ์ ์์ต๋๋ค!
YAML์ ๋งํฌ์ ์ธ์ด์ด๋ฉฐ(์ฝ์นญ์ผ๋ก ๊ฐ์ ํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ) ๋งํฌ์ ์ธ์ด๋ "์ด๋ป๊ฒ"๊ฐ ์๋๋ผ "๋ฌด์"์ด๋ผ๋ ์ง๋ฌธ์ ๋ตํ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐ๊ฐ ์๋ฏธํ๋ ๋ฐ๊ฐ ์์ ํ ๋ช ํํ๋ฏ๋ก ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด ์์ ํ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ํ์ฌ YAML ํ์ค v.1.2 ( Wikipedia ์ ๋ฐ๋ฅธ ์ต์ ๋ฆด๋ฆฌ์ค)๋ฅผ ์ค์ํ์ง ์์ง๋ง ๊ฐ๋ฅํ ๋ณ์
{{ some_var_name_here }}
์ ๋ํ ๊ฐ๋ ์ด ์๋๋๋ค.
ํธ์ง:
๊ทธ๋์ ๊ฒฐ๋ก ์? {{ some_var_name_here }}๋ ansible ํ๊ธฐ๋ฒ์ผ ๋ฟ์ด๊ณ "deffer resolve"๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ๋น์ทํ ๊ฒ์ ๊ตฌํํ ๊ณํ์ ๋๊น(์: groovy์ ํด๋ก์ ๋ฐ์ธ๋ฉ)? ๋ฌธ์ ๊ฐ ์์ง ์ข ๋ฃ๋์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ์ต๋๋ค! ํ์ง๋ง ๊ทธ๋ ๊ฒ ์ฌ์ด ์ผ์ด ์๋๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ ํฐ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ํผ์ ํ๋ ค๋ฉด ์๊ฐ์ด ํ์ํฉ๋๋ค. ๋์์ ์ค ์ํฅ์ด ์๋ ํ ๋ ๋ช ์ ๋ค๋ฅธ ๊ธฐ์ฌ์๊ฐ ์๋ ๊ฒ์ด ์ข์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ์์ ์๋๊ฐ ๋นจ๋ผ์ง ๊ฒ์ ๋๋ค.
๋์๊ฒ ์ด ํ๋์ ์ ๋ง ์์์น ๋ชปํ ์ผ์ด์๊ณ ์ด์ํ๊ฒ ๋๊ปด์ก๋ค. ํ์ฌ ๋์์ด ์์ ํ๊ธฐ์ ๊ทธ๋ค์ง ์ ์พํ์ง ์์ ๋ง์ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค.
~~~
์ด๊ฒ์ ํ ์ญํ /์์ ์์ ๋ค๋ฅธ ์ญํ /์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋ง๋ค ๋ฐ์ํ ์ ์์ต๋๋ค. ํนํ ์ธ๋ถ์์ ๊ฐ๋ฐํ ์ญํ (๊ฐค๋ญ์)์ ๊ฒฝ์ฐ ์ด๋ ์ฃผ์ PITA๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ฌ์ค์ ์ค์ ํ๊ฑฐ๋ ์ค๊ฐ ๋๋ฏธ ์์ ์ ์ฌ์ฉํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ถ์ ํฉ๋๋ค.
~~~
์ด๊ฒ์ ๋งค์ฐ ์์์น ๋ชปํ ๋์์ ๋๋ค. ์ ์ ํ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด dict ํค๋ฅผ ๊ฐ์ ์ด๋ฆ์ ๋ณ์์ ๋์ผํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ด์ฌ์์:
{'host': host}
์ ๋ฌํ๊ธฐ ์ํด ๋ณ์ ์ด๋ฆ์ ํดํนํด์ผ ํ๋ค๋ฉด ์ ๋ง ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ ๋๋ค.
{'host': _host}
ํ์ฌ ๋ด๊ฐ ์ฐพ์ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ณ์์ ์ญํ ์ด๋ฆ์ ์ ๋์ด๋ก ๋ถ์ด๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์:
nginx_domain: '{{ myapp_domain }}'
์๋ํ์ง๋ง ์ข ๋ฒ๊ฑฐ๋กญ์ง ์๋์?
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
์ด๊ฒ์ YAML ๊ตฌํ ๋ฒ๊ทธ์ ๋๋ค.
+1
+1
+1
+1
+1
๋๋ ์ด๊ฑฐ ๋๋ ธ๋ค. ์ด๊ฒ์ ๋ค์ ์ฌ๋ ๊ฒ์ ๋ํด ์๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น?
@everybody , ๊ทธ๋ฆฌ๊ณ ๋ง ๊ทธ๋๋ก ๋ชจ๋๋ฅผ ์๋ฏธํฉ๋๋ค :-).
์ด๊ฒ์ ์ ์ ๋๋ฅผ ์ณค์ต๋๋ค. ๋น์ ์ด ํ ์์๋ ์ ์ผํ ์ผ์ ๋ณ์๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค. ์์ง ์ ์๋์ง ์์ ๋ณ์๋ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ง์ง '๋ฌธ์ '๋ Ansible์ด ์๋๋ผ Jinja2์ ์์ต๋๋ค. ๋น์ ์ด ์ด๊ฒ์ ๊ณ ์น ์ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด, ๋ด ์๋์ด ๋์ญ์์ค. ๊ทธ๋ฌ๋ ํ์ฌ jinja2 ์ํคํ ์ฒ/ํ๋ก์ ํธ ๋ด์์ ๋ถ๊ฐ๋ฅํ์ง ์๋ค๋ฉด ์์ ํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์์ ๋(์๋ฅผ ๋ค์ด @rqelibari ์ ๋ํ ํฌ๋ ๋ง):
hash_map:
version: ab
path: "/somepath/{{hash_map.version}}"
๋ํ ๊นจ๋ํ๊ณ ๋ฉ์ง ๊ฐ๋ฅํ ๋ณ์ ํ์ผ ๋ฐ/๋๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ํฉ๋๋ค. ๋ค๋ฅธ ์ํคํ ์ฒ๋ฅผ ๊ณ ๋ คํ๋ฉด ๋ค๋ฅธ ํ์ผ์ ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ main.yml ํ์ผ์ด๋ all.yml ํ์ผ์ ๊ตญํ๋์ง ์์ต๋๋ค. Ansible์ ์ ์ฐํ๋ฏ๋ก ๋๋ํ๋ค๋ฉด ์ด๋ํ๊ณ ํ๋ ์ดํ์ธ์ :-D.
์๋ฅผ ๋ค์ด group_vars์ ' all ' ๋๋ ํ ๋ฆฌ์ 'hash_map'์ด๋ผ๋ ํ์ผ์ ์์ฑํ๊ณ ์ด ํ์ผ์ ํ์ํ ๋ณ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์, ๋์ผํ ํค ์ ์ฅ์์์ ๋ฉ๋ชจํ ํค๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ํ์ฌ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ง๊ธ๊ณผ ๋ช ๊ฐ์ ์์ ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ๋ณด์ง ์์ต๋๋ค ...
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ฐฝ์๋ ฅ์ ๋ฐํํ๊ณ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค์ง ๋ง์ญ์์ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ฐ๋ฅํ ๋ณ์๋ก ๋ชจ๋ ๊ฒ์ ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ์์ต๋๋ค. ๋ด๊ฐ ์ป์ ์ ์ผํ ๋ณด์์ ๋ค๋ฃจ๊ธฐ ํ๋ ํ๋ ์ด๋ถ๊ณผ ํผ์ง ๋ณ์ ๊ตฌ์กฐ์์ต๋๋ค :-).
์ข์, ์ด๊ฒ์ ๊ฐ๋ฅ์์ +1ํ์ง ๋ง๊ณ jinja2 ํ๋ก์ ํธ์์ ์์ ํ์ญ์์ค.
์ด ๋ฌธ์ ๋ yaml ํ์์ ansibles ์ฌ์ฉ์ ์ง์ ์ ์ธ ๊ฒฐ๊ณผ์
๋๋ค.
yaml ๊ฐ์ฒด๋ฅผ ๋ก๋ํ๊ณ ๋ ๋ฒ์งธ ์์
์ ์ํํ๋ ๋์ ๋ณด๊ฐ ๊ธฐ๋ฅ
๋ณด๊ฐ์ ์ํด ์ ๋ฌํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ํ jinja ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. ์ด๊ฒ์
๊ตฌํ ๋ฒ๊ทธ. ์ ๊ฒํด ์ฃผ์ญ์์ค. ์์ ๋ฌธ์์ด๋ก ๋ก๋ํ๊ณ
๊ทธ๋ฐ ๋ค์ ๋ ๋ฒ์งธ ํจ์ค์์ ์ด๊ธฐํ๋ ๊ฐ์ฒด ๋ฉค๋ฒ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์์ ๋ฉ๋๋ค.
์ด๊ฒ.
+1
+1
+1
+1
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค๋ฅธ ๊ตฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ํ๋ ์ด๋ถ์์ ์ฌํํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
๋ณ์๋ฅผ
app_user
๋ฐapp_home
๋ก ํ๋ฉดํํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ณต์ญ์์์ด์ง๋ง ํนํapp
์ ๋์ฌ๊ฐ ๋ถ์ ๋ณ์๊ฐ ๋ง์ ๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ค์๋ธ ์ฌ์ฉํ๊ธฐ 1.8.3.