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
변수의 우선 순위
숫자가 높을수록 우선순위가 높다.
우선 순위 낮음
- 인벤토리 변수
- 플레이 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
변수의 우선 순위
숫자가 높을수록 우선순위가 높다.
우선 순위 낮음
- 인벤토리 변수
- 플레이 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