变量的命名规则:

  • 必须以字母开头;
  • 只能包含字母,数字和下划线;

变量范围:

  • Global:全局变量,在命令行中,通过 -e 参数传递;
  • Play:在Playbook中的play里面通过 vars 或 vars_files 关键字定义的变量;
  • Host:由清单中,主机或主机组中定义的变量;

全局变量

编写playbook,在该playbook中,我们为apt模块来安装软件包,并为软件包的name选项指定一个名为package的变量:

  1. # vim test.yml:
  2. - name: Install Apache
  3. hosts: servera
  4. tasks:
  5. - name: Install {{ package }}
  6. apt:
  7. name: "{{ package }}"
  8. state: present
  • 在play中通过 “{{ VariableName }}”
  • 在需要打印出来的字段中引用变量不需要加引号,在其他地方引用变量需要加引号,如,在name中引用,因为变量名与花括号之间有空格,name不能把他们识别成一个整体,所以不加引号会报错;

运行playbook时,通过 -e 来指定变量名对应的值:

# ansible-playbook test.yml -e "package=apache2"

Play变量

Play变量就是在playbook中为每个play定义的变量,play变量可以直接定义在play中,通过vars关键字定义;也可以定义在文件中,然后通过vars_file关键字导入变量文件;

  1. 通过Vars关键字
    创建playbook,并通过vars关键字定义一个user的变量,对应的值为Jack:
# vim test.yml
- name: Create User
  hosts: servera
  vars:
    user: jack
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"
  1. 通过文件定义变量
    创建变量文件,并在文件中定义一个user变量,并指定值为jerry
# vim user.yml
user: jerry

注意:变量文件的格式应为yml文件格式

编写playbook,在play中通过vars_file关键字来导入变量文件

# vim test.yml
- name: Create User
  hosts: servera
  vars_files:
    - user.yml
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

主机变量

  1. 编辑主机清单,在主机后边添加一个user变量,并指定值为user1:
# vim hosts
serverb user=user1

创建playbook:

- name: Create User
  hosts: serverb
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"
  1. 还可以在主机变量目录(host_vars)中定义主机变量文件
    host_vars/servera.yml:
user: suer2

编辑playbook:

- name: Create User
  hosts: servera
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

主机组变量

编辑主机清单文件,通过[GroupName:vars]为主机组添加变量

# vim hosts
[web]
servera
serverb

[prod:children]
web

[web:vars]
user=user3

编辑playbook:

# vim test.yml
- name: Create User
  hosts: web
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

同样,可以通过组变量文件目录(group_vars)定义主机组变量文件

通过交互式输入变量

通过vars_prompt交互式输入变量

# vim test.yml
- name: Create User
  hosts: servera
  vars_prompt:
    - name: username
      prompt: '输入用户名: '
      private: no
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

参考:微信公众号—马哥Linux运维