ansible笔记(6)之变量的使用

ansible笔记(6)之变量的使用

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

本来打算自己写一波 ansible 系列的,后来发现一老哥写的太好了,「点击此处直达」,我这里也就边看边对该系列文章做下笔记,方便以后查阅,ansible 入门的话墙裂建议阅读前方链接博文~~~

变量的定义与引用

如果我们想要在某个 play 中定义变量,可以借助 vars 关键字,示例如下:

---
- hosts: all
  vars:
    testvar1: testfile
  remote_user: root
  tasks:
  - name: task1
    file:
      path: /testdir/{{ testvar1 }}
      state: touch

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

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

当我们需要使用 testvar1 的变量值时,则需要引用这个变量,如你所见,使用 {{变量名}} 可以引用对应的变量。

也可以定义多个变量,示例如下。

vars:
  testvar1: testfile
  testvar2: testfile2

除了使用上述语法,使用 YAML 的块序列语法也可以定义变量,示例如下

vars:
  - testvar1: testfile
  - testvar2: testfile2

在定义变量时,还能够以类似属性的方式定义变量,示例如下:

---
- hosts: all
  remote_user: root
  vars:
    nginx:
      conf80: /etc/nginx/conf.d/80.conf
      conf8080: /etc/nginx/conf.d/8080.conf
  tasks:
  - name: task1
    file:
      path: "{{nginx.conf80}}"
      state: touch
  - name: task2
    file:
      path: "{{nginx.conf8080}}"
      state: touch

如上例所示,我定义了两个变量,两个变量的值对应两个 nginx 配置文件路径:

vars:
  nginx:
    conf80: /etc/nginx/conf.d/80.conf
    conf8080: /etc/nginx/conf.d/8080.conf

我们需要引用这两个变量时,有两种语法可用

# 语法一
"{{nginx.conf80}}"

# 语法二
"{{nginx['conf8080']}}"

这样使用变量在逻辑上比较清晰,可以看出 conf80conf8080 都属于 nginx 相关的配置。

变量文件分离

除了能够在 playbook 中直接定义变量,我们还可以在某个文件中定义变量,然后再在 playbook 中引入对应的文件,引入文件后,playbook 即可使用文件中定义的变量。

首先,我们来定义一个专门用来存放 nginx 相关变量的文件(文件名为 nginx_vars.yml),在文件中定义变量时,不要使用 vars 关键字,直接定义变量即可,定义变量的语法与在 playbook 中定义变量的几种语法相同。

# 语法一示例:
testvar1: testfile
testvar2: testfile2
# 语法二示例:
- testvar1: testfile
- testvar2: testfile2
# 语法三示例:
nginx:
  conf80: /etc/nginx/conf.d/80.conf
  conf8080: /etc/nginx/conf.d/8080.conf

你可以选择你觉得较为舒适的语法定义变量,如下所示,直接在nginx_vars.yml 文件中定义变量即可。

# cat nginx_vars.yml
nginx:
  conf80: /etc/nginx/conf.d/80.conf
  conf8080: /etc/nginx/conf.d/8080.conf

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

- hosts: all
  vars_files:
  - nginx_vars.yml
  tasks:
  - name: task1
    file:
      path={{nginx.conf80}}
      state=touch
  - name: task2
    file:
      path={{nginx['conf8080']}}
      state=touch

上例中使用 vars_files 关键字引入了对应的变量文件,然后使用了文件中定义的变量。

上例中 vars_files 关键字只引入了一个变量文件,也可以引入多个变量文件,每个被引入的文件都需要以 - 开头,示例如下:

vars_files:
- /testdir/ansible/nginx_vars.yml
- /testdir/ansible/other_vars.yml

vars 关键字和 vars_files 关键字可以同时使用,如下:

vars:
- conf90: /etc/nginx/conf.d/90.conf
vars_files:
- /testdir/ansible/nginx_vars.yml

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/ansible6.html

Buy me a cup of coffee ☕.