第三十七天:Ansible playbook变量

Playbook中同样也支持变量

变量名:仅能由字母、数字和下划线组成,且只能以字母开头

变量定义:

variable=value
variable: value

变量调用方式:

通过 {{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效

变量来源:

1. ansible 的 setup facts 远程主机的所有变量都可直接调用

2. 通过命令行指定变量,优先级最高

3. 在playbook文件中定义

4. 在独立的变量YAML文件中定义

5. 在主机清单文件中定义

主机(普通)变量:主机组中主机单独定义,优先级高于公共变量 组(公共)变量:针对主机组中所有主机定义统一变量

6. 在项目中针对主机和主机组定义

在项目目录中创建 host_vars和group_vars目录

7. 在role中定义 变量的优先级从高到低如下

-e 选项定义变量 -->playbook中vars_files --> playbook中vars变量定义 -->host_vars/主机
名文件 -->主机清单中主机变量--> group_vars/主机组名文件-->group_vars/all文件--> 主机清单组变量

一、使用 setup 模块中变量

1、使用 facts 变量

本模块自动在playbook调用,生成的系统状态信息, 并将之存放在facts变量中

facts 包括的信息很多,如: 主机名,IP,CPU,内存,网卡等

facts 变量的实际使用场景案例

  通过facts变量获取被控端CPU的个数信息,从而生成不同的Nginx配置文件

  通过facts变量获取被控端内存大小信息,从而生成不同的memcached的配置文件

  通过facts变量获取被控端主机名称信息,从而生成不同的Zabbix配置文件

  通过facts变量获取被控端网卡信息,从而生成不同的主机名 ......

2、性能优化

每次执行playbook,默认会收集每个主机的所有facts变量,将会导致速度很慢,可以采用下面方法加速

  方法1 关闭facts采集加速执行,此方法将导致无法使用facts变量

- hosts: all
 gather_facts: no
方法2
当使用 gather_facts: no 关闭 facts,确实能加速 Ansible 执行,但是有时候又需要使用 facts 中的内容,还希望执行的速度快,这时候可以设置facts 的缓存,将facts变量信息存在redis服务器中
[root@ansible ~]# cat /etc/ansible/ansible.cfg
[defaults]
# smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts
# implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False
# explicit 则表示默认不收集,要显式收集,必须使用gather_facts: True
gathering = smart              #在使用 facts 缓存时设置为smart
fact_caching_timeout = 86400   #缓存时长
fact_caching = redis           #缓存存在redis中
fact_caching_connection = 10.0.0.100:6379:0  #0表示redis的0号数据库
#若redis设置了密码
fact_caching_connection = 10.0.0.100:6379:0:password

3、在playbook 命令行中定义变量

vim var2.yml
---
- hosts: websrvs
 remote_user: root
 tasks:
   - name: install package
     yum: name={{ pkname }} state=present
[root@ansible ~]#ansible-playbook -e pkname=httpd var2.yml

4、在playbook文件中定义变量

此方式定义的是私有变量,即只能在当前playbook中使用,不能被其它Playbook共用
5、使用专用的公共的变量文件
可以在一个独立的playbook文件中定义公共变量,在其它的playbook文件中可以引用变量文件中的变量
此方式比playbook中定义的变量优化级高
6、在主机清单中定义主机和主机组的变量
所有项目的主机变量
  在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用
所有项目的组(公共)变量
  在inventory 主机清单文件中赋予给指定组内所有主机上的在playbook中可用的变量,如果和主机变是同名,优先级低于主机变量
7、针对当前项目的主机和主机组的变量
上面的方式是针对所有项目都有效,而官方更建议的方式是使用ansible特定项目的主机变量和组变量生产建议在每个项目对应的目录中创建额外的两个变量目录,分别是host_vars和group_vars
  host_vars下面的文件名和主机清单主机名一致,针对单个主机进行变量定义         格式:host_vars/hostname
  group_vars下面的文件名和主机清单中组名一致, 针对单个组进行变量定义         格式: gorup_vars/groupname
  group_vars/all文件内定义的变量对所有组都有效
8、register 注册变量
在playbook中可以使用register将捕获命令的输出保存在临时变量中,方便后续调用此变量,比如可以使用debug模块进行显示输出
 
 
 
 
 
 
 
 

 

 

 

posted @ 2024-03-26 21:01  djyhello  阅读(128)  评论(0编辑  收藏  举报