[Ansible] 변수

728x90

ansible 변수

변수 명명 규칙

유효한 변수 명은 위와 같다.

유효하지 않은 변수명은 위와 같다, 숫자로 구성되거나 하이푼, 띄어쓰기, . 이 포함된 변수명, *과 같이 파이썬에서 사용되는 키워드로 작성된 변수 혹은 플레이북 키워드가 변수명에 들어올 경우 유효하지 않은 변수명이 된다.

remote_install_path: /opt/my_app_config

변수명은 키: 밸류 형태로 구성된다.

---
ansible.builtin.template:
  src: foo.cfg.j2
  name: '{{ abc }}'
	dest: '{{ remote_install_path }}/foo.cfg'
	dest: '{{ abc }}'/abc.com # 문법 오류
	dest: '{{ abc }}/abc.com' # 올바른 문법 

변수 선언

- hosts: app_servers
  vars:
			 app_path: {{ base_path }}/22   # 문법 오류
       app_path: "{{ base_path }}/22" # 올바른 문법

반드시 따음표를 붙여줘야 한다.

region:
  - northeast
  - southeast
  - midwest
region: "{{ region[0] }}"

변수의 값으로 리스트를 가질 수 있고 region[인덱스 번호] 로 변수를 가져올 수 있다.

foo:
  field1: one
  field2: two
foo['field1']
foo.field1

변수를 딕셔너리 형태를 가질 수 있고 foo['field1'] 나 foo.field1 로 변수를 가져올 수 있다.

foo.field1 이 표기법은 가능할 때가 있고 가능하지 않을 때가 있다. 그래서 해당 표기법을 사용하는 것은 지양한다.

보통은 foo['field1'] 로 표기한다.

debug 모듈 사용

debug 모듈의 msg 속성을 사용하여 echo 를 찍는다.

[vagrant@controller 01_variable]$ cat test.yml
- hosts: 192.168.100.11
  vars: 
    msg: hello world
  tasks: 
    - debug:
        var: msg

[vagrant@controller 01_variable]$ ansible-playbook test.yaml 

PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello world"
}

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello world"
}

PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.100.11             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

var 파라미터는 변수명을 받도록 설계되어 있다. 그래서 var: msg 로 바로 변수를 받은 것이다.

일반적으로 변수를 참조할 때는 msg: ‘{{ msg }}’ 이렇게 받아야 한다.

debug 모듈을 사용하면 해당 내용들을 디버깅 할 수 있다.

[vagrant@controller 01_variable]$ cat test.yml
- hosts: 192.168.100.11
  vars: 
    msg: hello world
    web: 
      message: hello web
    fruits:
      - apple
      - banana

  tasks: 
    - debug:
        msg: '{{ msg }} korea' 
    - debug:
        msg: '{{ web["message"] }}'
    - debug:
        msg: '{{ fruits[0] }} {{ fruits[1] }}'
[vagrant@controller 01_variable]$ ansible-playbook test.yaml 

PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello world korea"
}

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello web"
}

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "apple banana"
}

PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.100.11             : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

'{{ web["message"] }}' 에서 '{{ web[’message’] }}' 로 할 경우 문법 오류가 발생한다.

Playbook 변수 사용하여 세팅해보기

- hosts: wp
  vars:
    php:
      remi_repo:
        pkg: <https://rpms.remirepo.net/enterprise/remi-release-7.rpm>
        safe_mirror: <http://cdn.remirepo.net/enterprise/7/safe/mirror>
        php74_mirror: <http://cdn.remirepo.net/enterprise/7/php74/mirror>
        gpgkey_path: /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    wp_pkg: httpd,php,php-mysql,mariadb,mariadb-server,python2-PyMySQL
    wp_version: '5.9.3'
    wp_file_name: 'wordpress-{{ wp_version }}.tar.gz'
    wp_source_url: '<https://wordpress.org/>{{ wp_file_name }}.tar.gz'
    mysql:
      dbname: wordpress
      dbuser: wpadm
      dbpwd: 1234
  tasks:
  - yum:
      name: '{{ php["remi_repo"]["pkg"] }}'
      state: present
      validate_certs: no
  - yum_repository:
      name: remi-safe
      file: remi-safe
      mirrorlist: '{{ php["remi_repo"]["safe_mirror"] }}'
      description: remi-safe
      enabled: no
  - yum_repository:
      name: remi-php74
      file: remi-php74
      mirrorlist: '{{ php["remi_repo"]["php74_mirror"] }}'
      description: remi-php74
      enabled: yes
  - rpm_key:
      key: '{{ php["remi_repo"]["gpgkey_path"] }}'
      state: present
  - yum:
      name: '{{ wp_pkg }}'
      state: installed
  - service:
      name: httpd 
      state: started
      enabled: yes
  - service:
      name: mariadb
      state: started
      enabled: yes
  - get_url:
      url: '{{ wp_source_url }}'
      dest: /home/vagrant
  - unarchive:
      src: '/home/vagrant/{{ wp_file_name }}'
      remote_src: yes
      dest: /var/www/html
      owner: apache
      group: apache
  - mysql_db:
      name: '{{ mysql["dbname"] }}'
      state: present
      login_user: root
  - mysql_user:
      name: '{{ mysql["dbuser"] }}'
      password: '{{ mysql["dbpwd"] }}'
      state: present
      login_user: root
      priv: '{{ mysql["dbname"] }}.*:ALL'
  - copy:
      src: /var/www/html/wordpress/wp-config-sample.php
      remote_src: yes
      dest: /var/www/html/wordpress/wp-config.php
      owner: apache
      group: apache
  - replace:
      path: /var/www/html/wordpress/wp-config.php
      regexp: username_here
      replace: '{{ mysql["dbuser"] }}'
  - replace: 
      path: /var/www/html/wordpress/wp-config.php
      regexp: database_name_here
      replace: '{{ mysql["dbname"] }}'
  - replace: 
      path: /var/www/html/wordpress/wp-config.php
      regexp: password_here
      replace: '{{ mysql["dbpwd"] }}'

위 처럼 세팅해줬다.

[vagrant@controller ~]$ ansible-playbook test.yml --diff -b

PLAY [wp] ***********************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum] **********************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum_repository] ***********************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum_repository] ***********************************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [rpm_key] ******************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum] **********************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [service] ******************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [service] ******************************************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [get_url] ******************************************************************************************************************************************************************************************
changed: [192.168.100.11]
ok: [192.168.100.12]

TASK [unarchive] ****************************************************************************************************************************************************************************************
changed: [192.168.100.12]
changed: [192.168.100.11]

TASK [mysql_db] *****************************************************************************************************************************************************************************************
changed: [192.168.100.11]
changed: [192.168.100.12]

TASK [mysql_user] ***************************************************************************************************************************************************************************************
[WARNING]: Module did not set no_log for update_password
changed: [192.168.100.11]
changed: [192.168.100.12]

TASK [copy] *********************************************************************************************************************************************************************************************
changed: [192.168.100.12]
changed: [192.168.100.11]

TASK [replace] ******************************************************************************************************************************************************************************************
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -23,7 +23,7 @@
 define( 'DB_NAME', 'database_name_here' );
 
 /** Database username */
-define( 'DB_USER', 'username_here' );
+define( 'DB_USER', 'wpadm' );
 
 /** Database password */
 define( 'DB_PASSWORD', 'password_here' );

changed: [192.168.100.12]
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -23,7 +23,7 @@
 define( 'DB_NAME', 'database_name_here' );
 
 /** Database username */
-define( 'DB_USER', 'username_here' );
+define( 'DB_USER', 'wpadm' );
 
 /** Database password */
 define( 'DB_PASSWORD', 'password_here' );

changed: [192.168.100.11]

TASK [replace] ******************************************************************************************************************************************************************************************
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -20,7 +20,7 @@
 
 // ** Database settings - You can get this info from your web host ** //
 /** The name of the database for WordPress */
-define( 'DB_NAME', 'database_name_here' );
+define( 'DB_NAME', 'wordpress' );
 
 /** Database username */
 define( 'DB_USER', 'wpadm' );

changed: [192.168.100.11]
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -20,7 +20,7 @@
 
 // ** Database settings - You can get this info from your web host ** //
 /** The name of the database for WordPress */
-define( 'DB_NAME', 'database_name_here' );
+define( 'DB_NAME', 'wordpress' );
 
 /** Database username */
 define( 'DB_USER', 'wpadm' );

changed: [192.168.100.12]

TASK [replace] ******************************************************************************************************************************************************************************************
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -26,7 +26,7 @@
 define( 'DB_USER', 'wpadm' );
 
 /** Database password */
-define( 'DB_PASSWORD', 'password_here' );
+define( 'DB_PASSWORD', '1234' );
 
 /** Database hostname */
 define( 'DB_HOST', 'localhost' );

changed: [192.168.100.11]
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -26,7 +26,7 @@
 define( 'DB_USER', 'wpadm' );
 
 /** Database password */
-define( 'DB_PASSWORD', 'password_here' );
+define( 'DB_PASSWORD', '1234' );
 
 /** Database hostname */
 define( 'DB_HOST', 'localhost' );

changed: [192.168.100.12]

PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.100.11             : ok=16   changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.12             : ok=16   changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

잘 작동하는 것을 확인할 수 있다.

등록 변수

공식 문서: https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html

registered variable

[vagrant@controller registered]$ cat test.yml
## ~/code/01_variable/registered/test.yml
- hosts: 192.168.100.11

  tasks:
    - yum: 
        name: httpd 
        state: installed
      # tasks 의 키워드
      register: yum_results # yum 모듈의 리턴 밸류들이 모두 register 에 등록된다.
    - debug:
        var: yum_results
    - debug:
        var: yum_results["changed"]
[vagrant@controller registered]$ ansible-playbook test.yml

PLAY [192.168.100.11] ******************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [yum] *****************************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "yum_results": {
        "changed": false, 
        "failed": false, 
        "msg": "", 
        "rc": 0, 
        "results": [
            "httpd-2.4.6-97.el7.centos.5.x86_64 providing httpd is already installed"
        ]
    }
}

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "yum_results[\\"changed\\"]": false
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

변수 정의 위치

  • 플레이북
  • 인벤토리
  • 외부 참조 파일
  • 역할
  • 명령 -e 옵션

플레이북에서 변수 정의

vars 를 이용한 일반적인 변수 정의 방법

- hosts: a
	vars:
		message: hello

vars_prompt 를 이용한 변수 정의 방법, 대화형 으로 변수를 묻고 입력받는 형식이다.

공식문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html#interactive-input-prompts

[vagrant@controller prompt]$ cat test.yml
---
- hosts: 192.168.100.11
  vars_prompt:

    - name: username
      prompt: What is your username?
      private: no

    - name: password
      prompt: What is your password?

  tasks:

    - debug:
        msg: 'Logging in as {{ username }}, {{ password }}'
[vagrant@controller prompt]$ ansible-playbook test.yml 
What is your username?: choi
What is your password?: 

PLAY [192.168.100.11] ******************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "Logging in as choi, 1234"
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    

vars_files 를 이용하여 다른 yml 파일에서 변수를 가져오는 방식

[vagrant@controller ~]$ cat test.yml
- hosts: a
	vars_files:
		- vars.yml
	task:
		- debug:
				var: msg

[vagrant@controller ~]$ cat vars.yml
msg: hello world

인벤토리에서 변수 정의

[vagrant@controller inven]$ cat inventory.ini
[nodes]
192.168.100.11 msg=seoul
192.168.100.12 msg=busan

[nodes:vars]
message="hello world"

[vagrant@controller inven]$ cat test.yml
- hosts: nodes
  tasks:
    - debug:
        var: msg
    - debug:
        var: message

[vagrant@controller inven]$ ansible-playbook -i inventory.ini test.yml 

PLAY [nodes] ***************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "seoul"
}
ok: [192.168.100.12] => {
    "msg": "busan"
}

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "message": "hello world"
}
ok: [192.168.100.12] => {
    "message": "hello world"
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.12             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0s

-e 옵션을 사용하여 변수를 선언할 수 있다. -e 옵션으로 선언된 변수명이 똑같을 경우 -e 옵션의 변수가 우선순위가 더 높다.

[vagrant@controller inven]$ ansible-playbook -i inventory.ini test.yml -e msg=korea

PLAY [nodes] ***************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "korea"
}
ok: [192.168.100.12] => {
    "msg": "korea"
}

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "message": "hello world"
}
ok: [192.168.100.12] => {
    "message": "hello world"
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.12             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

변수의 우선 순위

공식 문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#understanding-variable-precedence

숫자가 높을수록 우선순위가 높다.

우선 순위 낮음

  • 인벤토리 변수
  • 플레이 vars
  • 플레이 vars_prompt
  • 플레이 vars_files
  • 명령 -e, --extras-vars

우선 순위 높음

변수의 범위

  • 글로벌: 명령의 -e 옵션
  • 플레이: vars, vars_files, vars_prompt
  • 호스트: 인벤토리 변수

필터

공식 문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html

변수에서 필요한 내용만 취득하거나, 변수에서 값을 가공/형식변경(transform) 할 수 있다.

{{ 변수명 | filter }}

필터는 엄청 많아서 필요한 것을 공식 문서에서 찾아서 사용하면 된다.

- hosts: 192.168.100.11
  vars:
    pwd: 1234 
  tasks:
    -user:
        name: devops
        password: '{{ pwd | password_hash("sha512", 65534 | random(seed=inventoy_hostname) | string) }}'
        state: present

비밀번호 해쉬화를 할 때도 위처럼 가능하다.

팩트 변수

SetUp 모듈에 의해 수집(하드웨어, os) 되는 호스트 변수

플레이북 실행 시 항상 첫 작업 Gathering Facts 모듈에 의해 실행된다.

ansible [ip 주소/호스트 명] -m setup 명령어를 입력하면 팩트 변수들이 나온다.

[vagrant@controller fact]$ ansible 192.168.100.11 -m setup
192.168.100.11 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.100.11", 
            "10.0.2.15"
        ],
.
.
.
.

yml 파일에서 팩트 변수를 사용하여 해당 시스템의 하드웨어 소프트웨어 정보 등 메타 데이터를 얻을 수 있다.

[vagrant@controller fact]$ cat test.yml
- hosts: 192.168.100.11
  tasks:
    - debug:
        msg: '{{ ansible_hostname }}'
    - debug:
        msg: '{{ ansible_all_ipv4_addresses }}'

모든 운영체제에서 워드 프레스를 실행시키고 싶다. → 팩트 변수 ansible_distribution 를 사용하여 처리한다.

혹은 메모리가 16GB 이상인 경우 어떤 소프트웨어를 설치하도록 하고 싶다. 이것 또한 팩트 변수를 사용하여 처리할 수 있다.

즉, 팩트 변수를 사용하면 모든 케이스의 시나리오를 처리할 수 있다는 것이다.

특수 변수

공식 문서: https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html

  • groups
  • hostvars
  • inventory_hostname

ansible 변수

변수 명명 규칙

유효한 변수 명은 위와 같다.

유효하지 않은 변수명은 위와 같다, 숫자로 구성되거나 하이푼, 띄어쓰기, . 이 포함된 변수명, *과 같이 파이썬에서 사용되는 키워드로 작성된 변수 혹은 플레이북 키워드가 변수명에 들어올 경우 유효하지 않은 변수명이 된다.

remote_install_path: /opt/my_app_config

변수명은 키: 밸류 형태로 구성된다.

---
ansible.builtin.template:
  src: foo.cfg.j2
  name: '{{ abc }}'
	dest: '{{ remote_install_path }}/foo.cfg'
	dest: '{{ abc }}'/abc.com # 문법 오류
	dest: '{{ abc }}/abc.com' # 올바른 문법 

변수 선언

- hosts: app_servers
  vars:
			 app_path: {{ base_path }}/22   # 문법 오류
       app_path: "{{ base_path }}/22" # 올바른 문법

반드시 따음표를 붙여줘야 한다.

region:
  - northeast
  - southeast
  - midwest
region: "{{ region[0] }}"

변수의 값으로 리스트를 가질 수 있고 region[인덱스 번호] 로 변수를 가져올 수 있다.

foo:
  field1: one
  field2: two
foo['field1']
foo.field1

변수를 딕셔너리 형태를 가질 수 있고 foo['field1'] 나 foo.field1 로 변수를 가져올 수 있다.

foo.field1 이 표기법은 가능할 때가 있고 가능하지 않을 때가 있다. 그래서 해당 표기법을 사용하는 것은 지양한다.

보통은 foo['field1'] 로 표기한다.

debug 모듈 사용

debug 모듈의 msg 속성을 사용하여 echo 를 찍는다.

[vagrant@controller 01_variable]$ cat test.yml
- hosts: 192.168.100.11
  vars: 
    msg: hello world
  tasks: 
    - debug:
        var: msg

[vagrant@controller 01_variable]$ ansible-playbook test.yaml 

PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello world"
}

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello world"
}

PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.100.11             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

var 파라미터는 변수명을 받도록 설계되어 있다. 그래서 var: msg 로 바로 변수를 받은 것이다.

일반적으로 변수를 참조할 때는 msg: ‘{{ msg }}’ 이렇게 받아야 한다.

debug 모듈을 사용하면 해당 내용들을 디버깅 할 수 있다.

[vagrant@controller 01_variable]$ cat test.yml
- hosts: 192.168.100.11
  vars: 
    msg: hello world
    web: 
      message: hello web
    fruits:
      - apple
      - banana

  tasks: 
    - debug:
        msg: '{{ msg }} korea' 
    - debug:
        msg: '{{ web["message"] }}'
    - debug:
        msg: '{{ fruits[0] }} {{ fruits[1] }}'
[vagrant@controller 01_variable]$ ansible-playbook test.yaml 

PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello world korea"
}

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "hello web"
}

TASK [debug] ********************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "apple banana"
}

PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.100.11             : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

'{{ web["message"] }}' 에서 '{{ web[’message’] }}' 로 할 경우 문법 오류가 발생한다.

Playbook 변수 사용하여 세팅해보기

- hosts: wp
  vars:
    php:
      remi_repo:
        pkg: <https://rpms.remirepo.net/enterprise/remi-release-7.rpm>
        safe_mirror: <http://cdn.remirepo.net/enterprise/7/safe/mirror>
        php74_mirror: <http://cdn.remirepo.net/enterprise/7/php74/mirror>
        gpgkey_path: /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    wp_pkg: httpd,php,php-mysql,mariadb,mariadb-server,python2-PyMySQL
    wp_version: '5.9.3'
    wp_file_name: 'wordpress-{{ wp_version }}.tar.gz'
    wp_source_url: '<https://wordpress.org/>{{ wp_file_name }}.tar.gz'
    mysql:
      dbname: wordpress
      dbuser: wpadm
      dbpwd: 1234
  tasks:
  - yum:
      name: '{{ php["remi_repo"]["pkg"] }}'
      state: present
      validate_certs: no
  - yum_repository:
      name: remi-safe
      file: remi-safe
      mirrorlist: '{{ php["remi_repo"]["safe_mirror"] }}'
      description: remi-safe
      enabled: no
  - yum_repository:
      name: remi-php74
      file: remi-php74
      mirrorlist: '{{ php["remi_repo"]["php74_mirror"] }}'
      description: remi-php74
      enabled: yes
  - rpm_key:
      key: '{{ php["remi_repo"]["gpgkey_path"] }}'
      state: present
  - yum:
      name: '{{ wp_pkg }}'
      state: installed
  - service:
      name: httpd 
      state: started
      enabled: yes
  - service:
      name: mariadb
      state: started
      enabled: yes
  - get_url:
      url: '{{ wp_source_url }}'
      dest: /home/vagrant
  - unarchive:
      src: '/home/vagrant/{{ wp_file_name }}'
      remote_src: yes
      dest: /var/www/html
      owner: apache
      group: apache
  - mysql_db:
      name: '{{ mysql["dbname"] }}'
      state: present
      login_user: root
  - mysql_user:
      name: '{{ mysql["dbuser"] }}'
      password: '{{ mysql["dbpwd"] }}'
      state: present
      login_user: root
      priv: '{{ mysql["dbname"] }}.*:ALL'
  - copy:
      src: /var/www/html/wordpress/wp-config-sample.php
      remote_src: yes
      dest: /var/www/html/wordpress/wp-config.php
      owner: apache
      group: apache
  - replace:
      path: /var/www/html/wordpress/wp-config.php
      regexp: username_here
      replace: '{{ mysql["dbuser"] }}'
  - replace: 
      path: /var/www/html/wordpress/wp-config.php
      regexp: database_name_here
      replace: '{{ mysql["dbname"] }}'
  - replace: 
      path: /var/www/html/wordpress/wp-config.php
      regexp: password_here
      replace: '{{ mysql["dbpwd"] }}'

위 처럼 세팅해줬다.

[vagrant@controller ~]$ ansible-playbook test.yml --diff -b

PLAY [wp] ***********************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum] **********************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum_repository] ***********************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum_repository] ***********************************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [rpm_key] ******************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [yum] **********************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [service] ******************************************************************************************************************************************************************************************
ok: [192.168.100.12]
ok: [192.168.100.11]

TASK [service] ******************************************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [get_url] ******************************************************************************************************************************************************************************************
changed: [192.168.100.11]
ok: [192.168.100.12]

TASK [unarchive] ****************************************************************************************************************************************************************************************
changed: [192.168.100.12]
changed: [192.168.100.11]

TASK [mysql_db] *****************************************************************************************************************************************************************************************
changed: [192.168.100.11]
changed: [192.168.100.12]

TASK [mysql_user] ***************************************************************************************************************************************************************************************
[WARNING]: Module did not set no_log for update_password
changed: [192.168.100.11]
changed: [192.168.100.12]

TASK [copy] *********************************************************************************************************************************************************************************************
changed: [192.168.100.12]
changed: [192.168.100.11]

TASK [replace] ******************************************************************************************************************************************************************************************
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -23,7 +23,7 @@
 define( 'DB_NAME', 'database_name_here' );
 
 /** Database username */
-define( 'DB_USER', 'username_here' );
+define( 'DB_USER', 'wpadm' );
 
 /** Database password */
 define( 'DB_PASSWORD', 'password_here' );

changed: [192.168.100.12]
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -23,7 +23,7 @@
 define( 'DB_NAME', 'database_name_here' );
 
 /** Database username */
-define( 'DB_USER', 'username_here' );
+define( 'DB_USER', 'wpadm' );
 
 /** Database password */
 define( 'DB_PASSWORD', 'password_here' );

changed: [192.168.100.11]

TASK [replace] ******************************************************************************************************************************************************************************************
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -20,7 +20,7 @@
 
 // ** Database settings - You can get this info from your web host ** //
 /** The name of the database for WordPress */
-define( 'DB_NAME', 'database_name_here' );
+define( 'DB_NAME', 'wordpress' );
 
 /** Database username */
 define( 'DB_USER', 'wpadm' );

changed: [192.168.100.11]
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -20,7 +20,7 @@
 
 // ** Database settings - You can get this info from your web host ** //
 /** The name of the database for WordPress */
-define( 'DB_NAME', 'database_name_here' );
+define( 'DB_NAME', 'wordpress' );
 
 /** Database username */
 define( 'DB_USER', 'wpadm' );

changed: [192.168.100.12]

TASK [replace] ******************************************************************************************************************************************************************************************
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -26,7 +26,7 @@
 define( 'DB_USER', 'wpadm' );
 
 /** Database password */
-define( 'DB_PASSWORD', 'password_here' );
+define( 'DB_PASSWORD', '1234' );
 
 /** Database hostname */
 define( 'DB_HOST', 'localhost' );

changed: [192.168.100.11]
--- before: /var/www/html/wordpress/wp-config.php
+++ after: /var/www/html/wordpress/wp-config.php
@@ -26,7 +26,7 @@
 define( 'DB_USER', 'wpadm' );
 
 /** Database password */
-define( 'DB_PASSWORD', 'password_here' );
+define( 'DB_PASSWORD', '1234' );
 
 /** Database hostname */
 define( 'DB_HOST', 'localhost' );

changed: [192.168.100.12]

PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.100.11             : ok=16   changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.12             : ok=16   changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

잘 작동하는 것을 확인할 수 있다.

등록 변수

공식 문서: https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html

registered variable

[vagrant@controller registered]$ cat test.yml
## ~/code/01_variable/registered/test.yml
- hosts: 192.168.100.11

  tasks:
    - yum: 
        name: httpd 
        state: installed
      # tasks 의 키워드
      register: yum_results # yum 모듈의 리턴 밸류들이 모두 register 에 등록된다.
    - debug:
        var: yum_results
    - debug:
        var: yum_results["changed"]
[vagrant@controller registered]$ ansible-playbook test.yml

PLAY [192.168.100.11] ******************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [yum] *****************************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "yum_results": {
        "changed": false, 
        "failed": false, 
        "msg": "", 
        "rc": 0, 
        "results": [
            "httpd-2.4.6-97.el7.centos.5.x86_64 providing httpd is already installed"
        ]
    }
}

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "yum_results[\\"changed\\"]": false
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

변수 정의 위치

  • 플레이북
  • 인벤토리
  • 외부 참조 파일
  • 역할
  • 명령 -e 옵션

플레이북에서 변수 정의

vars 를 이용한 일반적인 변수 정의 방법

- hosts: a
	vars:
		message: hello

vars_prompt 를 이용한 변수 정의 방법, 대화형 으로 변수를 묻고 입력받는 형식이다.

공식문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html#interactive-input-prompts

[vagrant@controller prompt]$ cat test.yml
---
- hosts: 192.168.100.11
  vars_prompt:

    - name: username
      prompt: What is your username?
      private: no

    - name: password
      prompt: What is your password?

  tasks:

    - debug:
        msg: 'Logging in as {{ username }}, {{ password }}'
[vagrant@controller prompt]$ ansible-playbook test.yml 
What is your username?: choi
What is your password?: 

PLAY [192.168.100.11] ******************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "Logging in as choi, 1234"
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    

vars_files 를 이용하여 다른 yml 파일에서 변수를 가져오는 방식

[vagrant@controller ~]$ cat test.yml
- hosts: a
	vars_files:
		- vars.yml
	task:
		- debug:
				var: msg

[vagrant@controller ~]$ cat vars.yml
msg: hello world

인벤토리에서 변수 정의

[vagrant@controller inven]$ cat inventory.ini
[nodes]
192.168.100.11 msg=seoul
192.168.100.12 msg=busan

[nodes:vars]
message="hello world"

[vagrant@controller inven]$ cat test.yml
- hosts: nodes
  tasks:
    - debug:
        var: msg
    - debug:
        var: message

[vagrant@controller inven]$ ansible-playbook -i inventory.ini test.yml 

PLAY [nodes] ***************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "seoul"
}
ok: [192.168.100.12] => {
    "msg": "busan"
}

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "message": "hello world"
}
ok: [192.168.100.12] => {
    "message": "hello world"
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.12             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0s

-e 옵션을 사용하여 변수를 선언할 수 있다. -e 옵션으로 선언된 변수명이 똑같을 경우 -e 옵션의 변수가 우선순위가 더 높다.

[vagrant@controller inven]$ ansible-playbook -i inventory.ini test.yml -e msg=korea

PLAY [nodes] ***************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "msg": "korea"
}
ok: [192.168.100.12] => {
    "msg": "korea"
}

TASK [debug] ***************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
    "message": "hello world"
}
ok: [192.168.100.12] => {
    "message": "hello world"
}

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.100.11             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.12             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

변수의 우선 순위

공식 문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#understanding-variable-precedence

숫자가 높을수록 우선순위가 높다.

우선 순위 낮음

  • 인벤토리 변수
  • 플레이 vars
  • 플레이 vars_prompt
  • 플레이 vars_files
  • 명령 -e, --extras-vars

우선 순위 높음

변수의 범위

  • 글로벌: 명령의 -e 옵션
  • 플레이: vars, vars_files, vars_prompt
  • 호스트: 인벤토리 변수

필터

공식 문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html

변수에서 필요한 내용만 취득하거나, 변수에서 값을 가공/형식변경(transform) 할 수 있다.

{{ 변수명 | filter }}

필터는 엄청 많아서 필요한 것을 공식 문서에서 찾아서 사용하면 된다.

- hosts: 192.168.100.11
  vars:
    pwd: 1234 
  tasks:
    -user:
        name: devops
        password: '{{ pwd | password_hash("sha512", 65534 | random(seed=inventoy_hostname) | string) }}'
        state: present

비밀번호 해쉬화를 할 때도 위처럼 가능하다.

팩트 변수

SetUp 모듈에 의해 수집(하드웨어, os) 되는 호스트 변수

플레이북 실행 시 항상 첫 작업 Gathering Facts 모듈에 의해 실행된다.

ansible [ip 주소/호스트 명] -m setup 명령어를 입력하면 팩트 변수들이 나온다.

[vagrant@controller fact]$ ansible 192.168.100.11 -m setup
192.168.100.11 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.100.11", 
            "10.0.2.15"
        ],
.
.
.
.

yml 파일에서 팩트 변수를 사용하여 해당 시스템의 하드웨어 소프트웨어 정보 등 메타 데이터를 얻을 수 있다.

[vagrant@controller fact]$ cat test.yml
- hosts: 192.168.100.11
  tasks:
    - debug:
        msg: '{{ ansible_hostname }}'
    - debug:
        msg: '{{ ansible_all_ipv4_addresses }}'

모든 운영체제에서 워드 프레스를 실행시키고 싶다. → 팩트 변수 ansible_distribution 를 사용하여 처리한다.

혹은 메모리가 16GB 이상인 경우 어떤 소프트웨어를 설치하도록 하고 싶다. 이것 또한 팩트 변수를 사용하여 처리할 수 있다.

즉, 팩트 변수를 사용하면 모든 케이스의 시나리오를 처리할 수 있다는 것이다.

특수 변수

공식 문서: https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html

  • groups
  • hostvars
  • inventory_hostname   
728x90