在 Playbook 中,常用变量可以分为以下几类:
第一种、用户自定义变量
在 Playbook 中:
1)用户可以通过 vars 关键字自定义变量;
2)也可以使用 vars_files 关键字引入包含变量定义的文件;
3)在使用时用 {{ var_name }} 引用变量。
如下示例,在 Playbook 中定义并使用变量:
- hosts: web # 在 Playbook 中定义和使用变量 vars: http_port: 80 remote_user: root foo: state: enabled immediate: yes # 在配置文件中定义变量 vars_files: - vars/server_vars.yml # 如果不需要使用系统变量,可以关闭远程变量的收集 gather_facts: no tasks : - name: "使用用户定义的变量" firewalld: port="{{ http_port }}/tcp" permanent="true" state="{{ foo.state }}" immediate="{{ foo['immediate'] }}" - name : "直接使用系统变量的示例" shell : echo {{ ansible_os_family }} - name : "使用复杂的系统变量的示例" shell : echo {{ ansible_os_family }} {{ ansible_ens3["ipv4"]["address"] }} {{ ansible_ens3.ipv4.address }}
在如上示例中的 foo 是个复杂的变量,可以通过 foo.state、foo['immediate'] 引用。
在使用 {{ var_name }} 引用变量时,如果以 { 作为参数开始,则需要需要加上双引号(通常为 "{{ var_name }}" 形式),否则可能会产生错误。
第二种、远程节点变量(Facts)
此类变量无须用户进行定义,而是 Ansible 在执行 Playbook 脚本之前,使用 setup 模块去全程主机上搜集关于远程节点系统信息的变量。
这些搜集到的系统信息叫作 Facts,这些信息可以已经变量的形式直接使用。使用 ansible all -m setup -u root 命令查看这些信息。
如果不需要 Facts 信息,可以通过关键字 gather_facts 进行关闭:
--- - hosts: production gather_facts: no
第三种、注册变量
把动作的运行结果可以作为一个变量来使用,这个变量叫作“注册变量”。
把动作的运行结果当作变量使用:”注册变量“,把执行结果注册到变量中的关键字是register,使用方法如下:
--- - hosts: web tasks: - shell: ls register: result ignore_errors: True - shell: echo "{{ result.stdout }}" when: result.rc == 5 - debug: msg="{{ result.stdout }}"
注册变量经常和 debug 模块一起使用,这样可以得到更多的关于执行错误的信息,以帮助用户调试。
第四种、额外变量(命令行传入)
为了使 Playbook 更灵活、通用性更强,允许用户在执行 Playbook 脚本时从命令行传入变量的值,这个时候就需要用到“额外变量”。
在执行 Playbook 脚本时,从命令行传入的变量。有以下若干方法:
#!/bin/sh # 在命令行里面传值的方法 ansible-playbook e33_var_in_command.yml --extra-vars="hosts=web user=root" # 还可以用 JSON 格式传递参数 ansible-playbook e33_var_in_command.yml --extra-vars="{'hosts':'vm-rhel7', 'user': 'root'}" # 可以将参数放在文件里面 ansible-playbook e33_var_in_command.yml --extra-vars="@vars.json"
在模板中使用变量
在文件模板(使用template模块)中,可以直接使用上述两种变量。
在 template 模块中使用变量:
1)在 Playbook 中定义的变量,可以直接在 template 中使用;
2)同时 Facts 变量也可以直接在 template 中使用;
3)当然也包含在主机清单里面定义的 Host 和 Group 变量;