变量概述

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

定义变量的方式

1、通过命令行进行变量定义

#通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量
#示例
[root@m01 ansible]# ansible-playbook wordpress.yaml -i hosts -e 'user=www id=555'

2、在playbook文件中进行变量定义

#playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义。
#示例:
- hosts: all
  vars:
    user: 'web'
    id: '1234'
  tasks:
- name: 创建"{{ user }}"组
  group:
    name: "{{ user }}"
    gid: "{{ id }}"
    state: present
#示例二:通过把变量写入文件方式  //文件必须和playbook处于同一目录
- hosts: all
  vars: vars_files: ./bl.yaml
  tasks:
- name: 创建"{{ user }}"组
  group:
    name: "{{ user }}"
    gid: "{{ id }}"
    state: present

3、通过Inventory主机信息文件中进行变量定义

#根据主机清单中的标签名或者主机名,来创建对应的yaml文件
#如果是标签名,就将yaml文件创建在group_vars目录下
#如果是主机名,就将yaml文件创建在host_vars目录下
#host_vars和group_vars两个目录,必须和playbook在同一级目录下
-----------------------------------------------------------------------------------------------------
#文件创建示例:
host_vars
    web01.yaml
    web02.yaml
    nfs.yaml
group_vars
    web_group.yaml
    nfs_group.yaml
# 创建目录
[root@m01 ~]# mkdir {group_vars,host_vars}
# 编写变量定义文件
[root@m01 ~]# vim /root/group_vars/all.yaml
user: 'www'
id: '666'
# 编写playbook
[root@m01 ~]# vim user.yaml
- hosts: all
  tasks:
  - name: 创建"{{ user }}"用户组
    group:
      name: "{{ user }}"
      gid: "{{ id }}"
      state: present
  - name: 创建"{{ user }}"用户
    user:
      name: "{{ user }}"
      uid: "{{ id }}"
      group: "{{ id }}"
      shell: /sbin/onlogin
      create_home: false

4、层级定义变量

#可以把变量以列表层级方式写入到一个文件中去调用
#示例
## 变量定义
framework:
  package:
    web_pkg: nginx-1.19.2
    db_pkg: oracle
    code_pkg: php-fpm
## 剧本中调用变量
- hosts: web_group
  tasks:
  - name: 创建目录
    file:
      path: /opt/{{ lnmp.framework.package.db_pkg }}
      state: directory
  - name: 安装lnmp
    yum:
      name:
        - {{ framework.package.web_pkg }}
        - {{ framework.package.db_pkg }}
        - {{ framework.package.code_pkg }}

Ansible变量的优先级

#优先级
命令行 > vars_files > vars > host_vars >group_vars > inventory
#官方推荐:
    - host_vars
    - group_vars

Ansible变量注册

为什么要用变量注册?

有些时候,我们需要查看playbook执行后返回的结果
ls -l /root
free -m
df -h
但是ansible剧本只返回,运行后的状态,绿色 黄色红色
所以需要使用注册变量,将执行的结果,保存到一个变量名中

#语法:register 注册,将命令结果保存在指定的变量名中
- hosts: web_group
  tasks:
  - name: 查看所有web的/root目录下都有哪些文件
    shell: 'ls -l /root'
    register: dsb_yl
  - name: 查看 dsb_yl 变量的值
    debug:
      msg: "{{ dsb_yl['stdout_lines']}}"
 # 变量注册判断举例
 - hosts: web02
   tasks:
   - name: 检测是否安装nginx
     shell: 'rpm -qa|grep nginx'
     register: check_nginx
   - name: 安装nginx和php
     shell: 'rpm -ivh /opt/nginx_php/*.rpm'
     when: check_nginx.rc != 0
   - name: 创建zls目录
    file:
      path: /tmp/zls
      state: directory

facts缓存

#playbook在执行之前,使用setup模块获取所有主机信息(变量:内置变量)
#既每次执行剧本时的开头
TASK [Gathering Facts]
ok: [web02]
ok: [web01]
------------------------------------------------------------------------------------------------------
## 关闭facts缓存  //在剧本加入即可
gather_facts: no
#示例:
- hosts: all
  gather_facts: no
  vars_files: /root/like/bl.yaml
  tasks:
  - name: 创建www组
    group:
      name: "{{ user }}"
      gid: "{{ id }}"
      state: present