变量简介
-
Host and group variable files must use YAML syntax. Valid file extensions include ‘.yml’, ‘.yaml’, ‘.json’, or no file extension.
-
For ansible-playbook you can also add group_vars/ and host_vars/ directories to your playbook directory. Other Ansible commands (for example, ansible, ansible-console, and so on) will only look for group_vars/ and host_vars/ in the inventory directory.
-
ansible 可以在以下地方设置变量:
- Inventory: You can define variables for hosts or host groups in the inventory file.
- Group Vars and Host Vars
- 命令行参数:
ansible-playbook main_playbook.yml -e "http_port=80 max_clients=200"
- Playbook: Used when applicable to specific playbooks.
vars:
- Vars files: Variables can be stored in separate YAML files and referenced in the Playbook.
- Role Vars
变量优先级
- 变量优先级:以下是变量优先级从低到高的顺序
- Role defaults:角色中的默认变量,位于 roles/role_name/defaults/main.yml 文件中。
- Inventory 文件:在 Inventory 文件中定义的变量。
- Group vars 文件:在 group_vars 目录中定义的变量。
- Host vars 文件:在 host_vars 目录中定义的变量。
- Playbook 文件:在 playbook 文件中定义的变量。
- Include vars 文件:通过 include_vars 模块包含的变量文件。
- Set facts:通过 set_fact 模块设置的变量。
- Registered vars:通过任务注册的变量。
- Role vars:角色中的变量,位于 roles/role_name/vars/main.yml 文件中。
- Block vars:在 block 中定义的变量。
- Task vars:在任务中定义的变量。
- Extra vars:通过命令行传递的变量,使用 -e 选项。
变量最佳实践
- 最佳实践:
- 如果项目不复杂,优先使用 inventory 变量;这样配置简单明了,便于查找和管理。
- 如果项目较大,建议使用 vars_files 来定义变量;这样变量定义和主机分开,灵活性和可读性更高。
- 临时变量:建议使用命令行临时变量来设置临时变量。
- 尽量避免使用 playbook 变量来设置临时变量,以便保持剧本的简洁和可读性。
变量类型
inventory 变量
- 直接配置在 inventory 文件中的变量;示例如下:
[all]
[all:children]
prod
uat
[all:vars]
#组变量
ansible_ssh_user=root
ansible_ssh_private_key_file=/opt/id_rsa_root
svr_root_dir="/opt/server/"
[prod]
prod-db01 ansible_ssh_host=192.168.1.100
#子组变量
[prod:vars]
svr_root_dir="/opt/server/prod/"
[uat]
#主机变量
uat-db01 ansible_ssh_host=192.168.1.101 svr_root_dir="/opt/server/uat/"
vars_files 变量
- 变量设置在单独的文件中,示例如下:
# app_version.yml
app: miningauth
app_local_root: /home/yunwei/data/miningauth
app_releases_root: /data1/tomcat/releases/miningauth
tomcat_root: /data1/tomcat/auth
# playbook.yml
- hosts: all
gather_facts: False
vars_files:
- app_version.yml
playbook 变量
- 变量设置在剧本文件中,示例如下:
# playbook.yml
- hosts: all
gather_facts: False
vars:
- project_local_dir: "/home/yunwei/data/{{app}}"
- project_release_dir: "/data1/tomcat/releases/{{app}}"
- project_dest_dir: "/data1/tomcat/{{p_dir}}"
命令行变量
- 执行剧本时,定义
env=prod
ansible-playbook playbook.yml -e "env=prod"
主机变量和主机组变量
-
group_vars 和 host_vars,和 inventory 放在相同目录中;
-
定义主机和主机组变量的首选做法是与 清单文件或目录 相同的工作目录中,创建 group_vars 和 host_vars 两个目录,这两个目录分别包含用于定义组变量和主机变量的文件。(下方的中括号代表可以省略的内容)
- 创建 group_vars/group_name[.yml] 的 YAML 文件,设置变量为值:user: student
- 同样需要在 host_vars/inventory_hostname[.yml] 目录中创建名称与主机匹配的文件来存放主机变量
- 所以一个项目目录中包含:ansible.cfg、group_vars、host_vars、inventory、playbook.yml
-
对于不同的ansible命令行,对于这两个folder的查找路径是不一样的。
- 如果是ansible-playbook命令,他会去当前playbook所在文件的同级目录下去查找这两个文件夹
- 如果是ansible和ansible-console命令行,则会去当前playbook所在文件统计目录下的inventory文件夹下去查找这两个文件夹。
主机变量
# host_vars/inventory_hostname[.yml]
version: 100
minute: 10
hour: 06
主机组变量
# host_vars/groupname[.yml]
version: 100
minute: 10
hour: 06