变量概述
避免重复代码,方便维护,减少维护成本
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"