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

当机器数量不多的时候,Ansible操控机器的时候会去Inventory里面获取主机信息,
此时我们就可以将变量传过去,默认Inventory配置文件为/etc/ansible/hosts.

ansible 多个hosts之间增加sleep 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 }}"

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_02

上面我们是给每一个主机配置一个key,我们可以配置一个nginx组拥有的key

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_03

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_04

当然,每个主机自己的变量优先级更高。只有当找不着自己的key才会使用组的key。
如果没有找到,肯定报错:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_05

 

2.通过group_vars和host_vars文件定义主机及主机组变量

首先需要说明的通过这种方式定义的文件名称需要与hosts中定义的主机和主机组的名称一致。

ansible 多个hosts之间增加sleep ansible hosts变量_文件定义_06

比如,在hosts中定义了一个主机组nginx以及129.28.86.57,那么在定义变量名称是也必须这样定义

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_07

查看变量文件:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_08

上面148写成140,结果:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_09

系统找不到148.70.122.28这台主机的变量,所以只能引用组变量。

nginx组变量:

ansible 多个hosts之间增加sleep ansible hosts变量_文件定义_10

需要说明的是,你必须使用group_varshost_vars这两个文件名,不然ansible找不到。
对于上面两个目录可以存放在三个位置都可以:当前目录(执行playbook的位置)、home目录和/etc/ansible/(配置文件位置)
这三个目录也是ansible所有文件的加载顺序。

 

3.通过ansible-playbook命令行传参

不论是shell还是python脚本,在执行脚本的时候可以命令行传参。
playbook也可以看作是脚本,因此也可以通过命令行传参。

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_11

命令行传参也可以通过文件的方式。支持YAML和JSON格式:
通过YAML格式的文件传参:

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_12

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_13

通过JSON格式的文件传参:

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_14

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_15

这种方式和第二种方式有些类似,都是通过文件定义。
但是还是有区别,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 }}"

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_16

 

5.在playbook文件内使用vars_files

在playbook中可以通过定义vars的方式来传参,那么也就可以通过文件的方式
变量配置文件:

ansible 多个hosts之间增加sleep ansible hosts变量_配置文件_17

playbook文件:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_18

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_文件定义_19

参数的优先级:
  命令行>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 }}"

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_文件定义_20

stdout代表输出。
我们可以看出,这个输出结果其实是一个字典,我们可以直接去里面的值:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: register variable
      shell: hostname
      register: info

    - name: display variable
      debug: msg="The variable is {{ info['stdout'] }}"

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_文件定义_21

暂时貌似只会取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 }}"

执行结果:

ansible 多个hosts之间增加sleep ansible hosts变量_命令行_22