Ansible: "๋ณตํ˜ธํ™” ์‹คํŒจ"์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

์— ๋งŒ๋“  2016๋…„ 02์›” 05์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ansible/ansible

$ vagrant provision                                                                                                                                                                                                                        
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...
PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit='default' --inventory-file=/Users/bob/src/ansible-devops/.vagrant/provisioners/ansible/inventory -v playbook.yml
No config file found; using defaults
ERROR! Decryption failed
Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

์ €๋Š” Ansible์„ ์ฒ˜์Œ ์ ‘ํ–ˆ์ง€๋งŒ ์•”ํ˜ธํ™” ํ•œ ์ ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "Decryption failed"๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ "์œ ์šฉํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ–ˆ๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์ด ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

_what_์ด๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š๊ณ  "๋ณตํ˜ธํ™” ์‹คํŒจ"๋ผ๊ณ ํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ์ด ๋ณตํ˜ธํ™”ํ•˜๋ ค๊ณ ํ–ˆ๋˜ ๊ฒƒ์€ ์˜คํžˆ๋ ค .... ๋ฐ”๋ณด์ž…๋‹ˆ๋‹ค.

ansible 2.0.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Ansible์„ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

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

@ 0xABAB ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹น์‹ ์ด ๋– ๋‚˜๋Š” ๊ฒƒ์„ ๋ณธ ๋‘ ๋ฒˆ์งธ ๋ฌด๋ก€ํ•œ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค. ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋„์›€์„ ์ฃผ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค (ํŠนํžˆ Ansible ์ง์›์ด ์•„๋‹Œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›)์„ ๊ณ„์†ํ•ด์„œ ํ•™๋Œ€ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒŒ์‹œ๋ฅผ ๊ธˆ์ง€ ํ•  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ ‡๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ฐฉ๋ž‘ ํŒŒ์ผ๊ณผ ansible ํŒŒ์ผ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ์ดˆ๋ณด ์งˆ๋ฌธ์„ํ•˜๋ฉด ๋‚˜์—๊ฒŒ ๋งํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„, ๋ฏธ์•ˆ. ์‹ฌ๊ฐํ•œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ 5 ๋ถ„ ์ด๋‚ด์—์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค. ๋‚˜๋Š” ํŠน๋ณ„ํžˆ ๊ทธ๋ ‡๊ฒŒ ํ•  ๋™๊ธฐ๋ฅผ ๋Š๋ผ์ง€ ์•Š์œผ๋ฉฐ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ปค๋ฐ‹ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์ด๋ฏธ ๊ณ ์ณค์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธดํ•˜์ง€๋งŒ ์ €๋Š” ํ’ˆ์งˆ ๊ธฐ์ค€์ด ๋‚ฎ์€ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@ 0xABAB ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹น์‹ ์ด ๋– ๋‚˜๋Š” ๊ฒƒ์„ ๋ณธ ๋‘ ๋ฒˆ์งธ ๋ฌด๋ก€ํ•œ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค. ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋„์›€์„ ์ฃผ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค (ํŠนํžˆ Ansible ์ง์›์ด ์•„๋‹Œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›)์„ ๊ณ„์†ํ•ด์„œ ํ•™๋Œ€ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒŒ์‹œ๋ฅผ ๊ธˆ์ง€ ํ•  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

@ jimi-c ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ๋ฌด๋ฃŒ๋กœ๋ณด๊ณ  ํ•œ ๋ชจ๋“  ๋ฒ„๊ทธ๋ฅผ ๊ธฐ๊บผ์ด ์ธ์ •ํ•˜๊ณ , ์ดˆ๋ณด์ž๊ฐ€ ๋‹น์‹ ์˜ ์—ด๋“ฑํ•œ ์ œํ’ˆ์˜ ๋ฒ„๊ทธ๋ฅผ ๋ฌด๋ฃŒ๋กœ ๊ณ ์ณ ์ฃผ๋ฉด ํ–‰๋ณตํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , ๋‚ด๊ฐ€ ์ดˆ๋ณด์ž์—๊ฒŒ ๊ทธ๊ฐ€ ์ดˆ๋ณด์ž๋ผ๊ณ  ์„ค๋ช…ํ•˜๋ฉด ํ–‰๋ณตํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹น์‹ ์˜ ์ž์œ  ๋…ธ๋™ ์ „๋žต๊ณผ ์ž˜ ๋งž์ง€ ์•Š๋Š”๋‹ค๊ณ ?

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

@ 0xABAB ๋‹น์‹ ์€ ์—‰๋ฉ์ด๊ฐ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ฒ„๋ ค.

์ถ”์‹  : ๋‹น์‹ ์„ ๋„์šฐ ๋ คํ–ˆ๋˜ "์ดˆ๋ณด์ž"๋Š” ๋ช‡ ๋…„ ๋™์•ˆ Ansible์— 100 ๊ฐœ ์ด์ƒ์˜ ์ปค๋ฐ‹์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Vagrant๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ansible์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค- -vvv ์ถ”๊ฐ€๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ์ง€๊ธˆ๊นŒ์ง€ ๋Œ“๊ธ€๋กœ ์ธํ•ด ์‚ฌ๋žŒ๋“ค์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค (๋˜๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ฝ๋‹ˆ ๋‹ค). ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„ Ansible์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด vsphere ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž์ฒด ์„œ๋ช… ๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ SSL์„ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ์ธ์ฆ์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋„๋Š” ์˜ต์…˜์ด ์‹ค์ œ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์€ ์ด๊ฒƒ์ด ๋ฌธ์ œ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ์™„์ „ํžˆ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ณ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ œ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋ ˆ์ด ๋ถ (vm_provision.yml) :

- hosts: all
  gather_facts: false
  connection: local

  vars_prompt:
    - name: "vcenter_username"
      prompt: "VCenter Username: "
      private: no
    - name: "vcenter_password"
      prompt: "VCenter Password: "
      private: yes

  tasks:

    - vsphere_guest:
      vcenter_hostname: REDACTED
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        guest: "{{ vm_name }}"
        from_template: yes
        template_src: "{{ vm_template }}"
        cluster: "{{ vm_cluster }}"
        vm_extra_config:
          notes: "{{ vm_note }}"
          folder: "{{ vm_folder }}"

์ธ๋ฒคํ† ๋ฆฌ (์ˆ˜์ • ๋œ ํ•ญ๋ชฉ์€ ๋ชจ๋‘ ๋ฌธ์ž์—ด ์ž„) :

[vmtest]
REDACTED vm_name='testvm'

[vmtest:vars]
vm_datastore='REDACTED'
vm_network='REDACTED'
vm_memory='4096' cpucount='2'
vm_template='REDACTED'
vm_note='Testing'
vm_folder='REDACTED'

ansible ์‹คํ–‰ :

ansible-playbook playbooks/vm_provision.yml -i inventory -l vmtest -vvv
SSH password:
SUDO password[defaults to SSH password]:
ERROR! Decryption failed

ansible ๋ฒ„์ „ ์ •๋ณด

ansible --version
ansible 2.1.0
  config file = /Users/aaron.nichols/projects/cba-deploy/ansible.cfg
  configured module search path = Default w/o overrides

@adnichols ๋ฉ”์‹œ์ง€๋Š” ansible-vault๊ฐ€ vars ํŒŒ์ผ์„ ํ•ด๋…ํ•˜์ง€ ๋ชปํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๋ณผํŠธ ์•”ํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ €์žฅ๋œ ํŒŒ์ผ์„ ํฌํ•จํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์˜ค๋ฅ˜๋Š” 0f73fb0d6fce6c01e79a68267d184290408b429d๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๊ฐœ๋ฐœ์ž์—์„œ ๋” ๋ช…ํ™• ํ•ด ์กŒ์œผ๋ฏ€๋กœ์ด ํ‹ฐ์ผ“์„ ๋‹ซ์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ ํŒŒ์ผ์ด ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค.

์•”ํ˜ธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•”ํ˜ธ ํ•ด๋…์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ --vault-password-file , --ask-vault-pass ๋˜๋Š” ๊ทธ ํšจ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์•Œ๋ฆผ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

"๋ณตํ˜ธํ™” ์‹คํŒจ"๋Š” ์•ฝ๊ฐ„ ์• ๋งคํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๊ณ  ansible 2.1.1.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์—ฌ์ „ํžˆ ๋‚˜ํƒ€๋‚˜๊ณ  Google์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ๋ณผํŠธ ํŒŒ์ผ์„ ์–ธ๊ธ‰ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ๊ฒŒ์‹œ๋ฌผ์„ ํ†ตํ•ด ์ œ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์›์ธ์€ .vault.passwd์—์„œ ์‚ฌ์šฉ ๋œ ์•”ํ˜ธ๊ฐ€ vault.yml์„ ์ƒ์„ฑ ํ•œ ์•”ํ˜ธ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ๋‚˜์€ ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
"{path to vault.yml}์˜ ์•”ํ˜ธ๋ฅผ ํ•ด๋… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."

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