五ansible变量
Posted 哭泣的馒头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五ansible变量相关的知识,希望对你有一定的参考价值。
一、概述
1、为什么要使用变量
简化playbook项目的维护,使用一个固定的字符串,表示一个不固定的值
2、ansible怎么定义变量
分为三种:
(1)通过playbook文件中的play进行定义
(2)通过inventory主机清单进行变量定义
(3)通过执行playbook时使用-e参数指定变量
3、定义变量
变量的名字由字母、下划线和数字组成,必须以字母开头,保留关键字不能作为变量名称
vars:
- v1: values
- v2: values
- v3: values
4、使用变量
{{ v1 }}
5、变量可以定义的位置
(1)在playbook中定义vars变量
(2)在playbook中定义vars_files变量
(3)在host_vars中定义变量
(4)在group_vars中定义变量
(5)通过执行命令传递变量 -e
6、变量执行优先级
命令行变量---》play中的vars_files---》play中的vars---》host_vars--》group_vars---》group_vars/all
二、定义方式
1、在playbook文件中的play使用变量
mkdir /project/vars
---------------------------------------------------------------------------------------------------------------------------------------------
cat /project/vars/hosts
[webserver]
192.168.10.128
[dbserver]
192.168.10.130
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=\'123456\'
---------------------------------------------------------------------------------------------------------------------------------------------
cat /project/vars/vars_1.yml
---
- hosts: webserver
vars:
- web_packages: httpd-2.4.6
- ftp_packages: vsftpd-3.0.2
tasks:
- name: Installed {{ web_packages }} {{ ftp_packages }}
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
---------------------------------------------------------------------------------------------------------------------------------------------
ansible-playbook vars_1.yml -i hosts
2、在playbook中使用vars_files指定文件作为变量文件,好处是其他playbook也可以调用
---------------------------------------------------------------------------------------------------------------------------------------------
cat vars.yaml
web_packages: httpd
ftp_packages: vsftpd
cat vars_2.yml
---
- hosts: webserver
vars_files: ./vars.yaml
tasks:
- name: Installed {{ web_packages }} {{ ftp_packages }}
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
---------------------------------------------------------------------------------------------------------------------------------------------
3、在inventory主机清单中定义变量,但是注意:主机变量优先级高于主机组变量
cat hosts
[webserver]
192.168.10.128
[dbserver]
192.168.10.130
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=\'123456\'
filename=test_vars ##添加了一行参数
cat vars_3.yml
---
- hosts: webserver
tasks:
- shell: \'echo "{{ filename }}"\'
register: result
- debug:
var: result
4、官方的建议在ansible项目目录中创建两个额外的变量目录,分别是host_vars和group_vars
host_vars 特殊的变量目录,针对单个主机进行变量
host_vars/192.168.10.128 ##文件
group_vars 特殊的变量目录,针对inventory主机清单中的组进行变量定义,对A组定义的变量,B组无法调用
group_vars/webserver ##文件
group_vars/all 特殊的变量文件,可以针对所有的主机组定义变量
5、通过执行playbook时使用-e参数指定变量
ansible-playbook vars.yml -i hosts -e "web_packages=httpd"
三、其他变量的定义
1、Inventory 内置变量
内置变量几乎都是以 ansible_ 为前缀。
ansible_ssh_host 将要连接的远程主机名与你想要设定的主机的别名不同的话,可以通过此变量设置.
ansible_ssh_port ssh端⼝号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user 默认的ssh用户名
ansible_ssh_pass ssh 密码(这种方式并不安全,官⽅强烈建议使用--askpass或SSH密钥)
ansible_sudo_pass sudo 密码(这种方式并不安全,官方强烈建议使用 --asksudo-pass)
ansible_sudo_exe (new in version 1.8) sudo 命令路径(适用于1.8及以上版本)
ansible_ssh_private_key_file ssh 使用的私钥文件.适用于有多个密钥,而你不想使用SSH代理的情况.
ansible_python_interpreter 目标主机的python路径.适用于的情况:系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如/usr/local/bin/python
2、Facts变量
Facts变量不需要我们人为去声明变量名及赋值。
它的声明和赋值完全有Ansible中的setup 模块帮我们完成。
它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,磁盘的使用情况、CPU个数、内存大小等等有关被管理服务器的私有信息。
在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。
facts使用场景:
通过facts变量检查被控端硬件cpu信息,从而生成不同的nginx配置文件
通过facts变量检查被控端主机名称信息,从而生成不同的zabbix配置文件
通过facts变量检查被控端内存状态信息,从而生成不同的memcached的配置文件
(1)facts基本用法
例1 获取ip和主机名
获取被控端的主机名称和ip,然后通过debug进行输出
cat facts.yml
---
- hosts: webserver
tasks:
- name: output ansible facts
debug:
msg: default Ipv4 address "{{ ansible_fqdn }}" is "{{ ansible_default_ipv4.address}}"
cat hosts
[webserver]
192.168.10.128
[dbserver]
192.168.10.130
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=\'123456\'
ansible-playbook facts.yml -i hosts
例2 根据内存配置服务文件
使用facts变量根据内存生成不通memcached配置文件
[root@db2 memcache]# cat hosts
[webserver]
192.168.10.128
[dbserver]
192.168.10.130
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=\'123456\'
[root@db2 memcache]# cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""
[root@db2 memcache]# cat memcache.yaml
- hosts: webserver
tasks:
- name: Install Memcached Server
yum: name=memcached state=present
- name: Configure Memcached Server
template: src=./memcached.j2 dest=/etc/sysconfig/memcached
- name: Service Memcached Server
service: name=memcached state=started enabled=yes
- name: Check Memcached Server
shell: ps aux|grep memcached
register: check_mem
- name: Debug Memcached Variables
debug:
msg: "{{ check_mem.stdout_lines }}"
ansible-playbook memcache.yaml -i hosts
例3 hostname批量修改
[root@db2 memcache]# cat hostname.yaml
---
- hosts: webserver
tasks:
- name: Shell random
shell: echo $RANDOM|md5sum|cut -c 5-12
register: get_random
- name: debug
debug:
msg: "{{ ansible_date_time.epoch }}"
- name: hostname
hostname: name={{ get_random.stdout }}_{{ ansible_date_time.epoch }}
ansible-playbook hostname.yaml -i hosts
(2)facts关闭
facts开启后,默认情况下,Ansible每次执行playbook时的第一个Task就是获取每台主机的facts信息,会影响ansible主机的性能,如果没有采集端主机需求可以选择关闭
- hosts: webserver
gather_facts: no #关闭信息采集
tasks:
(3)facts优化
配置普通缓存文件
假如想获取facts信息,同时又想加速这个task的效率,就需要设置 facts 缓存。
grep gathering /etc/ansible/ansible.cfg
#gathering = implicit ##默认
ansible的配置文件中可以修改\'gathering\'的值为 smart、implicit 或者 explicit。
smart --> 表示默认收集facts,但facts已有的情况下不会收集,也就是会使用缓存facts
implicit --> 表示默认收集facts,要禁用收集,必须使用 gather_facts: False
explicit --> 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture
缓存到文件(JSON格式的数据)在 ansible.cfg 文件中配置缓 存到一个普通文件中 同时还可指定搜集哪些信息,比如只搜集 network,virtual
grep \'^[a-Z]\' /etc/ansible/ansible.cfg
gathering = smart
gather_subset = all #只搜集配置的信息 ,all表示所有都收集
gather_timeout = 86400 #缓存数据时间是一天
fact_caching = jsonfile # 缓存到json文件
fact_caching_connection=/tmp/ansible ##缓存文件路径,文件名是在inventory中保存的ip或hostname
ansible-playbook facts.yml -i hosts
###查看配置的缓存文件目录
配置redis缓存文件
yum install -y redis
默认redis配置文件只监听本机端口
grep \'^bind\' /etc/redis.conf
bind 0.0.0.0
控制主机python的redis库
pip install redis1
在ansible.cfg 文件中配置缓存到redis
gathering = smart
fact_caching = redis # 缓存到 redis
fact_caching_connection = 192.168.10.129:6379:0 ##host:port:database
fact_caching_timeout = 86400 # 缓存数据时间是一天
以上是关于五ansible变量的主要内容,如果未能解决你的问题,请参考以下文章
ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制
ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制