ansible基础-变量

时间:2023-03-09 09:19:26
ansible基础-变量

一 变量的命名规范

变量的命名应该符如下合两个规范:

  • 变量应该由字母、数字、下划线组成
  • 变量应该以字母开头

例如:host_port、HOST_PORT、var5是符合命名规范的,foo-port、 foo port、foo.port 、12都不符合命名规范。

变量的定义通常是YAML形式,在inventory host文件中也可以使用INI形式。

ansible变量不仅可以支持简单的key=value格式,而且也支持更复杂数据结构,例如字典类型等。

二 变量的作用域

变量的作用域可以分为四种:

  • 作用于全局的变量
  • 作用于play的变量
  • 作用于task的变量
  • 作用于host的变量

接下来我们根据变量的作用域,详细分析下ansible变量的定义、使用和调用顺序。

三 作用于全局的变量

3.1 配置文件变量

ansible配置文件会定义一些变量信息,主要是对执行环境、连接信息变量的定义。

例如inventory目录、library目录、与目的主机连接方式、越权信息、连接超时时间等等。

3.2 系统环境变量

在ansible连接到目的主机时,会以non-login shell登陆到目的主机,此时目的主机的/etc/bashrc和~/.basrc的环境变量会被加载,所以这两个文件中设置的环境变量会作用于playbook全局。

3.3 命令行变量

我们可以在执行playbook的命令行指定变量,需要注意的是,命令行指定的变量在所有其他变量中优先级是最高的。也就是说如果命令行指定的变量和其他地方指定的变量有冲突时,那么ansible最终会采用命令行定义的变量。

命令行指定变量示例如下:

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"

四 作用于play的变量

4.1 playbook中的变量

vars语句定义全局变量

我们可以在playbook中使用「vars」语句定义变量,该变量作用于整个play。

例如:

---
# inventory/playbooks/test.yaml
- hosts: node1
vars:
http_port:

上面示例中中「http_port」是一个作用于整个play的变量,对这个play里的tasks、roles、import、include等等之下定义的task均生效。

引用变量文件

除了将变量写在playbook中,我们也可以将变量放在一个单独的YAML文件中,通过「vars_files」语句来导入。

「vars_files」变量只能作用于play全局,不能在某个task中单独被引用。「vars_files」参数可以使用系统绝对路径或playbook文件的相对路径。

举个