一、ansible 中的变量
在ansible中使用变量,能让我们的工作变得更加灵活,在ansible中,变量的使用方式有很多种。
变量的定义
先说说怎样定义变量,变量名应该由字母、数字、下划线组成,变量名需要以字母开头,ansible内置的关键字不能作为变量名。
由于之前的几篇文章都是在通过剧本举例,所以我们先看怎样在playbook中使用变量。
如果我们想要在某个play中定义变量,可以借助vars关键字,示例如下
---
- hosts: testB
vars:
testvar1: testfile
remote_user: root
tasks:
- name: task1
file:
path: /testdir/{
{
testvar1 }}
state: touch
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
上例中,先使用vars关键字,表示在当前play中进行变量的相关设置。
vars关键字的下一级定义了一个变量,变量名为testvar1,变量值为testfile
当我们需要使用testvar1的变量值时,则需要引用这个变量,如你所见,使用{
{ 变量名 }}
可以引用对应的变量。
定义多个变量
也可以定义多个变量,示例如下。
vars:
testvar1: testfile
testvar2: testfile2
- 1
- 2
- 3
除了使用上述语法,使用YAML的块序列语法也可以定义变量,示例如下
vars:
- testvar1: testfile
- testvar2: testfile2
- 1
- 2
- 3
在定义变量时,还能够以类似”属性”的方式定义变量,示例如下
---
- hosts: testB
remote_user: root
vars:
httpd:
conf80: /etc/httpd/conf.d/80.conf
conf8080: /etc/httpd/conf.d/8080.conf
tasks:
- name: task1
file:
path: "{
{httpd.conf80}}"
state: touch
- name: task2
file:
path: "{
{httpd.conf8080}}"
state: touch
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
如上例所示,我定义了两个变量,两个变量的值对应两个httpd配置文件路径
vars:
httpd:
conf80: /etc/httpd/conf.d/80.conf
conf8080: /etc/httpd/conf.d/8080.conf
- 1
- 2
- 3
- 4
引用变量
当我们需要引用这两个变量时,有两种语法可用
语法一
"{
{httpd.conf80}}"
- 1
语法二
"{
{nginx['conf8080']}}"
- 1
这样使用变量在逻辑上比较清晰,可以看出conf80与conf8080都属于httpd相关的配置。
上例中,我在引用变量时使用了双引号,而在本文的第一个示例中引用变量时却没有使用双引号,这是因为,第一个示例中的变量在被引用时,并没有处于”开头的位置”,第一个示例中变量被引用时如下
path: /testdir/{
{
testvar1 }}
- 1
当file模块的path参数引用对应的变量时,先写入了/testdir/
,然后才引用了testvar1
变量,{
{ testvar1 }}
并没有处于”开头的位置”,换句话说就是,{
{ testvar1 }}
前面还有字符串/testdir/
而在上述后面的示例中引用变量时,变量被引用时如下,处于”开头的位置”
path: "{
{nginx.conf80}}"
- 1
这种情况下,我们引用变量时必须使用双引号引起被引用的变量,否则会报语法错误。
其实,上述情况也有例外
前文中有描述过,当在playbook中为模块的参数赋值时,可以使用”冒号”,也可以使用”等号”,当使用”等号”为模块的参数赋值时,则不用考虑引用变量时是否使用”引号”的问题,示例如下
---
- hosts: testB
remote_user: root
vars:
httpd:
conf80: /etc/httpd/conf.d/80.conf
conf8080: /etc/httpd