ansible之变量简述
变量存在的意义
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
定义变量的方式
1.通过命令行进行变量定义
2.在playbook文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义
playbook文件定义变量
#缺陷:
· 其他的playbook(也就是文中hosts主机)无法使用该变量
## 变量定义:
- hosts: all
vars:
zls_anzhuangbao:
- httpd
- mariadb
tasks:
- name: Install httpd and mariadb
yum:
## 调用变量
name: "{{ zls_anzhuangbao }}"
state: present
- 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_files定义变量
# 注意:
· 刚才在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采取第二种定义变量的方式,在vars_file中定义变量。
## 1.定义变量
[root@m01 ~]# vim /root/vars_file.yml
create_file: zls_vars_file
## 2.调用变量
[root@m01 ~]# vim var1.yml
- hosts: web01
vars_files: /root/vars_file.yml
tasks:
- name: Create file
file:
path: /root/{{ create_file }}
state: touch
## 3.变量优先级
命令行 > 剧本 > 主机清单
intentory主机信息定义变量
# 注意:
· 在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
## 1.定义变量
[root@m01 ~]# vim /etc/ansible/hosts
[web_group:vars]
create_file=zls_inventory
## 2.调用变量
- hosts: web01
tasks:
- name: Create file
file:
path: /root/{{ create_file }}
state: touch
官方推荐定义变量
├── group_vars
│ └── web_group # 此处定义目录必须为主机清单文件中的主机组名
├── host_vars
│ ├── web01 # 此处定义目录必须为主机清单文件中的主机名
│ └── web02
[root@m01 ansible]# cat host_vars/web01
create_file: qqq
[root@m01 ansible]# cat host_vars/web02
create_file: www
[root@m01 ansible]# cat group_vars/web_group
create_file: xxx
## 调用阶段
[root@m01 ansible]# vim var3.yml
- hosts: web_group
tasks:
- name: Create f
file:
path: /root/{{ create_file }}
state: touch
注册变量
# 什么是注册变量
· 如在ansible剧本中直接使用shell模块,如查看磁盘信息,返回给ansible的结果其实并不是真正想要的信息,如无法直接显示信息,可调用显示。
# 案例演示
- hosts: web_group
tasks:
- name: jieya nginx
unarchive:
src: /usr/local/ansible/nginx_php.tgz
dest: /root
- name: panduan nginx zhuangmeizhuang
shell: 'ls -l /etc/nginx' # 使用shell模块查看web_group组中的主机目录信息
register: nginx_info # 使用register调用结果,命名为nginx_info
ignore_errors: yes
- name: get nginx info
debug: # 配套语句
msg: "{{ nginx_info.rc }}" # 这里为调用结果显示,rc为子集变量,ls结果有为0,没有则为非零
- name: install nginx
shell: "cd /root/nginx_php && rpm -Uvh *rpm"
when: nginx_info.rc != 0 # 可通过变量判断,如不等于0就,进行安装nginx
facts变量
# 关闭的意义
· 默认为开启,开启后每次都需进行信息采集,导致ansible执行速度特别慢,可采用关闭方式
# fasts缓存
· Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
# fasts使用场景
· 1.通过facts缓存检查CPU,来生成对应的nginx配置文件
· 2.通过facts缓存检查主机名,生成不同的zabbix配置文件
· 3.通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件
综上所述的Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用滴。
## 关闭facts
[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:
## 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生成mysql配置文件
- 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
[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 }}
层级变量
# 编辑变量文件
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
## 官方推荐写法
#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}"
- name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}"