五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

\'五、ansible变量_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_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

\'五、ansible变量_ansible_02\'

\'五、ansible变量_ansible_03\'

例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变量_ansible_04\'

配置redis缓存文件

\'五、ansible变量_ansible_05\'

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变量的主要内容,如果未能解决你的问题,请参考以下文章

Ansible11:变量详解

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

ansible-playbook

Ansible之主机清单及playbook剧本