[toc]

Ansible的变量

变量概述

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

定义变量的方式

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

变量的优先级

变量的读取优先级为:

 命令行 > playbook文件 (vars_file>vars)>host_vars>group_vars> Inventory文件

变量定义

Inventory定义变量

1
2
3
[web_group:vars]
uid="438"
user_name="xxx"

playbook中vars定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义。
# vars:定义变量

# 方法一:
- hosts: web_group
vars:
packages:
- httpd
- mariadb-server
- php
- php-mysql
- php-pdo
tasks:
- name: Install httpd mariadb php Server
yum:
name: "{{ packages }}"

# 方法二:
- hosts: web_group
vars:
- web_server: httpd
- db_server: mariadb-server
- php_server:
- php
- php-mysql
- php-pdo
tasks:
- name: Install httpd mariadb php Server
yum:
name:
- "{{ web_server }}"
- "{{ db_server }}"
- "{{ php_server }}"

使用vars_file定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 在vars_file中定义变量,其他playbook也可以使用该变量。
# vars_file

# 方法一:
## 定义变量
vim vars1.yml
web_server: httpd
vim vars2.yml
db_server: mariadb-server
## 调用变量
- hosts: web_group
vars_files: ./vars1.yml
tasks:
- name: Install httpd mariadb php Server
yum:
name: "{{ web_server }}"

# 方法二:
## 定义变量
vim vars1.yml
web_server: httpd
vim cat vars2.yml
db_server: mariadb-server

## 调用变量
- hosts: web_group
vars_file:
- ./vars1.yml
- ./vars2.yml
- name: Install httpd mariadb php Server
yum:
name:
- "{{ web_server }}"
- "{{ db_server }}"

# 获取Ansible内置变量
- hosts: web_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

变量注册

为什么要用变量注册?

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

register(注册变量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 将模块输出内容注册为变量
register # 注册变量
debug # 获取注册变量值

#debug模块常用参数
msg: # 调试输出的消息
var: # 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: # debug的级别(默认是0级,全部显示)

# 示例:
## playbook 查看nginx是否安装
- hosts: web_group
tasks:
- name: 查看nginx目录 输出结果注册为变量
shell: "ls -l /etc/nginx"
register: xxx

- name: 获取注册变量值 nginx目录的返回值
debug:
msg: "{{ xxx }}"

## 第一波优化
- hosts: web_group
tasks:
- name: 查看nginx目录 输出结果注册为变量
shell: "ls -l /etc/nginx"
register: xxx

- name: 获取注册变量值 nginx目录的返回值
debug:
msg: "{{ xxx.stdout_lines }}"

## 第二波优化
- hosts: web_group
tasks:
- name: 查看nginx目录 输出结果注册为变量
shell: "ls -l /etc/nginx"
register: xxx

- name: 获取注册变量值 nginx目录的返回值
debug:
msg: "{{ xxx.rc }}"

## 第三波优化加判断
- hosts: web_group
tasks:
- name: 查看nginx目录 输出结果注册为变量
shell: "ls -l /etc/nginx"
register: xxx

- name: 获取注册变量值 nginx目录的返回值
debug:
msg: "{{ xxx.rc }}"
- name: 安装nginx和php
shell: cd /opt && yum localinstall -y *.rpm
when: xxx.rc != 0

facts缓存

什么是facts缓存

Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。

比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等

facts使用场景

  1. 通过facts缓存检查CPU,来生成对应的nginx配置文件
  2. 通过facts缓存检查主机名,生成不同的zabbix配置文件
  3. 通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件
  • 根据主机CPU,设置nginx配置文件,cpu亲和
  • 根据内存,配置mysql的配置文件
  • 根据IP地址。配置redis配置文件

facts基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 开启facts缓存(默认开启)
vim facts.yml
- hosts: web_group
tasks:
- name: Get Host Info
debug:
msg: >
Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"

# 关闭facts缓存
vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:

facts生成zabbix配置文件

1
2
3
4
5
6
7
8
9
# facts生成zabbix配置文件
- hosts: web_group
vars:
- zabbix_server: 172.16.1.71
tasks:
- name: copy zabbix agent conf
template:
src: ./zabbix_agentd.conf
dest: /tmp/zabbix_agentd.conf

facts生成mysqld配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# facts生成mysqld配置文件
- hosts: db_group
tasks:
- name: Install mysql server
yum:
name: mariadb-server
state: present

- name: copy mysql conf
template:
src: ./my.cnf
dest: /etc/my.cnf

# 查看配置文件
vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}