[Ansible] #5.1 변수

[Ansible] #5.1 변수

Ansible변수 에 대해서 알아보자.


1. 변수 이름


변수 이름에는 문자, 숫자, 밑줄만 포함할 수 있다.
그러나 이미 예약된 플레이북 키워드나 Python 키워드는 사용할 수 없다. 또한 변수는 숫자로 시작할 수 없다.

  • 유효한 변수 이름
    • foo
    • foo_env
    • foo_port
    • foo5
    • _foo

키워드 DOCS 참조 : playbook-keywords

2. 기본 변수 정의 및 참조 기본 변수


  • 기본 변수 정의
- hosts: mgmt
  vars:
    remote_install_path: /opt/my_app_config

일반적으로 vars 라는 키워드를 사용하고, 그 안에서 변수를 선언한다.
이는 아래 예시 모두 동일하다.

  • 기본 변수 참조
template:
  src: foo.cfg.j2
  dest: '{{ remote_install_path }}'/foo.cfg

변수를 참조할 때는 반드시 이중 중괄호 를 사용한다.
변수가 참조하는 사전의 모든 값을 따옴표로 인용한다.

기본 변수 테스트


mkdir 02_vars
cd 02_vars

변수 실습용 폴더인 02_vars 폴더를 만들고, 그 안에 vars 폴더를 만든다.

vi var.yaml
- hosts: mgmt
  vars:
    message: hello world!!!

  tasks:
  - debug:
      msg: "{{ message }}"
  - debug:
      msg: "hello korea"
  - debug:
      msg: "MESSAGE: {{ message }}"
ansible-playbook var.yaml

1

다음은 패키지 설치 예시이다.

vi var2.yaml
- hosts: mgmt
  vars:
    pkg_name: apache2

  tasks:
  - apt:
      name: "{{ pkg_name }}"
      state: present
  - service:
      name: "{{ pkg_name }}"
      state: started
ansible-playbook var2.yaml -b

2

3. 목록 변수 정의 및 참조


목록(List) 변수는 여러 개의 값이 목록으로 선언된 변수다.

  • 목록 변수 정의
region:
  - northeast
  - southeast
  - midwest
  • 목록 변수 참조
region: "{{ region[0] }}"

목록 변수 테스트


vi var3.yaml
- hosts: mgmt
  vars:
    mylist:
      - aaa
      - bbb
      - ccc

  tasks:
  - debug:
      msg: "{{ mylist[0] }}"
  - debug:
      msg: "{{ mylist[1] }}"
  - debug:
      msg: "{{ mylist[2] }}"
ansible-playbook var3.yaml

3

4. 사전 변수 정의 및 참조


사전(Dictionary) 변수는 변수에 하나 이상의 사전 값이 선언된 변수다.

  • 사전 변수 정의
foo:
  field1: one
  field2: two
  • 사전 변수 참조
foo['field1']
foo.field1
  • 대괄호 표기법 : 항상 적절하게 참조됨
  • 점 표기법 : 모듈에 따라 일부 키가 Python 사전(Dictionary)의 속성 및 메서드와 충돌할 수 있음

사전 변수 테스트


vi var4.yaml
- hosts: mgmt
  vars:
    mydict:
      a: aaa
      b: bbb
  tasks:
  - debug:
      msg: "{{ mydict.a }}"
  - debug:
      msg: "{{ mydict['a'] }}"
ansible-playbook var4.yaml

4

5. 등록 변수


등록(Registered) 변수 는 모듈의 반환 값을 저장하는 변수다.
플레이북 은 실행시 리턴 밸류가 나오지 않는다.
즉, 실행 자체에 초점을 맞춘 기능이고, Ad-hoc 의 경우는 리턴 밸류를 출력하므로 주로 디버깅에 사용된다.
플레이북 에서의 디버깅에는 등록 변수 를 주로 사용하게 된다.

  • 등록 변수 사용
- hosts: web_servers

  tasks:
    - name: Run a shell command and register its output as a variable
      shell: /usr/bin/foo
      register: foo_result
      ignore_errors: true

    - name: Run a shell command using output of the previous task
      shell: /usr/bin/bar
      when: foo_result.rc == 5

위와 같이 작성할 수 있다.
실제로 테스트를 통해 이해해보자.

등록 변수 테스트


02_vars 폴더에서 시작하여 아래 명령어로 reg.yaml 파일을 생성한다.

mkdir register
cd register
vi reg.yaml
- hosts: mgmt
  gather_facts: no
  tasks:
  - ping: {}
    register: ping_result
  - debug:
      msg: "{{ ping_result }}"
  - debug:
      msg: "{{ ping_result.ping }}"

ping 모듈을 실행하는 플레이북을 작성하였다.

registertask 의 키워드임을 명심하자.
register 의 값으로 ping_register 라는 임의의 변수명을 지정하였고, 이를 msg 로 출력하면 리턴 밸류를 볼 수 있게 된다.

ansible-playbook reg.yaml

5

6. 변수 정의 위치


변수를 정의할 수 있는 위치는 다음과 같다.

  • 인벤토리

  • 플레이북(vars:)

  • 재사용 가능 파일(외부 참조 파일)

  • 역할

  • 명령의 -e 옵션

위에서는 플레이북 내의 vars 키워드에서 변수를 정의하였지만, 그 밖의 다른 곳에서도 변수를 선언할 수 있다.

만약 동일한 변수명으로 인벤토리, 플레이북 등에서 선언하였을 경우, 우선순위에 따라 그 값이 결정된다.

때문에 변수의 범위를 상정하여 변수를 선언해야 하며, 동일한 변수명으로 여러 곳에서 만들지 않고 변수 범위를 생각해서 선언하도록 하자.

7. 인벤토리 변수


[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestPerChild=900

인벤토리 변수의 예시이다.

host1 , host2 는 호스트 명을 나타내며, 그 이하는 모두 변수를 나타낸다.
즉, 해당 변수는 각 호스트에만 적용되는 변수이며 그것이 각 변수의 범위이다.
이를 호스트 변수 라고 한다.

위의 경우 atlanta 라는 호스트 그룹을 구성하였을 때
host1 에서의 http_port 라는 변수의 값은 80 이 되고,
host2 에서의 http_port 의 값은 303 이 된다.

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

밑은 그룹 변수 라고 하며, [그룹명:vars] 로 나타낼 수 있다.
이렇게 하면 해당 변수들은 atlanta 라는 그룹에 있는 호스트에 공통적으로 적용된다.

8. 플레이북 변수


---
- hosts: all
  remote_user: root
  vars:
    favcolor: blue
  vars_files:
    - vars/external_vars.yaml

  tasks:
  - name: This is just a placeholder
    command: /bin/echo foo
...
---
# This is external_vars.yaml
somevar: somevalue
password: magic
...

위에서 했던 것 처럼 플레이북에서는 vars 키워드를 사용해서 변수를 선언할 수 있다.
또한 vars_files 키워드로 외부 파일을 참조하는 것도 가능하다.

플레이북 변수 테스트


02_var/vars 폴더에서 시작한다.

vi var5.yaml
- hosts: mgmt
  vars_files:
    - varfile.yaml
  tasks:
  - debug:
      msg: "{{ myvar }}"
vi varfile.yaml
myvar: hello myvar
ansible-playbook var5.yaml

6

9. 런타임 - 옵션


  • 키 = 값 형식

    ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
    

    --extra-vars 옵션은 -e 로 축약해서 사용할 수 있다.
    이에 대한 변수가 뒤에 오는 문자열이다.
    키 = 값 형식 은 INI 방식이라고 생각하면 된다.

  • JSON 문자열 형식

    ansible-playbook release.yml --extra-vars '{"version":"1.23.45", "other_variable":"foo"}'
    
  • JSON 또는 YAML 파일

    ansible-playbook release.yml --extra-vars "@some_file.json"
    

    @ 를 사용하면 외부 파일을 참조할 수 있다.

10. 변수의 우선 순위


번호가 높을수록 우선 순위가 높다.

  1. 명령의 옵션 (예 : -u my_user)
  2. 역할의 기본(defaults) 변수 파일(role_defaults_main.yml)
  3. 인벤토리 파일의 그룹 변수 / 동적 인벤토리 스크립트의 그룹 변수
  4. 인벤토리 파일이 있는 경로의 group_vars/all 파일
  5. 플레이북 파일이 있는 경로의 group_vars/all 파일
  6. 인벤토리 파일이 있는 경로의 group_vars/* 모든 파일
  7. 플레이북 파일이 있는 경로의 group_vars/* 모든 파일
  8. 인벤토리 파일의 호스트 변수 / 동적 인벤토리 스크립트의 호스트 변수
  9. 인벤토리 파일이 있는 경로의 host_vars/* 모든 파일
  10. 플레이북 파일이 있는 경로의 host_vars/* 모든 파일
  11. 호스트의 팩트 변수 / set_fact 모듈에 의해 캐시된 변수
  12. 플레이의 vars 키워드
  13. 플레이의 vars_prompt 키워드
  14. 플레이의 vars_files 키워드
  15. 역할의 vars 변수 파일(role_vars_main.yml)
  16. 블록의 vars 키워드
  17. 작업의 vars 키워드
  18. include_vars 모듈
  19. set_facts 모듈 / 등록 변수
  20. 역할(또는 include_role 모듈)의 파라미터
  21. include 모듈의 파라미터
  22. ansible-playbook 명령의 ‘–extra-vars’ 변수

11. 변수 범위


  • 전역/플레이북 : 구성 파일, 환경 변수(ansible_*), 명령 줄 옵션(-e, --extra-vars)
  • 호스트 그룹 : 인벤토리의 그룹 변수
  • 호스트 : 인벤토리의 호스트 변수
  • 플레이 : vars, vars_files, vars_prompt 등 지시어, 역할의 기본 변수(defaults) 및 변수(vars)
  • 블록
  • 작업

블록은 아직 안배웠으니 넘어가고, 작업에 대해서 살펴보자.

작업 변수 범위 테스트


vi var6.yaml
- hosts: mgmt
  vars:
    message: hello play
  tasks:
  - debug:
      msg: "{{ message }}"
  - debug:
      msg: "{{ message }}"
    vars:
      message: hello task
ansible-playbook var6.yaml

7

var6.yaml 에는 두 개의 message 변수가 존재하며,
첫 번째 debug 태스크는 기본 변수로 정의된 hello play 를 출력하고,
두 번째 debug 태스크는 작업 범위 내에서 선언된 vars 의 값인 hello task 를 출력한다.


© 2022. All rights reserved.