1.通过Inventory文件定义主机及主机组变量
当机器数量不多的时候,Ansible操控机器的时候会去Inventory里面获取主机信息,
此时我们就可以将变量传过去,默认Inventory配置文件为/etc/ansible/hosts.
playbook文件:variable.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: display Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
执行结果:
上面我们是给每一个主机配置一个key,我们可以配置一个nginx组拥有的key
执行结果:
当然,每个主机自己的变量优先级更高。只有当找不着自己的key才会使用组的key。
如果没有找到,肯定报错:
2.通过group_vars和host_vars文件定义主机及主机组变量
首先需要说明的通过这种方式定义的文件名称需要与hosts中定义的主机和主机组的名称一致。
比如,在hosts中定义了一个主机组nginx以及129.28.86.57,那么在定义变量名称是也必须这样定义
查看变量文件:
上面148写成140,结果:
系统找不到148.70.122.28这台主机的变量,所以只能引用组变量。
nginx组变量:
需要说明的是,你必须使用group_vars和host_vars这两个文件名,不然ansible找不到。
对于上面两个目录可以存放在三个位置都可以:当前目录(执行playbook的位置)、home目录和/etc/ansible/(配置文件位置)
这三个目录也是ansible所有文件的加载顺序。
3.通过ansible-playbook命令行传参
不论是shell还是python脚本,在执行脚本的时候可以命令行传参。
playbook也可以看作是脚本,因此也可以通过命令行传参。
命令行传参也可以通过文件的方式。支持YAML和JSON格式:
通过YAML格式的文件传参:
执行结果:
通过JSON格式的文件传参:
执行结果:
这种方式和第二种方式有些类似,都是通过文件定义。
但是还是有区别,group_vars和host_vars都是写死的,必须用这个名字,因为ansible就是这样帮你定义的。
而命令行传参是可以指定任意文件,只要符合规范都行。
4.在playbook文件内传参
我们可以直接在playbook脚本中定义变量。
定义variable.yaml文件
---
- hosts: all
gather_facts: False
vars:
key: playbook_var
tasks:
- name: display Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
执行结果:
5.在playbook文件内使用vars_files
在playbook中可以通过定义vars的方式来传参,那么也就可以通过文件的方式
变量配置文件:
playbook文件:
执行结果:
参数的优先级:
命令行>vars_files>vars>host_vars>group_vars>hosts
6.使用register内的变量
在playbook里面,task之间可以互相传递结果。
下面这个示例中,第二个task需要用到第一个task的运行结果。
register就是用来定义一个变量接收值,然后被复用
定义variable2.yaml:
---
- hosts: all
gather_facts: False
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The variable is {{ info }}"
执行结果:
stdout代表输出。
我们可以看出,这个输出结果其实是一个字典,我们可以直接去里面的值:
---
- hosts: all
gather_facts: False
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The variable is {{ info['stdout'] }}"
执行结果:
暂时貌似只会取stdout这个参数的值,后续还要参考官方文档。
7.使用vars_prompt传值
Ansible还支持在运行playbook的时候交互式传参,只需要使用vars_prompt定义变量名即可。
定义prompt.yaml文件:
---
- 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="two value is {{ two }}"
执行结果: