变量提供了便捷的方式来管理ansible
项目中的动态值,比如zabbix-3.4.15
,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。这样可以简化项目的创建和维护
定义变量分为如下三种方式
1)通过命令行进行变量定义
2)在play
文件中进行定义变量
3)通过inventory
在主机组或单个主机中设置变量
如果定义的变量出现重复,且造成冲突,优先级如下:
命令行定义的变量-高于-->play
文件中进行定义变量-高于-->inventory
文件定义的变量
1、playbook
变量可以通过多种方式进行定义,最简单的方式就是在playbook
的开头通过vars
进行定义
#安装两个软件包使用变量方式
[root@m01 project1]# cat p2.yml
- hosts: webservers
vars:
- web_package: httpd
- ftp_package: vsftpd
tasks:
- name: Installed Packages
yum:
name:
- "{{ web_package }}"
- "{{ ftp_package }}"
state: present
2、也可以在playbook
中使用vars_files
指定文件作为变量文件,好处就是其他的playbook
也可以调用
[root@m01 project1]# cat vars.yml
web_package: httpd
ftp_package: vsftpd
[root@m01 project1]# cat p2.yml
- hosts: webservers
vars_files: ./vars.yml
tasks:
- name: Installed Packages
yum:
name:
- "{{ web_package }}"
- "{{ ftp_package }}"
state: present
3.在inventory
中定义变量,主机变量优先级高于主机组变量(不推荐,容易将环境弄的特别乱)
[root@m01 project1]# vim /etc/ansible/hosts
[webservers]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[webservers:vars]
filename=group_vars
[root@m01 project1]# cat p3.yml
- hosts: webservers
tasks:
- name: Create File
file: path=/tmp/{{ filename }} state=touch
4.更好的方式是在ansible
的项目目录中创建额外的两个变量目录,分别是host_vars
和group_vars
group_vars目录下必须存放和inventory清单文件中定义的组名一致,如下
[root@m01 project1]# cat /etc/ansible/hosts
[webservers]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[root@m01 project1]# cat group_vars/webservers
web_package: httpd
ftp_package: vsftpd
注意:系统提供了特殊的组,all,也就说在group_vars目录下创建一个all文件,定义变量对所有的主机都生效
[root@m01 project1]# cat host_vars/web01
web_package: zlib-static
ftp_package: zmap
[root@m01 project1]# cat group_vars/webservers
web_package: httpd
ftp_package: vsftpd
[root@m01 project1]# cat p4.yml
- hosts: webservers
#- hosts: otherservers
tasks:
- name: Installed Packages
yum:
name:
- "{{ web_package }}"
- "{{ ftp_package }}"
state: present
[root@m01 project1]# ansible-playbook p4.yml
PLAY [webservers] ********************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Installed Packages] ************************************************************************************************
ok: [web02]
changed: [web01]
PLAY RECAP ***************************************************************************************************************
web01 : ok=2 changed=1 unreachable=0 failed=0
web02 : ok=2 changed=0 unreachable=0 failed=0
5.通过命令行覆盖变量,inventory
的变量会被playbook
文件中覆盖,这两种方式的变量都会被命
令行直接指定变量所覆盖。使用--extra-vars
或-e
设定变量。
[root@m01 project1]# ansible-playbook p4.yml -e "web_package=zarafa-devel" -e "ftp_package=zarafa-utils"
6.变量优先级测试
命令行变量--->play
中的vars_files
--->play
中的vars
变量-->host_vars
中定义的变量--->group_vars/
组--->group_vars/all
[root@m01 project1]# cat p5.yml
- hosts: webservers
# vars:
# filename: play_vars
# vars_files:
# - ./vars.yml
tasks:
- name: Create
shell: mkdir -pv /tmp/{{ filename }}
register: mk_test
- name: debug
debug: msg={{ mk_test }}
7.变量也支持层级定义,使用.
可能会有问题,建议使用[]
代替。
[root@m01 project1]# cat vars1.yml
rainbow:
web:
web_package: httpd
db_package: mariadb
code:
web:
filename: code_web_filename
[root@m01 project1]# cat p8.yml
- hosts: webservers
vars_files: ./vars1.yml
tasks:
- name: Install Package
yum: name= "{{ rainbow[‘web‘][‘web_package‘] }}"
- name: create filename
file:
path: /tmp/{{ code.web.filename }}
state: touch
register
- hosts: webservers
tasks:
- name: Get Network Port Status
shell: netstat -lntp
register: net_port
- name: OutPut Network Port Status
debug:
msg: "{{ net_port.stdout_lines }}"
Ansible facts
是在被管理主机上通过ansible自动采集发现的变量。facts
包含每台特定的主机信息。比如:被控端主机的主机名、IP
地址、系统版本、CPU
数量、内存状态、磁盘状态等等
facts
使用场景
1)通过facts
检查CPU
,来生成对应Nginx
配置文件
2)通过facts
检查主机名信息,来生成不同的``zabbix`配置文件
3)通过fact
检索的内存情况来自定义MySQL
的配置文件
1、facts
基本用法,比如获取被控端的主机名和IP
地址
[root@m01 project1]# cat facts.yml
- hosts: web
tasks:
- name: OutPut variables ansible facts
debug:
msg: >
this default IPv4 address "{{ ansible_fqdn }}" is "{{ ansible_default_ipv4.address }}"
2、facts
开启后会影响ansible
主机的性能,如果没有采集被控端主机需求可以选择关闭
[root@m01 project1]# cat facts.yml
- hosts: webservers
#gather_facts: no 关闭facts采集
vars:
- zabbix_server: 172.16.1.71
tasks:
- name: Copy Zabbix Agent Configure
template: src=./zabbix_agentd.conf dest=/tmp/zabbix_agent.conf
3、如何获取facts
的变量,需要使用filter
进行过滤,使用 setup
模块
ansible web01 -m setup -a filter="mb"
4、使用facts
根据不同的内存生成不同Memcached
配置文件
playbook安装一个memcached
[root@m01 project1]# cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""
[root@m01 project1]# cat p11.yml
- hosts: webservers
tasks:
- name: Installed Memcached
yum: name=memcached state=present
- name: Configure Memcached
template: src=./memcached.j2 dest=/etc/sysconfig/memcached
- name: Start Memcached
service: name=memcached state=started enabled=yes
原文:https://www.cnblogs.com/zxm1/p/14459498.html