Ansible 变量
变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
定义变量的方式
1.通过命令行进行变量定义
2.在play文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义
4.通过vars_files定义变量
5.通过host_vars和group_vars定义变量
1.在playbook里面定义变量
方法一:
- hosts: web_group
vars:
packages:
- httpd
- mariadb-server
- php
- php-mysql
- php-pdo
tasks:
- name: Install httpd mariadb php Server
yum:
name: ""
方法二:
- hosts: web_group
vars:
web_server:
- httpd
- nginx
db_server:
- mariadb-server
- mysql
tasks:
- name: Install lnmp
yum:
name: ""
2.通过vars_files的方式定义变量
#定义变量文件
[root@m01 lnmp]# cat vars1.yml
web_server: nginx
[root@m01 lnmp]# cat vars2.yml
db_server: mariadb-server
#调用变量文件
[root@m01 lnmp]# vim nmp.yml
- hosts: web_group
vars_files:
- ./vars1.yml
- ./vars2.yml
tasks:
- name: Install nmp
shell: mkdir /tmp/
3.在Inventory中定义变量
#定义阶段
[root@m01 lnmp]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
[web_group:vars]
web_server=nginx
db_server=mariadb-server
[nginx:children]
web_group
[nginx:vars]
web_server=httpd
#调用阶段
- hosts: web_group
tasks:
- name: Install nmp
yum:
name: ""
#主机定义的变量优先级高于主机组定义的变量
4.通过host_vars和group_vars定义变量
之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
host_vars
group_vars
切记,目录名字一定要一致,不能做任何修改。
1)主机组定义变量方式
#定义阶段
[root@m01 lnmp]# pwd
/project/lnmp
[root@m01 lnmp]# mkdir group_vars
[root@m01 lnmp]# cat group_vars/web_group
web_server: nginx
#调用阶段
[root@m01 lnmp]# cat nmp.yml
- hosts: web_group
tasks:
- name: Install nmp
yum:
name: ""
2)主机定义方式
#定义阶段
[root@m01 lnmp]# mkdir host_vars
[root@m01 lnmp]# cat host_vars/web01
web_server: httpd
#调用阶段
[root@m01 lnmp]# cat nmp.yml
- hosts: web_group
tasks:
- name: Install nmp
yum:
name: ""
#注意:主机定义的变量优先级高于主机组定义的变量
5.命令行定义变量
#playbook配置
[root@m01 lnmp]# cat nmp.yml
- hosts: web_group
tasks:
- name: Install nmp
yum:
name: ""
#命令行指定变量值
[root@m01 lnmp]# ansible-playbook nmp.yml -e "web_server=redis"
#远端查看安装内容
[root@web01 ~]# rpm -qa redis
redis-3.2.12-2.el7.x86_64
#命令行指定变量值可以指定多个
[root@m01 lnmp]# ansible-playbook nmp.yml -e "web_server=redis" -e "db_server=mysql"
6.优先级测试
[root@m01 ~]# vim touch_file.yml
- hosts: web_group
vars:
filename: vars
vars_files:
- ./vars1.yml
tasks:
- name: Touch vars File
file:
path: /root/
state: directory
#定义vars_files
[root@m01 ~]# vim vars1.yml
filename: vars_files
#定义group_vars中的web_group
[root@m01 ~]# vim group_vars/web_group
filename: group_vars_web_group
#定义host_vars中的web01
[root@m01 ~]# vim host_vars/web01
[root@m01 ~]# vim host_vars/web01
filename: host_vars
#定义group_vars中的all
[root@m01 ~]# vim group_vars/all
filename: group_vars_all
#测试命令行
[root@m01 ~]# ansible-playbook touch_file.yml -e "filename=vars_command"
#测试所有
[root@m01 ~]# ansible-playbook touch_file.yml
命令行 > vars_file > plybook里面配置的vars > host_vars > group_vars > 主机清单里host的变量 > 主机清单里group的变量
7.变量注册
#注册变量
[root@m01 lnmp]# vim lnmp.yml
- hosts: web_group
tasks:
- name: Get ip
file:
path: /tmp/
state: directory
register: abc
- name: Get result
debug:
msg: ""
#调用自己定义的变量
[root@m01 ~]# vim register.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: ""
#只输出自己想要的内容
[root@m01 ~]# vim register.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: ""
#debug模块常用参数
msg: #调试输出的消息
var: #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: #debug的级别(默认是0级,全部显示)
8.层级定义变量
#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php
lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php
lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat
#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: ""
- name: Install LAMP mariadb-server
yum:
name: ""
- name: Install LAMP php
yum:
name: ""
#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: ""
- name: Install LAMP mariadb-server
yum:
name: ""
- name: Install LAMP php
yum:
name: ""
facts缓存
Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
facts使用场景
1.通过facts缓存检查CPU,来生成对应的nginx配置文件
2.通过facts缓存检查主机名,生成不同的zabbix配置文件
3.通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件
综上所述的Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用滴。
1.配置方法
#编辑
[root@m01 lnmp]# cat mysql.js
buffer size: NaN
[root@m01 lnmp]# vim conf.yml
- hosts: web_group
tasks:
- name: config mysql conf
template:
src: ./mysql.js
dest: /tmp/mysql.conf
#执行
[root@m01 ~]# ansible-playbook facts.yml
#远端查看
[root@web01 tmp]# cat mysql.conf
buffer size: 486
2.关闭facts
#当不使用环境内置变量的时候可以将facts缓存关闭
- hosts: web_group
gather_facts: no
tasks:
- name: config mysql conf
template:
src: ./1.js
dest: /tmp/mysql.conf
#当使用环境内置变量的时候不能将facts缓存关闭
- hosts: web_group
#gather_facts: no
tasks:
- name: config mysql conf
template:
src: ./1.js
dest: /tmp/mysql.conf
3.推送redis配置文件,使用变量配置成服务器ip
#配置一个配置文件 使用变量
[root@m01 lnmp]# vim redis.conf
bind
#推送文件至远端服务器,变量会变成主机ip
[root@m01 lnmp]# vim redis.yml
- hosts: web_group
tasks:
- name: Config redis conf
template:
src: ./redis.conf
dest: /tmp
#执行剧本
[root@m01 lnmp]# ansible-playbook redis.yml
#远端查看redis配置文件
[root@web01 tmp]# vim redis.conf
bind 172.16.1.7