원격 환경 설정하기
원격 환경 설정하기 (Setting the remote environment)
플레이북에서 실행하는 작업은 원격 호스트의 환경 변수가 필요한 경우가 많아요. 프록시를 거쳐 http 요청을 보내거나, 언어별 버전 관리자(rbenv, nvm 등)가 요구하는 환경 변수를 설정할 때 environment 키워드가 유용합니다. play, block, task 어느 레벨에서든 설정할 수 있어요.
출처: 문서
본문
버전 1.1에서 추가되었어요.
environment 키워드를 play, block, task 레벨에서 사용해 원격 호스트에서 실행되는 작업에 대한 환경 변수를 설정할 수 있어요. 이 키워드로 http 요청을 하는 작업에 프록시를 사용하도록 하거나, 언어별 버전 관리자가 요구하는 환경 변수를 설정하는 등의 일을 할 수 있습니다.
environment:로 play나 block 레벨에서 값을 설정하면, 그 값은 같은 사용자로 실행되는 해당 play나 block 안의 작업에만 적용돼요. environment: 키워드는 Ansible 자체, Ansible 구성 설정, 다른 사용자의 환경, 그리고 lookup이나 filter 같은 다른 플러그인의 실행에는 영향을 주지 않습니다. environment:로 설정한 변수는 play 레벨에서 설정해도 자동으로 Ansible 팩트가 되지 않아요. 이 값을 팩트(Ansible facts)로 만들려면 플레이북에 명시적인 gather_facts 작업을 포함하고 그 작업에 environment 키워드를 설정해야 합니다.
작업에서 원격 환경 설정하기 (Setting the remote environment in a task)
환경을 작업 레벨에서 직접 설정할 수 있어요.
- hosts: all
remote_user: root
tasks:
- name: Install cobbler
ansible.builtin.package:
name: cobbler
state: present
environment:
http_proxy: http://proxy.example.com:8080
play에서 변수로 환경 설정을 정의하고, 다른 저장된 Ansible 변수처럼 작업에서 접근해 재사용할 수 있어요.
- hosts: all
remote_user: root
# create a variable named "proxy_env" that is a dictionary
vars:
proxy_env:
http_proxy: http://proxy.example.com:8080
tasks:
- name: Install cobbler
ansible.builtin.package:
name: cobbler
state: present
environment: "{{ proxy_env }}"
여러 플레이북에서 재사용하려면 group_vars 파일에 정의해 저장할 수 있어요.
---
# file: group_vars/boston
ntp_server: ntp.bos.example.com
backup: bak.bos.example.com
proxy_env:
http_proxy: http://proxy.bos.example.com:8080
https_proxy: http://proxy.bos.example.com:8080
원격 환경을 play 레벨에서 설정할 수도 있어요.
- hosts: testing
roles:
- php
- nginx
environment:
http_proxy: http://proxy.example.com:8080
위 예시들은 프록시 설정을 보여주지만, 이런 방식으로 원하는 만큼 많은 설정을 제공할 수 있습니다.
언어별 버전 관리자 사용하기 (Working with language-specific version managers)
rbenv나 nvm 같은 일부 언어별 버전 관리자는 사용 중인 동안 환경 변수를 설정해야 해요. 이 도구들을 수동으로 사용할 때는 보통 스크립트나 셸 구성 파일에 추가한 줄에서 환경 변수를 소싱(source)합니다. Ansible에서는 play 레벨의 environment 키워드로 이 작업을 할 수 있어요.
---
### A playbook demonstrating a common npm workflow:
# - Check for package.json in the application directory
# - If package.json exists:
# * Run npm prune
# * Run npm install
- hosts: application
become: false
vars:
node_app_dir: /var/local/my_node_app
environment:
NVM_DIR: /var/local/nvm
PATH: /var/local/nvm/versions/node/v4.2.1/bin:{{ ansible_env.PATH }}
tasks:
- name: Check for package.json
ansible.builtin.stat:
path: '{{ node_app_dir }}/package.json'
register: packagejson
- name: Run npm prune
ansible.builtin.command: npm prune
args:
chdir: '{{ node_app_dir }}'
when: packagejson.stat.exists
- name: Run npm install
community.general.npm:
path: '{{ node_app_dir }}'
when: packagejson.stat.exists
참고 (Note)
위 예시는 PATH의 일부로
ansible_env를 사용해요.ansible_env를 기반으로 변수를 만드는 것은 위험합니다. Ansible은 팩트 수집을 통해ansible_env값을 채우므로, 변숫값은 팩트를 수집할 때 사용한 remote_user나 become_user에 따라 달라져요. remote_user/become_user를 바꾸면ansible_env의 값이 기대한 값이 아닐 수 있습니다.
경고 (Warning)
환경 변수는 보통 평문(클리어 텍스트)으로 전달되므로(셸 플러그인에 따라 다름), 실행되는 모듈에 비밀을 전달하는 방법으로는 권장되지 않습니다.
환경을 작업 레벨에서도 지정할 수 있어요.
---
- name: Install ruby 2.3.1
ansible.builtin.command: rbenv install {{ rbenv_ruby_version }}
args:
creates: '{{ rbenv_root }}/versions/{{ rbenv_ruby_version }}/bin/ruby'
vars:
rbenv_root: /usr/local/rbenv
rbenv_ruby_version: 2.3.1
environment:
CONFIGURE_OPTS: '--disable-install-doc'
RBENV_ROOT: '{{ rbenv_root }}'
PATH: '{{ rbenv_root }}/bin:{{ rbenv_root }}/shims:{{ rbenv_plugins }}/ruby-build/bin:{{ ansible_env.PATH }}'
더 보기 (See also)
- Ansible 플레이북 — 플레이북 소개.
- 커뮤니케이션 — 질문이나 도움이 필요하거나 아이디어를 나누고 싶다면 Ansible 커뮤니케이션 안내서를 참고하세요.
더 알아보기 (Learn more)
- 플레이북 전반의 구조와 실행 방식은 "플레이북 작업(playbooks)" 페이지에서 이어서 확인할 수 있어요.