第六节:Ansible变量进阶

一、Ansible定义变量

1.设置变量的方法

1.在主机清单中配置变量
2.在命令行定义变量
3.在playbook中定义变量

4.使用内置变量
5.通过vars_file定义变量
6.通过host_vars和group_vars定义变量

2.变量优先级测试

1)在playbook中定义变量

[root@m01 project]# vim test.yml 
- hosts: web_group
  vars:
    file: playbook_vars
  tasks:
    - name: Touch File
      file:
        path: /tmp/{{ file }}
        state: touch

2)在vars_file中定义变量

#1.定义变量文件
[root@m01 project]# vim vars.yml
file: vars_file

#2.剧本调用
[root@m01 project]# vim test.yml 
- hosts: web_group
  vars:
    file: playbook_vars
  vars_files: /project/vars.yml
  tasks:
    - name: Touch File
      file:
        path: /tmp/{{ file }}
        state: touch

3)主机清单定义变量

[root@m01 project]# vim /etc/ansible/hosts 
[web_group:vars]
file=inventory_vars

4)host_vars 定义变量

[root@m01 project]# vim host_vars/web01
file: host_vars

5)group_vars定义变量

[root@m01 project]# vim group_vars/web_group 
file: group_vars

6)命令行定义变量

[root@m01 project]# ansible-playbook test.yml -e "file=command"

7)测试优先级结果

命令行优先级 > vars_file优先级 > playbook_vars优先级 > host_vars优先级 > group_vars优先级 > 主机清单中主机组的优先级 > 主机清单中整合组的优先级

3.层级定义变量

#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
  framework:
    web_package: httpd
    db_package: mariadb-server
    php_package: php

lnmp:
  framework:
    web_package: nginx
    db_package: mysql
    php_package: php

lnmt:
  framework:
    web_package: nginx
    db_package: mysql
    java_package: tomcat

#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp.framework.web_package }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp.framework.db_package }}"

    - name: Install LAMP php
      yum:
        name: "{{ lamp.framework.php_package }}"

#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp['framework']['web_package'] }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp['framework']['db_package'] }}"

    - name: Install LAMP php
      yum:
        name: "{{ lamp['framework']['php_package'] }}"

#执行playbook
[root@m01 ~]# ansible-playbook test.yml

二、变量注册

当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是...默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值'存储'到变量中,这样我们就能通过'调用'对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册

1.使用ad-hoc模式会得到返回结果

[root@m01 project]# ansible web01 -m shell -a 'ls -l /tmp'
web01 | CHANGED | rc=0 >>
total 0
drwx------. 2 root root 41 Dec 23 15:07 ansible_command_payload_Q9bnkr
-rw-r--r--. 1 root root  0 Dec 23 14:54 command
-rw-r--r--. 1 root root  0 Dec 23 14:57 host_vars
-rw-r--r--. 1 root root  0 Dec 23 14:56 playbook_vars
-rw-r--r--. 1 root root  0 Dec 23 14:55 vars_file

2.使用playbook执行同样的命令得不到结果

[root@m01 project]# cat test.yml 
- hosts: web_group
  tasks:
    - name: Touch File
      shell: "ls -l /tmp"

[root@m01 project]# ansible-playbook test.yml 
PLAY [web_group] *****************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [web01]
ok: [web02]

TASK [Touch File] ****************************************************************************************************
changed: [web01]
changed: [web02]

PLAY RECAP ***********************************************************************************************************
web01                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
web02                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3.使用注册变量的方式

1)注册一个变量

[root@m01 project]# vim test.yml 
- hosts: web_group
  tasks:
    - name: Touch File
      shell: "ls -l /tmp"
      register: get_dir_list

2)调用并输出变量

[root@m01 project]# vim test.yml 
- hosts: web_group
  tasks:
    - name: Touch File
      shell: "ls -l /tmp"
      register: get_dir_list

    - name: Get Register
      debug:
        msg: "{{ get_dir_list }}"

3)只输出想要的部分

[root@m01 project]# vim test.yml 
- hosts: web_group
  tasks:
    - name: Touch File
      shell: "ls -l /tmp"
      register: get_dir_list

    - name: Get Register
      debug:
        msg: "{{ get_dir_list['stdout_lines'] }}"

4.变量注册一般使用场景

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术