Ansible-playbook의 변수 및 참조

19948 단어
1. Inventory 파일에서 호스트 및 호스트 그룹 변수 정의
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: 지혜롭고 겸손하고...

좋은 웹페이지 즐겨찾기