变量概述
变量提供了便捷的方式来管理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