五ansible变量

五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述五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 }}"
【五ansible变量】           - "{{ 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

五ansible变量

文章图片

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_portssh端?号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user默认的ssh用户名
ansible_ssh_passssh 密码(这种方式并不安全,官?强烈建议使用--askpass或SSH密钥)
ansible_sudo_passsudo 密码(这种方式并不安全,官方强烈建议使用 --asksudo-pass)
ansible_sudo_exe (new in version 1.8)sudo 命令路径(适用于1.8及以上版本)
ansible_ssh_private_key_filessh 使用的私钥文件.适用于有多个密钥,而你不想使用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=https://www.songbingjia.com/android/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
五ansible变量

文章图片

五ansible变量

文章图片

例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
###查看配置的缓存文件目录
五ansible变量

文章图片

配置redis缓存文件
五ansible变量

文章图片

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# 缓存数据时间是一天




    推荐阅读