变量概述

变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。

定义变量的方式

1.通过命令行进行变量定义 2.在play文件中进行变量定义 3.通过Inventory主机信息文件中进行变量定义

变量的优先级

1.命令行中:age=11 2.play文件中:age=12 3.Inventory中:age=13 那么,最终的age结果一定是13

变量的读取优先级为:

命令行 > playbook文件 > Inventory文件


变量定义

playbook中vars定义变量
playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义。
	
- hosts: aa_group
  vars:
    packages:
      - apache2
      - mariadb-server
      - nginx
      - php-mysql
      - php-pdo
      - php
  tasks:       
  - name: Install apache2  mariadb php Server
    apt:
      name: "{{ packages }}"
 
#方法二:
- hosts: web_group
  vars:
      - web_server: apache2
      - db_server: mariadb-server
      - php_server:
        - php
        - php-mysql
        - php-pdo
   tasks:
  - name: Install httpd  mariadb php Server
    apt:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"
        - "{{ php_server }}"

使用var_file定义变量

刚才我们学到在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采取第二种定义变量的方式,在vars_file中定义变量。
#定义阶段
[root@m01 ~]# cat vars1.yml
web_server: apache2
[root@m01 ~]# cat vars2.yml
db_server: mariadb-server
 
#调用阶段
- hosts: web_group
  vars_files: ./vars1.yml
  tasks:
  - name: Install apache2
    yum:
      name: "{{ web_server }}"
	
#定义阶段
[root@m01 ~]# cat vars1.yml
web_server: apache2
[root@m01 ~]# cat vars2.yml
db_server: mariadb-server
 
#调用阶段
- hosts: aa_group
  vars_file: 
    - ./vars1.yml
    - ./vars2.yml
  - name: Install httpd  mariadb php Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"
 
#获取Ansible内置变量
- hosts: aa_group
  vars:
    - remote_ip: "{{ ansible_default_ipv4['address'] }}"
    - remote_hostname: "{{ ansible_fqdn }}"
  tasks:
    - name: Touch IP File
      file:
        path: /root/{{ remote_ip }}
        state: touch
 
    - name: Touch Hostname File
      file:
        path: /root/{{ remote_hostname }}
        state: touch

在主机清单定义变量

注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
	
#定义阶段
vim /etc/ansible/hosts
[aa_group]
aaa01 ansible_ssh_host=10.0.0.101
aaa02 ansible_ssh_host=10.0.0.102
[aa_group:vars]
web_server=apache2
index_file=index.html
 
#调用阶段
- hosts: aa_group
  tasks:
  - name: Install httpd Server
    pat:
      name: "{{ web_server }}"
  - name: Create Index File
    file:
      path: /tmp/{{ index_file }}
      state: touch 


官方推荐变量定义 (groupvar 和 hostvar)

之l致,不能做任何修改。
1.定义组变量
#定义阶段
mkdir group_vars
 
#切记定义变量的文件必须以组名为文件名
vim /root/group_vars/aa_group
web_server: apache2
 
#调用阶段
- hosts: aa_group
  tasks:
  - name: Install httpd Server
    apt:
      name: "{{ web_server }}"
2.主机定义变量
	
#定义阶段
mkdir host_vars
 
#切记定义变量的文件必须以主机名为文件名
vim /root/host_vars/bbb01
web_server: nginx
 
#调用阶段
- hosts: bb_group
  tasks:
  - name: Install http Server
    apt:
      name: "{{ web_server }}"

命令行定义变量

通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,
这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量
vim test.yml
- hosts: aa_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"
 
#定义阶段
ansible-playbook test.yml -e "web_server=vsftpd"
vim test.yml
- hosts: aa_group
  tasks:
  - name: Install httpd Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"
 
#定义阶段
ansible-playbook test.yml -e "web_server=vsftpd" -e "db_server=mariadb-server"



变量优先级测试

vim touch_file.yml
- hosts: web_group
  vars:
    filename: vars
  vars_files:
    - ./vars1.yml
  tasks:
    - name: Touch vars File
      file:
        path: /root/{{ filename }}
        state: directory
 
#定义vars_files
vim vars1.yml
filename: vars_files
 
#定义group_vars中的web_group
vim group_vars/web_group
filename: group_vars_web_group
 
#定义host_vars中的web01
vim host_vars/web01
vim host_vars/web01
filename: host_vars
 
#定义group_vars中的all
vim group_vars/all
filename: group_vars_all
 
#测试命令行
ansible-playbook touch_file.yml -e "filename=vars_command"
 
#测试所有
ansible-playbook touch_file.yml

层级定义变量

#编辑变量文件
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 }}"
        
#官方推荐写法
vim test.yml
- hosts: aa_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      apt:
        name: "{{ lamp['framework']['web_package'] }}"
 
    - name: Install LAMP mariadb-server
      apt:
        name: "{{ lamp['framework']['db_package'] }}"
 
    - name: Install LAMP php
      apt:
        name: "{{ lamp['framework']['php_package'] }}"
 
#执行playbook
[root@m01 ~]# ansible-playbook test.yml

facts缓存

Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
facts使用场景

1.通过facts缓存检查CPU,来生成对应的nginx配置文件

2.通过facts缓存检查主机名,生成不同的zabbix配置文件

3.通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件

综上所述的Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用滴。
#编辑
vim facts.yml
- hosts: aaa01
  tasks:
    - name: Get Host Info
      debug:
        msg: >
          Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"
### 关闭facts
vim facts.yml
- hosts: aaa01
  gather_facts: no #关闭信息采集
  tasks: