Ansible-playbook의 변수 및 참조
Ansible 기본 Inventory 파일은 INI 형식입니다.먼저 정의된 host 파일을 보고 테스트를 시작합니다.
[root@zero01 inventory]# cat host_playbook
192.168.79.129 key=129
192.168.79.130 key=130
192.168.79.131 key=131
192.168.79.132 key=132
[nginx]
192.168.79.1[29:32]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
그런 다음 Playbook 파일을 작성하여 변수의 참조가 올바른지 확인합니다. 내용은 다음과 같습니다.
[root@zero01 playbook]# cat variable.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: diplay Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
playbook을 실행합니다(playbook 파일에서 실행할 절대 경로를 지정하지 않음).
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is 129"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is 130"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is 131"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is 132"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
모든 호스트가 자신의 호스트 변수 키를 인용한 것을 볼 수 있다.다음은 호스트 그룹 변수를 테스트하기 시작합니다. 각 호스트의 변수 정의를 설명한 다음nginx그룹에 호스트 그룹 변수를 정의합니다. 변수 이름은 키이고 값은zero 입니다.gg(여기서 변수 이름을 수정하려면 playbook을 수정해야 함)
[root@zero01 inventory]# cat host_playbook
#192.168.79.129 key=129
#192.168.79.130 key=130
#192.168.79.131 key=131
#192.168.79.132 key=132
[nginx]
192.168.79.1[29:32]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
key=zero_gg
playbook 파일을 실행하려면:
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is zero_gg"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is zero_gg"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is zero_gg"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is zero_gg"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
보시다시피 호스트 그룹 변수는 그룹 내의 모든 호스트에 적용됩니다.주의: 호스트가 호스트 변수와 호스트 그룹 변수를 동시에 정의하면 이름이 같으면 호스트 변수가 효력이 발생하고 호스트 그룹 변수는 효력이 발생하지 않습니다.이름이 같지 않아 모두 호출할 수 있습니다.
2./etc/ansible/의 파일을 통해 호스트 및 호스트 그룹 변수 정의
yum을 사용하여 Ansible를 설치하는 기본 프로필은/etc/ansible/디렉터리입니다. 이 디렉터리에서 폴더host 를 만들 수 있습니다.vars 호스트 변수를 정의하고 그룹 생성vars에서 호스트 그룹 변수를 정의합니다. (이 경우 yaml 파일이/etc/ansible/의 하위 디렉터리에 있지 않도록 요구합니다.)다른 설치 방식을 사용한다면 플레이북 파일의 현재 디렉터리에 두 개의 디렉터리를 만들면 됩니다.다음과 같습니다.
[root@zero01 ansible]# tree
.
├── ansible.cfg
├── hosts
├── inventory
│ ├── host
│ └── host_playbook
├── playbook
│ ├── group_vars
│ │ └── nginx
│ ├── host_vars
│ │ ├── 192.168.79.129
│ │ ├── 192.168.79.130
│ │ ├── 192.168.79.131
│ │ └── 192.168.79.132
│ ├── nginx.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── variable.retry
│ └── variable.yaml
└── roles
[root@zero01 inventory]# cat host
192.168.79.129
192.168.79.130
192.168.79.131
192.168.79.132
[nginx]
192.168.79.1[29:32]
그룹에서 각각vars、host_vars에서 다음과 같은 호스트 그룹 변수 파일과 호스트 변수 파일을 만듭니다.
[root@zero01 ansible]# cat group_vars/nginx
---
key: zero_gg
[root@zero01 ansible]# head host_vars/*
==> host_vars/192.168.79.129 <==
---
key: 192.168.79.129
==> host_vars/192.168.79.130 <==
---
key: 192.168.79.130
==> host_vars/192.168.79.131 <==
---
key: 192.168.79.131
==> host_vars/192.168.79.132 <==
---
key: 192.168.79.132
playbook 파일을 실행하면 다음과 같은 결과가 나타납니다.
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is 192.168.79.129"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is 192.168.79.130"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is 192.168.79.131"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is 192.168.79.132"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
위에서 검증할 수 있듯이 호스트 변수와 호스트 그룹 변수가 동시에 존재하고 이름이 같으면 호스트 변수만 효력이 발생하고 호스트 그룹 변수는 효력이 발생하지 않는다.
다음 그룹 확인vars/의 nginx 그룹에 대한 호스트 그룹 변수는 다음과 같습니다.
4
[root@zero01 playbook]# rm -rf host_vars/*
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is zero_gg"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is zero_gg"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is zero_gg"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is zero_gg"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
ansible-playbook 명령줄을 통해 전달ansible-playbook 명령행 참조를 통해 변수를 정의하고 기본적으로 전달되는 것은 전역 변수입니다. 다음과 같습니다.
[root@zero01 playbook]# ansible-playbook variable.yaml -e "key=ZERO"
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is ZERO"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is ZERO"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is ZERO"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is ZERO"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
이 방식은 여러 개의 변수를 동시에 전송할 수 있고 지정된 파일의 방식으로 변수를 전송할 수 있다. 변수의 파일 내용은 두 가지 형식을 지원한다. YAML과 JSON이다.
YAML:
[root@zero01 tmp]# cat var.yaml
---
key: YAML
[root@zero01 playbook]# ansible-playbook variable.yaml -e "@/tmp/var.yaml"
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is YAML"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is YAML"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is YAML"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is YAML"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
JSON:
[root@zero01 tmp]# cat var.json
{"key": "JSON"}
[root@zero01 playbook]# ansible-playbook variable.yaml -e "@/tmp/var.json"
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is JSON"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is JSON"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is JSON"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is JSON"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
4. 플레이북 파일에서 vars 사용
[root@zero01 playbook]# vi variable.yaml
---
- hosts: all
gather_facts: False
vars:
key: Ansible
tasks:
- name: diplay Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
다음과 같이 직접 실행합니다.
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is Ansible"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is Ansible"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is Ansible"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is Ansible"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
위와 같이playbook 파일에 정의된 변수는 모든 호스트에 유효하며 호스트 그룹 변수로 이해할 수 있습니다.
5、playbook 파일에서 vars 사용files
[root@zero01 playbook]# cat variable.yaml
---
- hosts: all
gather_facts: False
vars_files:
- /tmp/var.yaml
tasks:
- name: diplay Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
vars_파일은 기본적으로 현재 경로를 검색합니다. 파일이 현재 디렉터리에 없으면 절대 경로를 표시해야 합니다.
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is YAML"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is YAML"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is YAML"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is YAML"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
6、register 내 변수 사용
Ansible playbook 내task 간에 서로 데이터를 전달할 수 있습니다. 예를 들어 우리는 모두 두 개의tasks가 있는데 그 중에서 두 번째task가 실행되는지 여부는 첫 번째task가 실행된 후의 결과를 판단해야 합니다. 이럴 때task 사이에서 데이터를 전달해야 하고 첫 번째task가 실행한 결과를 두 번째task에 전달해야 합니다.
Ansible task 간 데이터 전송에 register 사용
[root@zero01 playbook]# cat register.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The variable is {{ info }}"
여기에는 첫 번째task가hostname을 실행한 결과register를 info 변수에 주고 두 번째task는 이 결과를 debug 템플릿으로 출력합니다.
다음과 같습니다.
[root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129
PLAY [all] *******************************************************************************************************************
TASK [register variable] *******************************************************************************************************************
changed: [192.168.79.129]
TASK [display variable] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The variable is {'stderr_lines': [], u'changed': True, u'end': u'2017-12-23 17:46:05.777637', 'failed': False, u'stdout': u'zero02', u'cmd': u'hostname', u'rc': 0, u'start': u'2017-12-23 17:46:05.768962', u'stderr': u'', u'delta': u'0:00:00.008675', 'stdout_lines': [u'zero02']}"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=2 changed=1 unreachable=0 failed=0
info의 결과는 파이썬 사전 데이터로 실행 시간 상태 변화 출력 등 많은 정보를 저장합니다.사전에서 원하는 값을 꺼내다
[root@zero01 playbook]# cat register.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The variable is {{ info['stdout'] }}"
register 수정yaml 파일 내용, info['stdout']는 표준 Python 언어가 사전에서 값을 얻는 방법으로playbook을 실행합니다. 아래와 같습니다.
[root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129
PLAY [all] *******************************************************************************************************************
TASK [register variable] *******************************************************************************************************************
changed: [192.168.79.129]
TASK [display variable] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The variable is zero02"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=2 changed=1 unreachable=0 failed=0
7、vars 사용prompt 전송
Ansible는 플레이북을 실행할 때 정의된 매개 변수에 상호작용을 통해 매개 변수 값을 전송할 수 있도록 지원합니다. 플레이북에서 vars 를 정의하기만 하면 됩니다.prompt의 변수 이름과 상호작용 알림 내용만 있으면 됩니다.Ansible는 SHA512와 MD5 알고리즘으로 암호화하는 등 입력한 변수 값을 암호화 처리할 수 있습니다.주의: 변수 값을 암호화하려면 ansible 기기에passlib python 라이브러리를 설치해야 합니다
[root@zero01 playbook]# cat prompt.yaml
---
- hosts: all
gather_facts: False
vars_prompt:
- name: "one"
prompt: "Please input one value"
private: no
- name: "two"
prompt: "Please input two value"
default: 'good'
private: yes
tasks:
- name: display one value
debug: msg="one value is {{ one }}"
- name: display two value
debug: msg="two value is {{ two }}"
one는 비사유 변수이고, two는 사유 변수이며,private의 역할은 상호작용 모드에서 입력한 변수 값을 표시하는지 여부입니다.
[root@zero01 playbook]# ansible-playbook prompt.yaml -l 192.168.79.129
Please input one value: Ansible
Please input two value [good]:
PLAY [all] *******************************************************************************************************************
TASK [display one value] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "one value is Ansible"
}
TASK [display two value] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "two value is zero"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=2 changed=0 unreachable=0 failed=0
여기에 7에서 자주 사용하는 정의 변수의 방식과 어떻게 인용하는지를 총결하였다.여러분을 환영합니다. 실천이 바로잡아 주셔서 감사합니다!
zero_gg: 지혜롭고 겸손하고...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.