变量概述


避免重复代码,方便维护,减少维护成本

ansible变量定义


  • 命令行
  • play定义
  • vars
  • vars_files
  • Inventory主机清单中定义
  • hosts 文件
  • host_vars 目录
  • group_vars 目录

优先级

命令行 > play > inventory

命令行 > vars_files(play) > vars(play) > host_vars(Inventory) > group_vars(Inventory) > hosts文件(Inventory)

vars变量

# 在play中用vars定义变量
[root@m01 playbook_ansible]# vim lnmp.yml
- hosts: web
vars:
user_group: jinnan
id: '666'
npm:
- nginx
- php
- mariadb-server
tasks:
- name: 创建{{ jinnan }}组
group:
name: "{{ user_group }}"
gid: "{{ id }}"

- name: 创建{{ user_group }}用户
user:
name: "{{ user_group }}"
group: "{{ id }}"

- name: 安装 nginx php mariadb-server
yum:
name: "{{ npm }}"
state: present

vars_files变量

## 创建vars_files文件
[root@m01 playbook_ansible]# vim jin_vars.yml
user_group: 'nan'
id: '555'
npm:
- nginx
- php

[root@m01 playbook_ansible]# vim lnmp.yml
- hosts: web
vars:
user_group: jinnan
id: '666'
npm:
- nginx
- php
- mariadb-server

vars_files: ./jin_vars.yml

tasks:
- name: 创建{{ jinnan }}组
group:
name: "{{ user_group }}"
gid: "{{ id }}"

- name: 创建{{ user_group }}用户
user:
name: "{{ user_group }}"
group: "{{ id }}"

- name: 安装 nginx php mariadb-server
yum:
name: "{{ npm }}"
state: present

在inventory中定义变量

在inventory文件中定义变量(几乎不用)

[root@m01 ~]# vim /etc/ansible/hosts 
[web]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_port=22
web02 ansible_ssh_host=10.0.0.8

[web:vars]
user_group= jinnan
id= '666'

host_vars

## 和yaml文件同级下创建目录
[root@m01 playbook_ansible]# mkdir host_vars
## 针对主机定义变量
[root@m01 playbook_ansible]# vim host_vars/web01
user_group: user_web01
id: '555'

group_vars

## 和yaml文件同级下创建目录
[root@m01 playbook_ansible]# mkdir group_vars
## 针对主机组定义变量
[root@m01 playbook_ansible]# vim host_vars/web0
user_group: user_group_web01
id: '111'

优先级测试

# 1.play中定义变量
- hosts: web
vars:
user_group: jinnan
id: '666'

vars_files: ./jin_vars.yml

tasks:
- name: 创建{{ user_group }}用户
user:
name: "{{ user_group }}"
group: "{{ id }}"
state: present

# 2.主机清单定义变量
hosts文件中:user_inventory
[web_group:vars]
user_group=user_inventory

host_vars目录下
- web01
user_group: user_host_vars_web01
- web02
user_group: user_host_vars_web02

group_vars目录下
web_group
user_group: user_group_vars_web_group

# 3.命令行定义变量
ansible-playbook -e 'user_group=command_user'

[root@m01 wordpress_ansible]# ansible-playbook lnmp.yml -i base/hosts -e 'user_group=command_user'

变量注册


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

- hosts: web
tasks:
- name: 查看nginx目录
shell: "ls -l /etc/nginx"
register: nginx

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

只需要打印详细的结果

- hosts: web
tasks:
- name: 查看nginx目录
shell: "ls -l /etc/nginx"
register: nginx

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

利用变量注册做判断

- hosts: web
tasks:
- name: 查看nginx目录
shell: "ls -l /etc/nginx"
register: nginx

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

- name: 安装 nginx PHP
shell: cd /opt && rpm -Uvh *.rpm
when: nginx.rc != 0

facts缓存


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

facts缓存应用场景

  • 根据主机CUP,设置nginx配置文件,CPU亲和度(已弃用)
  • 根据内存,配置MySQL的配置文件
  • 根据IP地址,配置redis配置文件

facts基础用法

[root@m01 <sub>]# vim facts.yml
- hosts: web_group
tasks:
- name: Get Host Info
debug:
msg: Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"

#执行
[root@m01 </sub>]# ansible-playbook facts.yml
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************<strong>
ok: [web02]
ok: [web01]

TASK [Get Host Info] </strong>*********************************************************************************************************************************************************************************************************************<strong>
ok: [web01] => {
"msg": "Hostname \"web01\" and IP \"10.0.0.7\"\n"
}
ok: [web02] => {
"msg": "Hostname \"web02\" and IP \"10.0.0.8\"\n"
}

PLAY RECAP </strong>*********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

facts生成mySQl配置文件

- hosts: db
tasks:
- name: Install mysql server
yum:
name: mariadb-server
state: present

- name: copy mysql conf
template: ## 跟copy语法一样,推送含有变量的文件
src: ./my.cnf
dest: /etc/my.cnf


[root@m01 ~]# 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 }}

关闭facts

[root@m01 ~]# vim 1.yml
- hosts: web
gather_facts: no #关闭信息采集
tasks:
- name: 查看 nginx 配置文件
shell: "ls -l /etc/nginx/nginx.conf"