变量简介

  • 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