写点什么

Ansible 变量

用户头像
耳东
关注
发布于: 4 小时前

变量

通过 Inventory 文件定义主机以及主机组变量

Ansible 默认的 Inventory 文件是 ini 格式,分别对每台主机设置一个变量名称叫做 key,接着使用 debug 模块来查看变量的值,最后通过 nginx 组定义一个变量同样使用 debug 模块查看。如下所示


172.18.12.51 key=51172.18.12.52 key=52172.18.12.53 key=53[nginx]172.18.12.5[1:3]
复制代码


编写一个 Playbook 文件来验证变量的引用是否正确


---- hosts: all  tasks:    - name: display Host variale from hostfile      debug: msg="the {{ inventory_hostname }} value is {{ key }}"
复制代码


运行这个 Playbook 发现每天主机都引用了自己定义的变量,接下来我们注释每台主机的变量定义,直接给 nginx 组定义一个变量,变量名称还是 key ,值为 nginx,如下所示,


#172.18.12.51 key=51#172.18.12.52 key=52#172.18.12.53 key=53[nginx]172.18.12.5[1:3][nginx:vars]key=nginx
复制代码


执行 验证的 Playbook 可以看到,改组定义的变量针对组内所有主机都生效。如果 nginx 组定义了变量,然后每台主机也定义了变量,只要定义的变量 key 名称不同,我们都可以直接引用这些变量。

通过命令行传参传入

上边介绍了日常过程中常用的一种变量定义方式,接下来介绍一个通过 ansible-playbook 命令行传参的方式定义变量,但是默认传进去的变量都是全局变量。如下:


$ ansible-playbook variable.yml -e "key=value"
复制代码


当然也支持同时传递多个变量,


$ ansible-playbook variable.yml -e 'pass_var="test" pass_var1="test1"'
复制代码


而且命令行传入的变量的优先级要高于 Playbook 中设置的变量,这样可以更灵活的指定变量的值。

通过文件传入变量

ansible-playbook 支持指定文件的方式传入变量,变量文件支持 YAML 和 JSON 两种格式,如下所示


$ cat var.yml---key: value$ cat var.json{"key": "value"}
复制代码


指定 var.json 文件传入变量


$ ansible-playbook variable.yml -e "@var.json"
复制代码


指定 var.yml 文件传入变量


$ ansible-playbook variable.yml -e "@var.yml"
复制代码

在 Playbook 文件中使用 vars

我们还可以在 Playbook 文件内通过 vars 字段定义变量,比如上边的 variable.yml 文件内容如下:


---- hosts: all  vars:    key: ansible  tasks:    - name: display Host variale from hostfile      debug: msg="the {{ inventory_hostname }} value is {{ key }}"
复制代码

在 Playbook 文件内使用 vars_files

我们还可以在 Playbook 文件内通过 vars_files 字段引用变量,首先吧所有变量定义到某个文件内,然后在 Playbook 文件内使用 vars_files 参数引用这个变量文件,


---- hosts: all  vars_files:    - var.yml  tasks:    - name: display Host variale from hostfile      debug: msg="the {{ inventory_hostname }} value is {{ key }}"
复制代码


var.yml 文件就是变量定义存放的文件,这个时候我们就可以直接运行 variable.yml 。

使用 register 内的变量

Ansible Playbook 内 task 之间还可以互相传递数据,比如我们有两个以上的 tasks ,其中第 2 个 task 是否执行是需要判断第一个 task 运行后的结果,这个时候我们就的在 task 之间传递数据,需要把第 1 个 task 执行的结果传递给第 2 个 task。 Ansible task 之间传递数据使用 register 方式,看一个简单的例子。


---- hosts: all  tasks:    - name: register variable      shell: hostname      register: info    - name: display Host variale from hostfile      debug: msg="the variable is {{ info['stdout'] }}"
复制代码


这里把第 1 个 task 执行的 hostname 的结果 register 给 info 这个变量,然后在第 2 个 task 把这个结果使用 debug 模块打印出来。


stdout 是一个标准的 Python 语言在字典中取值的用法。

使用 var_prompt 传入

Ansible 还支持在运行 Playbook 的时候通过交互式的方式给定义好的参数传入变量值,只需要在 Playbook 中定义 var_prompt 的变量名和交互式提交内容即可。


而且 Ansible 还支持对输入的变量值进行加密处理,比如采用 SHA512 和 MD5 算法加密,但是需要安装 passlib python 库。下面来看一个例子。


---- hosts: all  vars_prompt:    - name: "one"      prompt: "please input one value"      private: no    - name: "two"      prompt: "please input two value"      default: 'good'      private: yes
tasks: - name: display one value debug: msg="one value is {{ one }}" - name: display two value debug: msg="one value is {{ two }}"
复制代码


在例子中通过 vars_prompt 参数进行交互输入两个变量的值,变量名分别为 one 和 two ,one 定义为非私有变量,two 变量定义为私有变量且还提供一个默认值。如果不给变量 two 输入值的话,two 的变量的值会变成默认值。


发布于: 4 小时前阅读数: 3
用户头像

耳东

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
Ansible 变量