Ansible变量

通过定义变量可以增加Playbook的可复用性和后续的版本升级工作,可以很方便的修改定义,而不必逐个修改文件中所有的位置,如果有多个文件同时引用一个变量,可将该变量放入一个文件内,多个不同的YAML同时调用。

YAML变量的几种形式

Playbook声明

命令行声明

在执行该playbook时加入-e选项,并指定该变量的值,在此方式下,该值优先级最高,通常使用此方法时还需在YAML文件内HOSTS字段处指定该变量,然后通过命令行参数传递该变量,如下示例:

hosts字段:

- hosts: var
  tasks:
  	- name: test
  	  ........

执行参数:

ansible-playbook playbook.yaml -e "var=value" -i hosts

vars_files文件声明

playbook文件内使用关键字vars_files指定一个存放变量的文件,其他YAML文件加此声明后也可引用该文件内声明的变量,如下:

---
- hosts: web
  tasks:
  vars_files: ./vars_filename.yaml	#此为一个文件的路径,尽量使用绝对路径,方便项目移植
  	- name: Install {{ variable1 }} and {{ variable2 }}	#YAML引用变量必须加大括号
  		yum:
  			name:
  			  - "{{ variable1 }}"	#在此引用需要加引号,否则报语法错误
  			  - "{{ variable2 }}"
  			state: present

vars关键字声明

YAML文件内直接声明一个列表,该变量作用域仅对该文件内部生效,对于其他YAML文件不可见。如下示例:

---
- hosts: web
  tasks:
  vars:
  	- var1: value
  	- var2: value
  	- var3: wget
  	
  	- name: {{ var1 }} and {{ var2 }}
  	  yum:
  	  	name: 
  	  	  - "{{ var3 }}"
  	  	state: present

inventory

可以将变量直接写入HOSTS文件内的某个组下,但通常我们并不这么做,会显得配置文件很乱;还有一种做法就是将其放入对应的目录内(host_varsgroup_vars),每次引用变量时,ansible-playbook都会去该目录下寻找与主机IP或域名、组名对应的文件,从中读取变量,该文件一定要和HOSTS内定义的主机或组名一致,否则不会被引用。

hosts_vars

hosts_vars目录下的wiki.yongci.com文件,该目录下的文件仅对hosts中定义的同名主机有效,如下示例:

#file name: wiki.yongci.com
var1: httpd
var2: sl

使用该变量直接在该域名主机对应的hosts下引用即可,如下:

---
- hosts: wiki.yongci.com	#当对该主机进行操作时,会自动到host_vars/下寻找同名文件
  tasks:
  	- name: The Var1 values: {{ var1 }} #如果主机参数不对,则会报变量未定义错误

group_vars

group_vars目录中添加与hosts文件中定义的对应组的名称的文件,该文件定义的所有变量对该组内所有主机都可见,对其他组不可见,如下定义:

#file name: web
#该文件内定义的变量对于web组的所有主机来说都可见
nginx: nginx-1.16
php: 
  - php71w
  - php71w-fpm
  ........

引用变量:

---
- hosts: web			#名称与变量文件同名
  tasks:
  	- name: Install {{ nginx }} and {{ php }}
  	  yum:
  	  	name:
  	  	  - "{{ nginx }}"
  	  	  - "{{ php }}"
  	  	state: present

all

group_vars下添加一个名为all的文件,在其内添加变量定义可对资产清单内的所有主机可见,如下示例:

#file name: all
net: net-tools

引用变量:

---
- hosts: web
  tasks:
  	- name: Install {{ net }}
  	  yum:
  	    name: "{{ net }}"
  	    state: present
- hosts: db								#对于不同的主机组都可见
  tasks:
  	- name: install {{ net }}
  	  yum:
  	    name: "{{ net }}"
  	    state: present
- hosts: 10.0.0.7						#可见
.........

Playbook变量优先级

当存在多个同名变量在不同区域的声明时,会有一个基本的查找顺序,如下:

命令行参数>vars_files>vars>host_vars>group_vars>all​

若存在多个同名变量则需检查其优先级,否则又可能出现,变量不生效的情况!

注册变量

register关键字可以注册一个变量,该变量用于存放ansible内模块执行完毕后的从机输出信息,使用debug模块中的msg可以对此变量进行打印输出,主要用于我们调试时使用。如下示例:

- hosts: web
  tasks:
  	- name: print ps output messages
  	  shell: "ps aux | grep python"				#默认情况下,无该命令的任何输出信息
  	  register: command_out
  	- name: Print register variable
  	  debug:
  	  	msg: "{{ command_out.stdout_lines }}"

关于facts变量

在执行每个play之前,都会有一个Gathering Facts动作,这是ansible的控制主机读取从机基本信息的动作,每次读取都将从机返回的所有状态信息存入facts变量中,通过提取该变量内部特定的值可以对主机进行一些针对性的操作配置。比如,根据主机名来设定zabbixhostname字段,或者根据主机总内存数量来设定memcached的最大使用内存上限。

可引用此变量内的一些特定值来对集群内不同的主机进行命名或根据特定的硬件信息配置不同的参数。

查看该变量的值:

ansible [group or host] -m setup

取值使用-a参数,在yaml内取值使用debug模块的msg方法来打印指定对象的值。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×