Ansible: ์ด๋ฆ„์— ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” 'ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์—์„œ ์žฌ๊ท€ ๋ฃจํ”„๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค' ์˜ค๋ฅ˜

์— ๋งŒ๋“  2014๋…„ 08์›” 13์ผ  ยท  58์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ansible/ansible

๋ฌธ์ œ ์œ ํ˜•:

๋ฒ„๊ทธ ์‹ ๊ณ 

์•ค์„œ๋ธ” ๋ฒ„์ „:

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}}

๊ฐ์‚ฌ ํ•ด์š”.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค๋ฅธ ๊ตฌ์„ฑ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”Œ๋ ˆ์ด๋ถ์—์„œ ์žฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 vars:
    app:
      user:    rails
      home:    "/home/{{ app.user }}"

๋ณ€์ˆ˜๋ฅผ app_user ๋ฐ app_home ๋กœ ํ‰๋ฉดํ™”ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋ณต์ˆญ์•„์ƒ‰์ด์ง€๋งŒ ํŠนํžˆ app ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ค์„œ๋ธ” ์‚ฌ์šฉํ•˜๊ธฐ 1.8.3.

๋ชจ๋“  58 ๋Œ“๊ธ€

์•ˆ๋…•!

๊ฐ’์ด 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๋…„ ์ „ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์งˆ๋ฌธ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜•์‹์ด ์ œ์•ˆ๋œ ๊ณณ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://stackoverflow.com/questions/22989401/using-a-relative-path-to-reference-another-element-in-a-multi-dimensional-array

๋‚˜๋Š” ๋˜ํ•œ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•˜๋Š”์ง€ ๋งํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋ž˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์žฌ๊ท€ ๋ฃจํ”„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

์œ„์˜ @bn0 ๋‹ต๋ณ€ ์ฐธ์กฐ:

๊ณฐ๊ณฐ์ด ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ ์ผ์ด์ง€๋งŒ. ํ• ๋‹น๋˜๊ธฐ ์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๊ธฐ๋Šฅ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋„Œ์„ผ์Šค๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ์ •ํ™•ํžˆ ํ•œ ๊ฐ€์ง€ ์˜๋ฏธ๋กœ ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ๋ก (๋…ผ๋ฆฌ์  ์ธก๋ฉด์—์„œ)์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ "์—ญ์ฐธ์กฐ"์— ๋Œ€ํ•ด ๋ชจ๋‘ ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๊ตฌํ˜„์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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"]

๋‘˜ ๋‹ค ๊ฐ™์€ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ๋ณด์‹œ๋‹ค์‹œํ”ผ ํ›„์ž๊ฐ€ ์ข€ ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

2. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

ํ‘œ์ค€์€ ๋ฌด์—‡์„ ๋งํ•ฉ๋‹ˆ๊นŒ?

์ผ๋ฐ˜ YAML๋กœ ๋ฌด์—‡์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ด…์‹œ๋‹ค.

ํ‘œ์ค€์— ๋”ฐ๋ฅธ YAML ํ‘œํ˜„

YAML ํ‘œ์ค€ ์€ YAML์˜ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋ฃจํŠธ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ์„น์…˜ 3.2.1.1์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

_standard_ ๊ฐ’์— ๋”ฐ๋ฅด๋ฉด ๋…ธ๋“œ๋กœ๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ - ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ์š”์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค - ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋…ธ๋“œ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋ฏธ๋ก ์ ์œผ๋กœ ์œ„์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋…ธ๋“œ ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ(์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ) ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์œ ์ผํ•œ ์‹ค์ œ ์˜ต์…˜์€ sequence ๋…ธ๋“œ(YAML์˜ ๋ชฉ๋ก์ด๋ผ๊ณ ๋„ ํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ๊ฒฐ๊ณผ

์œ„์˜ YAML ์˜ˆ๋Š” ํ‘œ์ค€์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด์— ๋”ฐ๋ผ ๋‹ค์Œ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

yaml-representation

{{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-representation-sequence

์ด๊ฒƒ์˜ ๋‹ค์Œ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์œ„์—์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๋…ธ๋“œ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ YAML ์ „์šฉ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์„ ๋‹ฌ์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ {{ some_var_name_here }} ๋Š” ๋‹จ์ง€ ๊ฐ€๋Šฅํ•œ ํ‘œ๊ธฐ๋ฒ•์ด๋ฉฐ YAML์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ทธ ์˜๋ฏธ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

TLDR

YAML์€ ๋งˆํฌ์—… ์–ธ์–ด์ด๋ฉฐ(์•ฝ์นญ์œผ๋กœ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ) ๋งˆํฌ์—… ์–ธ์–ด๋Š” "์–ด๋–ป๊ฒŒ"๊ฐ€ ์•„๋‹ˆ๋ผ "๋ฌด์—‡"์ด๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฐธ์กฐ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ํ˜„์žฌ YAML ํ‘œ์ค€ v.1.2 ( Wikipedia ์— ๋”ฐ๋ฅธ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค)๋ฅผ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ {{ some_var_name_here }} ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํŽธ์ง‘:

  • 2018-04-15 21:11:

    • ์ธํŠธ๋กœ๋ฅผ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ์ฒ ์ž๊ฐ€ ํ‹€๋ฆฐ ๋‹จ์–ด๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค(์ง€๊ธˆ -> ์•Œ๊ณ  ์žˆ์Œ).

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€? {{ some_var_name_here }}๋Š” ansible ํ‘œ๊ธฐ๋ฒ•์ผ ๋ฟ์ด๊ณ  "deffer resolve"๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„์Šทํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ(์˜ˆ: groovy์˜ ํด๋กœ์ € ๋ฐ”์ธ๋”ฉ)? ๋ฌธ์ œ๊ฐ€ ์•„์ง ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋” ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ์ž ํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์„ ์ค„ ์˜ํ–ฅ์ด ์žˆ๋Š” ํ•œ ๋‘ ๋ช…์˜ ๋‹ค๋ฅธ ๊ธฐ์—ฌ์ž๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ์ž‘์—… ์†๋„๊ฐ€ ๋นจ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด ํ–‰๋™์€ ์ •๋ง ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด์—ˆ๊ณ  ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์กŒ๋‹ค. ํ˜„์žฌ ๋™์ž‘์ด ์ž‘์—…ํ•˜๊ธฐ์— ๊ทธ๋‹ค์ง€ ์œ ์พŒํ•˜์ง€ ์•Š์€ ๋งŽ์€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

~~~

  • set_fact:
    ํ˜ธ์ŠคํŠธ: "some.host.com"
  • ํฌํ•จ: task.yml
    ๋ณ€์ˆ˜:
    ํ˜ธ์ŠคํŠธ: "{{ ํ˜ธ์ŠคํŠธ }}"
    ~~~

์ด๊ฒƒ์€ ํ•œ ์—ญํ• /์ž‘์—…์—์„œ ๋‹ค๋ฅธ ์—ญํ• /์ž‘์—…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์™ธ๋ถ€์—์„œ ๊ฐœ๋ฐœํ•œ ์—ญํ• (๊ฐค๋Ÿญ์‹œ)์˜ ๊ฒฝ์šฐ ์ด๋Š” ์ฃผ์š” PITA๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์‚ฌ์‹ค์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„ ๋”๋ฏธ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.

~~~

  • set_fact:
    not_host: "{{ ํ˜ธ์ŠคํŠธ }}"
  • ํฌํ•จ: task.yml
    ๋ณ€์ˆ˜:
    ํ˜ธ์ŠคํŠธ: "{{ not_host }}"
    ~~~

์ด๊ฒƒ์€ ๋งค์šฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 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

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰