ansible中playbook使用变量的几种方法的简单介绍

在ansible中使用变量,能让我们的工作变得更加灵活,在ansible中,变量的使用方式有很多种。

变量的定义:

变量名应该有字母,数字,下划线组成,变量名需要以字母开头,ansible内置的关键字不能作为变量名。

在playbook中使用变量:

如果我们想要在某个paly中定义变量,了一借组vars关键字,示例如下:

image.png

上例,使用vars关键字,表示在当前play中进行变量的相关设置。

vars关键字的下一级定义定义了一个变量,变量名为testvar1,变量值为testfile

当我们需要使用testvar1的变量时,则需要应用这个变量,引用方式是两个大括号。

 

也可以定义多个变量:

image.png

除了上面语法,使用yaml的块序列语法也可以定义变量,事例如下:
image.png

还可以用类似“属性”的方式定义变量,示例如下:

image.png

 

对于上面,我们引用变量的方式有两种:

语法一:"{{nginx.conf80}}"
语法二:"{{nginx['conf8080']}}"

 

仔细观察,上例中,我们在引用变量时使用了双引号,而在第一个示例中没有用双引号,这是因为第一个示例中的变量在被引用时,并没有处于”开头的位置“,第一个示例中变量被引用时如下:

#path: /testdir/{{ testvar1 }}

当file模块的path参数引用对应的变量时,先引入了/testdir/,然后才引用了’testvar1‘变量。

而在上述示例中引用变量,变量被引用时如下,处于’开头的位置‘,这种情况下,我们引用变量时必须使用双引号引起被引用的变量,否则报语法错误。

path:"{{ nginx.conf80 }}"

 

当我们在playbook中为模块的参数赋值时,我们使用”冒号,也可以使用”等号“,当使用等号位模块的参数赋值时,则不用考虑引用变量时是否使用”引号“的问题,示例如下:

image.png

 

除了能够在play中直接定义变量,我们还可以在某个文件中定义变量,然后再在playbook引入对应的文件,引入文件后,playbook即可使用文件中定义的变量,你可能会问,为什么要多此一举呢?

这是因为在某些工作场景很有用,比如:你想让别人阅读你的playbook,却不想让别人看到某些值,可以使用这种方法,因为别人在阅读playbook时,只能看到引入的变量名,不能看到相应的值,这种将变量分离到某个文件中的做法就做”变量文件分离“,”变量文件分离“除了能够隐藏某些值,还能够让你将不同类的信息放在不同的文件中,并且让这些信息与剧本主体分开。

 

例子,定义一个专门用来存放nginx相关变量的文件(文件名nginx_vars.yaml):

image.png

 

定义完相关变量后,即可在playbook中引入文件中的变量,在playbook中引入包含变量的文件时,需要使用”vars_files“关键字,被引入的文件需要以”-“开头,以yaml中块序列语法引用,示例如下:

image.png

上例中使用"var_files"关键字引入了对应的变量文件,然后使用了文件中定义的变量。当然也可以引用多个变量文件,每个被引入的文件都需要以“-”开头。

在调用变量时候,也可以采用循环的方式通过“{{ item.变量名 }}“调用,当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过loop语句指明迭代的元素列表即可。loop的值是python list数据结构,每个task会循环读取list的值,然后后key的名称是item。

下面看一个红帽RHCE考试中的例子:

首先创建yml文件 user_list.yml、locker.yml定义变量:

vim user_list.yml
users:
  - name: bob
    job: developer
  - name: sally
    job: manager
  - name: fred
    job: developer

--------------------
vim locker.yml
---
  pw_developer:Imadev
  pw_manager:Imamgr

循环使用变量:

- name: create user developer
user:
name: "{{ item.name }}"
groups: devops
password: "{{ pw_developer | password_hash('sha512', 'mysecretsalt') }}"
comment: "{{ item.job }}"
loop: "{{ users }}"
when: item.job == 'developer' and ( inventory_hostname in groups.dev or inventory_hostname in groups.test )
  1. "{{ item.name }}"--- 循环调用user_list.yml文件中的 name变量
  2. "{{ pw_developer }}" --- 直接调用 locker.yml文件中的 Imadev变量
  3. "{{ item.job }}" --- 循环调用user_list.yml文件中的 job 变量
  4. loop: "{{ users }}" --- 循环
  5. when: item.job == 'developer' and ( inventory_hostname in groups.dev or inventory_hostname in groups.test ) --- 使用when语句设定当满足job值为developer并且主机为test和dev组中才执行

 

 

“var”关键字和“var_files”关键字可以同时使用,如下:

var:
- conf90: /etc/nginx/conf.d/90.conf
vars_files:
- /testdir/ansible/nginx_vars.yml
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值