文章目录
- 零、Ansible的事实变量和内置变量?
- Ansible 的内置变量
- Ansible 的事实变量
- 示例
- 一、Ansible的事实变量有哪些(不全)
- 1. ansible_hostname
- 2. ansible_fqdn
- 3. ansible_os_family
- 4. ansible_distribution
- 5. ansible_version
- 6. ansible_all_ipv4_addresses和ansible_all_ipv6_addresses
- 7. ansible_memory_mb
- 8. ansible_processor
- 9. hostvars
- 10. group_names
- 11. inventory_hostname
- inventory_hostname与ansible_hostname的区别
- 12. inventory_hostname_short
- 13. ansible_env
- 14. ansible_env.USER
- 15. ansible_python_version
- 16. ansible_distribution_version
- 17. ansible_service_mgr
- 18. ansible_devices
- 19. ansible_local
- 20. ansible_managed
- 21. ansible_connection
- 22. ansible_ethX
- 23. ansible_processor_cores
- 24. ansible_mounts
- 25. ansible_kernel
- 26. ansible_distribution_release
- 27. ansible_lsb
- 28. ansible_bios
- 29. ansible_virtual
- 30. ansible_libraries
- 31. ansible_python_interpreter
- 32. ansible_pkg_mgr
- 二、Ansible的变量的使用
- 在主机清单文件中定义变量(不推荐)
- 在bash运行命令时定义变量(不推荐)
- 在剧本中定义变量(不推荐)
- `vars`方式
- `vars_files`方式
- bash、`vars`和`vars_files`中定义相同变量后谁的优先被调用?
- 在host_vars目录和group_vars目录中定义变量(!!推荐!!)
- 简述:
- 为什么推荐使用这两种方式
- 内容:
- 在/etc/ansible/host_vars目录中定义变量
- 在/etc/ansbile/group_vars目录中定义变量
- 两种方式定义相同变量时,谁的优先被调用?
- 自定义host_vars目录和group_vars目录(不在/etc/ansible中)
- 以上所有的定义变量的方式谁的优先级高?
- Ansible变量注册`register`指令
零、Ansible的事实变量和内置变量?
事实变量和内置变量在 Ansible 中有不同的用途和来源:
一、 事实变量
- 定义:由 Ansible 收集的关于目标主机的动态信息,如操作系统版本、IP 地址、硬件信息等。
- 获取方式:通过运行
setup
模块或自动收集。- 示例:
ansible_os_family
、ansible_lsb
。二、 内置变量
- 定义:Ansible 自身提供的预定义变量,用于任务执行和配置。
- 用途:控制任务行为、传递信息等。
- 示例:
inventory_hostname
、playbook_dir
。总结来说,事实变量提供主机的具体信息,而内置变量则用于控制 Ansible 的行为和配置。
当然可以!下面通过具体例子来说明 Ansible 的内置变量和事实变量的关系。
Ansible 的内置变量
内置变量是 Ansible 提供的用于配置和控制剧本执行的变量。例如:
inventory_hostname
:当前正在处理的主机名。playbook_dir
:当前剧本文件所在的目录。hostvars
:一个字典,包含了所有主机的变量。
Ansible 的事实变量
事实变量是 Ansible 在运行时自动收集的主机信息,存储在 ansible_facts
中,例如:
ansible_hostname
:主机名。ansible_distribution
:操作系统分发版。ansible_memtotal_mb
:总内存(以MB为单位)。
示例
假设我们有一个简单的剧本,使用内置变量和事实变量来执行某些任务:
- name: Example Playbook
hosts: all
tasks:
- name: Print the hostname
debug:
msg: "The hostname is {{ ansible_hostname }}"
- name: Check memory and print a message
debug:
msg: >
The total memory on {{ inventory_hostname }} is {{ ansible_memtotal_mb }} MB.
- name: Install package based on OS
package:
name: "httpd"
state: present
when: ansible_distribution == "CentOS"
- name: Print current playbook directory
debug:
msg: "The playbook is located in {{ playbook_dir }}"
示例解析:
-
打印主机名:
- 使用了事实变量
ansible_hostname
,输出当前主机的主机名。
- 使用了事实变量
-
检查内存:
- 使用了内置变量
inventory_hostname
来获取当前主机名,并结合事实变量ansible_memtotal_mb
打印总内存。
- 使用了内置变量
-
基于操作系统安装软件包:
- 使用了事实变量
ansible_distribution
来判断操作系统类型。如果是 CentOS,则安装httpd
。
- 使用了事实变量
-
打印剧本目录:
- 使用了内置变量
playbook_dir
,输出当前剧本所在的目录。
- 使用了内置变量
在这个例子中,内置变量和事实变量结合使用,使得剧本能够根据主机的具体情况做出不同的决策。内置变量提供了剧本运行时的上下文信息,而事实变量则提供了目标主机的详细信息。这样,Ansible 可以实现灵活的自动化管理。
一、Ansible的事实变量有哪些(不全)
Ansible 的事实变量包含许多系统信息,通常可以通过 ansible_facts
访问。以下是一些常见的事实变量类别及其示例:
-
基本信息:
ansible_hostname
:主机名。ansible_domain
:域名。ansible_fqdn
:完全合格的域名。
-
操作系统信息:
ansible_os_family
:操作系统家族(如 RedHat、Debian)。ansible_distribution
:操作系统分发版(如 Ubuntu、CentOS)。ansible_distribution_version
:操作系统版本。
-
硬件信息:
ansible_processor
:CPU信息(型号、核数等)。ansible_memtotal_mb
:总内存(以MB为单位)。ansible_architecture
:系统架构(如 x86_64)。
-
网络信息:
ansible_default_ipv4
:默认IPv4地址信息(如地址、网关等)。ansible_interfaces
:网络接口列表。ansible_eth0
:特定网络接口的信息。
-
存储信息:
ansible_mounts
:挂载点信息(包括文件系统类型、挂载状态等)。ansible_devices
:存储设备信息。
-
Python 环境:
ansible_python_version
:Python版本。ansible_python_interpreter
:Python解释器的路径。
-
虚拟化信息:
ansible_virtualization_type
:虚拟化类型(如 KVM、VMware)。ansible_virtualization_role
:虚拟化角色(如 guest、host)。
-
其他:
ansible_user_id
:当前用户ID。ansible_env
:环境变量。
要查看当前主机的所有事实变量,可以使用 setup
模块,执行命令:
- name: Gather facts
hosts: all
tasks:
- name: Print all facts
debug:
var: ansible_facts
这将显示主机上所有收集到的事实变量。
1. ansible_hostname
- 描述: 当前主机的名称。
- 用法: 常用于调试或记录主机信息。
---
- name: the play1
hosts: web_servers
become: no
tasks:
- name: task1
debug:
msg: "主机名称:{{ansible_hostname}}"
2. ansible_fqdn
-
描述: 当前主机的完全合格域名。
当主机名配置成:xxx.yyy.zzz时,ansible_fqdn则为:xxx.yyy.zzz,而ansible_hostname则为:xxx -
用法: 获取主机的 FQDN,通常用于网络配置或日志。
---
- name: the play1
hosts: web_servers
become: no
tasks:
- name: the task1
debug:
msg: "主机的完全合格域名:{{ansible_fqdn}}"
3. ansible_os_family
- 描述: 主机的操作系统系列(如 Debian、RedHat)。
- 用法: 用于条件判断,执行特定于操作系统的任务。
---
- name: the play1
hosts: web_servers
become: no
tasks:
- name: the task1
debug:
msg: "主机的操作系统系列:{{ansible_os_family}}"
4. ansible_distribution
- 描述: 主机的操作系统名称(如 Ubuntu、CentOS)。
- 用法: 根据操作系统执行特定任务。
---
- name: the play1
hosts: web_servers
become: no
tasks:
- name: the task1
debug:
msg: "主机的操作系统名称:{{ansible_distribution}}"
5. ansible_version
- 描述: Ansible 的版本信息。
- 用法: 用于调试或根据版本执行特定逻辑。
6. ansible_all_ipv4_addresses和ansible_all_ipv6_addresses
- 描述: 当前主机的所有 IPV4或IPV6 地址列表。
- 用法: 获取和处理网络配置。
7. ansible_memory_mb
- 描述: 主机的内存信息(以 MB 为单位)。
- 用法: 根据内存大小执行条件逻辑。
8. ansible_processor
- 描述: 主机的处理器信息。
- 用法: 获取 CPU 型号和核心数。
9. hostvars
- 描述: 当前主机的所有主机变量。
- 用法: 访问其他主机的变量。
语法:
hostvars['hostname']['variable_name']
10. group_names
- 描述: 当前主机所属的所有组的名称。
- 用法: 用于条件逻辑。
- name: the play1
hosts: web02
become: no
tasks:
- name: the task1
debug:
msg: "当前主机有属组,属组为:{{group_names}}"
when: group_names != ['nogrouped']
- name: the task2
debug:
msg: "当前主机无属组"
when: group_names == ['nogrouped']
- name: the play1
hosts: web03
become: no
tasks:
- name: the task1
debug:
msg: "当前主机有属组,属组为:{{group_names}}"
when: group_names != ['nogrouped']
- name: the task2
debug:
msg: "当前主机无属组"
when: group_names == ['nogrouped']
11. inventory_hostname
- 描述: 当前主机在清单文件中的名称。
- 用法: 用于引用清单中的主机名。
inventory_hostname与ansible_hostname的区别
在 Ansible 中,inventory_hostname
和 ansible_hostname
是两个常用的变量,它们有不同的含义和用途:
一、 1. inventory_hostname
- 定义:这是在 Ansible 的清单(inventory)中定义的主机名。它是用于标识和引用目标主机的名称。
- 用途:在 Playbook 和任务中,用于对主机进行操作。可以是用户自定义的名称,可以是 IP 地址或其他标识符。
- 示例:
- 如果你的 inventory 文件中有一行如下:
那么在 Ansible 执行时,webserver ansible_host=192.168.1.10
inventory_hostname
的值将是webserver
。
- 如果你的 inventory 文件中有一行如下:
二、 2. ansible_hostname
- 定义:这是目标主机的实际主机名,通过 Ansible 在远程主机上执行
hostname
命令自动获取的。 - 用途:用于获取目标主机的真实名称,通常用于配置文件或输出中,以确保使用的是正确的主机名。
- 示例:
- 如果在主机
192.168.1.10
上执行hostname
命令返回my-server
,那么在 Ansible 执行时,ansible_hostname
的值将是my-server
。
- 如果在主机
三、总结
inventory_hostname
是你在清单中定义的名称,用于 Ansible 中的标识。ansible_hostname
是目标主机的真实名称,反映了系统的配置。
---
- name: the play1
hosts: webserver2
become: no
tasks:
- name: the task1
debug:
msg: "当前主机的真实主机名为:{{ansbile_hostname}}"
- name: the task2
debug:
msg: "当前主机在主机清单中的定义的主机名为:{{inventory_hostname}}"
12. inventory_hostname_short
- 描述: 当前主机的短名称(去掉域名部分)。
- 用法: 在需要简洁主机名时使用。
13. ansible_env
- 描述: 当前主机的环境变量字典。
- 用法: 访问主机的环境变量。
14. ansible_env.USER
- 描述: 当前 Ansible 执行操作的用户。
- 用法: 用于权限相关的任务。
15. ansible_python_version
- 描述: 当前主机上 Python 的版本信息。
- 用法: 用于根据 Python 版本执行条件任务。
16. ansible_distribution_version
- 描述: 当前主机操作系统的版本号。
- 用法: 用于特定版本的条件判断。
17. ansible_service_mgr
- 描述: 当前主机上使用的服务管理器(如 systemd、initd)。
- 用法: 根据服务管理器执行不同的任务。
18. ansible_devices
- 描述: 主机的所有设备信息,包括存储设备。
- 用法: 用于磁盘管理和配置。
19. ansible_local
- 描述: 本地主机的自定义变量,用于存储本地收集的数据。
- 用法: 访问本地特定数据。
当然可以!ansible_local
通常用于存储在目标主机上自定义收集的数据,这些数据可以是应用程序的配置、状态信息或其他环境特征。以下是几个实际应用示例:
一、 示例 1:存储应用程序配置
假设你有一个 Web 应用程序,它的配置文件位于 /etc/myapp/config.json
。你可以创建一个 Ansible 任务来读取这个配置文件并将其作为自定义事实存储。
- name: Collect application configuration
hosts: all
tasks:
- name: Read application configuration
slurp:
src: /etc/myapp/config.json
register: app_config
- name: Save configuration as ansible_local fact
copy:
content: "{{ app_config.content | b64decode }}"
dest: /etc/ansible/facts.d/myapp.fact
- name: Print application configuration
debug:
var: ansible_local.myapp
二、示例 2:监控服务状态
你可以收集和存储特定服务的状态信息,例如数据库服务的运行状态。
- name: Collect service status
hosts: all
tasks:
- name: Check if database service is running
command: systemctl is-active my_database
register: db_service_status
- name: Store service status in ansible_local
copy:
content: |
{
"db_service": "{{ db_service_status.stdout }}"
}
dest: /etc/ansible/facts.d/db_service.fact
- name: Print database service status
debug:
var: ansible_local.db_service
自行测试:
---
- name: the play1
hosts: db01
become: no
tasks:
- name: task1-1
command: systemctl status mariadb
register: mariadb_service_status
ignore_errors: yes
# 这里使用“ignore_errors”且值为yes,是为了防止出现“systemctl status mariadb”返回的结果rc!=0的情况,如果出现了rc!=0那么将不会执行下面的task了,这样通过ingore_errors就会跳过它,继续执行后面的task
- name: taks1-2
set_fact:
mariadb_service_status: "{{mariadb_service_status.stdout if mariadb_service_status.rc == 0 else 'inactive'}}"
# 这里的"set_fact"模块用于改变注册变量mariadb_service_status的值
- name: task2
copy:
content: |
{
"mariadb_service_status": "{{mariadb_service_status}}"
}
dest: /etc/ansible/facts.d/mariadb_service_status.fact
# 前提是目标主机即db01上得存在/etc/ansible/facts.d这目录才行
- name: task3
debug:
msg: "该主机存储出的mariadb_service_status变量的内容为:{{ansible_local.mariadb_service_status}}"
三、 示例 3:存储网络配置信息
假设你想收集网络接口的配置信息并存储为自定义事实。
- name: Collect network interface information
hosts: all
tasks:
- name: Gather network facts
setup:
gather_subset:
- network
- name: Save network information as ansible_local fact
copy:
content: "{{ ansible_interfaces | to_json }}"
dest: /etc/ansible/facts.d/network.fact
- name: Print network interface information
debug:
var: ansible_local.network
20. ansible_managed
- 描述: 用于指示文件是由 Ansible 管理的,通常用于模板文件的头部。
- 用法: 在模板文件中使用,以表明文件管理状态。
通常用于在配置文件中标识文件是由Ansible管理的。这有助于在文件顶部添加注释,指明该文件的来源。
在Ansible中,ansible_managed变量主要用于模板文件(如Jinja2模板),而不是在普通的playbook或任务中直接使用。因此,下面的playbook中,ansible_managed未定义,因此会报错。
---
- name: the play1
hosts: localhost
become: no
tasks:
- name: the task1
debug:
msg: "ansible_managed的值为:{{ ansible_managed }}"
一、使用方法 你可以在模板文件(如Jinja2模板)中使用
{{ ansible_managed }}
来插入默认的管理注释。这个变量会根据Ansible的配置自动生成。二、示例 假设你想在一个配置文件的开头添加管理信息,可以创建一个Jinja2模板,如
my_config.j2
:
# This file is managed by Ansible. Do not edit directly.
# Ansible managed: {{ ansible_managed }}
#
# Configuration settings
setting1=value1
setting2=value2
在你的playbook中,可以使用
template
模块将这个模板应用到目标主机:
- hosts: all
tasks:
- name: Deploy configuration file
template:
src: my_config.j2
dest: /etc/my_config.conf
当Ansible运行时,
{{ ansible_managed }}
会被替换为一个包含版本信息和更新时间的字符串,生成的文件顶部将包含有关文件的管理信息。这样,你可以清楚地知道该文件是由Ansible生成的,避免手动修改。
21. ansible_connection
- 描述: 当前主机的连接类型(如 ssh、local)。
- 用法: 根据连接类型执行不同的逻辑。
22. ansible_ethX
- 描述: 特定网络接口的详细信息(X 代表接口编号)。
- 用法: 访问指定网络接口的信息。
23. ansible_processor_cores
- 描述: 主机上处理器的核心数量。
- 用法: 根据核心数调整配置或任务。
24. ansible_mounts
- 描述: 当前主机上所有挂载点的信息。
- 用法: 获取和处理磁盘挂载信息。
25. ansible_kernel
- 描述: 当前主机操作系统的内核版本。
- 用法: 用于内核相关的任务或调试。
26. ansible_distribution_release
- 描述: 当前主机操作系统的发布版本(如 stable、testing)。
- 用法: 用于条件逻辑。
27. ansible_lsb
- 描述: 主机的 Linux Standard Base 信息。
- 用法: 用于 Linux 发行版的兼容性检查。
ansible_lsb
是 Ansible 中的一个事实变量,用于获取与 Linux Standard Base (LSB)
相关的信息。它包含有关操作系统版本和发行版的详细信息。一、 获取 LSB 信息
你可以通过收集系统事实来访问
ansible_lsb
。以下是一个使用示例:
- name: Gather LSB facts
hosts: all
tasks:
- name: Gather facts
setup:
filter: ansible_lsb
- name: Show LSB information
debug:
var: ansible_lsb
二、 LSB 信息内容
ansible_lsb
通常包含以下键:
distrib_id
:发行版 IDdistrib_release
:发行版版本distrib_codename
:发行版代号distrib_description
:发行版描述你可以在
debug
任务中查看这些信息,例如:
- name: Show LSB ID
debug:
var: ansible_lsb.distrib_id
- name: Show LSB Release
debug:
var: ansible_lsb.distrib_release
三、 注意事项
确保在运行这些任务之前,目标主机上安装了 LSB 工具(如
lsb-release
),以便 Ansible 可以成功收集这些信息。
28. ansible_bios
- 描述: 主机的 BIOS 信息。
- 用法: 用于硬件信息的收集和记录。
ansible_bios
是 Ansible 中的一个事实变量,用于获取与系统 BIOS 相关的信息。它通常包含 BIOS版本、制造商和发布日期等信息。
你可以通过以下方式收集 BIOS 信息:
- name: Gather BIOS facts
hosts: all
tasks:
- name: Gather facts
setup:
filter: ansible_bios
- name: Show BIOS information
debug:
var: ansible_bios
运行后,
ansible_bios
将包含相关的 BIOS 信息,便于你进行进一步处理。
29. ansible_virtual
- 描述: 主机的虚拟化状态(如 true/false)。
- 用法: 用于检测主机是否在虚拟环境中。
ansible_virtual
是 Ansible 中的一个事实变量,用于获取有关虚拟化环境的信息。它提供了当前主机是否在虚拟机中运行的相关信息。
你可以通过以下方式获取虚拟化信息:
- name: Gather virtual facts
hosts: all
tasks:
- name: Gather facts
setup:
filter: ansible_virtual
- name: Show virtual information
debug:
var: ansible_virtual
通常,
ansible_virtual
可能包含以下字段:
type
:虚拟化类型(例如 KVM、VMware 等)host
:物理主机信息这使得你可以根据虚拟化环境调整你的 Ansible 任务和剧本。
30. ansible_libraries
- 描述: Ansible 查找模块的路径列表。
- 用法: 用于调试或添加自定义模块路径。
ansible_libraries
是 Ansible 的一个内置变量,用于指定自定义模块的搜索路径。这可以帮助你在剧本中使用自己编写的Ansible 模块。
创建自定义模块: 首先,确保你有一个自定义模块,比如
my_module.py
,并将其放在特定的目录下。设置
ansible_libraries
: 你可以在你的 Ansible 剧本中指定模块路径。例如:
- name: Use custom module
hosts: all
vars:
ansible_libraries: "/path/to/your/custom/modules"
tasks:
- name: Execute custom module
my_module:
param1: value1
- 放置自定义模块: 确保你的自定义模块在你设置的路径下,并且具有可执行权限。
假设你的自定义模块存放在
/opt/ansible/modules
,你可以在剧本中这样使用:
- name: Use custom module
hosts: all
vars:
ansible_libraries: "/opt/ansible/modules"
tasks:
- name: Run my custom module
my_module:
arg1: "value"
这样,Ansible 就会在指定的路径中查找自定义模块
my_module.py
。
- 确保你的模块代码是有效的,且符合 Ansible 的模块开发规范。
- 在运行 Ansible 任务之前,确认路径设置正确。
31. ansible_python_interpreter
- 描述: Ansible 使用的 Python 解释器路径。
- 用法: 在执行 Python 任务时确保使用正确的解释器。
ansible_python_interpreter
是 Ansible 中的一个变量,用于指定在目标主机上运行 Python的解释器路径。它通常用于确保 Ansible 在正确的 Python 环境中运行,特别是在系统中存在多个 Python 版本时。
- 在剧本中指定:
你可以在 Ansible 剧本中指定ansible_python_interpreter
变量,例如:
- name: Set Python interpreter
hosts: all
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Check Python version
command: "{{ ansible_python_interpreter }} --version"
在 inventory 文件中指定:
你还可以在你的 inventory 文件中为特定主机或组设置该变量。例如:
[myservers]
server1 ansible_python_interpreter=/usr/bin/python3
server2 ansible_python_interpreter=/usr/bin/python2
如果没有显式设置
ansible_python_interpreter
,Ansible 会根据目标主机的环境尝试自动查找 Python解释器,通常是/usr/bin/python
或/usr/bin/python3
。
- 确保指定的 Python 路径是正确的,并且目标主机上存在该 Python 版本。
- 适当的 Python 版本对于执行某些模块和任务非常重要,特别是需要依赖于特定库的模块。
32. ansible_pkg_mgr
- 描述: 主机的包管理工具(如 apt、yum)。
- 用法: 用于选择合适的包安装命令。
二、Ansible的变量的使用
在Ansible中,变量可以分为多个类别,主要包括:
主机变量(Host Variables):特定于主机的变量,可以在 inventory 文件中定义。
组变量(Group Variables):针对主机组定义的变量,通常在
group_vars
目录中。Playbook 变量:在 playbook 中定义的变量,可以在
vars
部分声明。Facts:通过 Ansible 收集的关于主机的信息,使用
setup
模块自动收集。临时变量:在任务中定义的临时变量,使用
set_fact
模块。环境变量:可以通过
env
变量获取。注册变量:通过任务的结果注册的变量,可以使用
register
关键字。Jinja2 变量:使用 Jinja2 模板语法定义和处理的变量。
Playbook 参数:通过命令行传递给 playbook 的变量,使用
--extra-vars
。默认变量:角色中的
defaults/main.yml
文件中定义的变量。这些变量可以在任务、模板和其他地方使用,提供灵活的配置选项。
在主机清单文件中定义变量(不推荐)
[rsync:children]
web_servers
nfs_servers
backup_servers
[web_servers]
...
[web_servers:vars]
id=777
user=ooo
[nfs_servsers]
...
[backup_servers]
...
调用测试:
- 错误调用:
---
- name: the play to test the inventory variables
hosts: web_servers
become: no
tasks:
- name: task1
debug:
# 下面的msg的内容是错误书写:
msg: "vars in web_servers content: id:{{web_servers.id}}, user:{{web_servsers.user}}"
会报错:
- 正确调用:
---
- name: the play to test the inventory variables
hosts: web_servers
become: no
tasks:
- name: task1
debug:
# 下面的msg的内容是正确书写:
msg: "vars defined in web_servers have: id:{{id}}, user:{{user}}"
在bash运行命令时定义变量(不推荐)
ansible-playbook <剧本文件全路径> -e 'user=kk' -e 'id=888'
# -e: -extra-vars
在剧本中定义变量(不推荐)
vars
方式
---
- name: the play1
hosts: xxx
become: no
vars:
packages1:
- redis
- tomcat
tasks:
- name: task1
yum:
name: {{packages1}}
state: present
vars_files
方式
# 创建含有变量的文件
vim ansbile_vars.txt
# vim中写入以下内容:
packages1:
- redis
- tomcat
调用测试:
bash、vars
和vars_files
中定义相同变量后谁的优先被调用?
bash方式 > vars _files > vars
测试:
---
- name: the play1
hosts: web_servers
become: no
# 定义一个user变量
tasks:
在host_vars目录和group_vars目录中定义变量(!!推荐!!)
简述:
为什么推荐使用这两种方式
推荐使用 host_vars
和 group_vars
目录来定义变量,主要有以下几个原因:
-
结构化管理:将变量按主机或组分类存放,使得管理更加清晰,便于维护和查找。
-
可重用性:在不同的剧本中,主机或组的变量可以被重用,避免重复定义,提高效率。
-
灵活性:可以为特定主机或组定义独立的变量,支持更复杂的配置管理。
-
自动加载:Ansible 会自动加载这些目录中的变量,简化剧本的书写,不必在每个剧本中手动引用变量文件。
总之,这种方式提升了组织性和可维护性,让 Ansible 配置更加灵活和易于扩展。
内容:
-
host_vars目录:
定义单个主机的变量 -
group_vars目录:
定义主机组的变量
在/etc/ansible/host_vars目录中定义变量
# 单独为web01主机定义变量,文件名必须和DNS解析的主机名(这里是web01)相同
vim /etc/ansbile/host_vars/web01
# 进入vim写入:
user:web01_user
id:4443
# 单独为web02主机定义变量,文件名必须和DNS解析的主机名(这里是web02)相同
vim /etc/ansible/host_vars/web02
# 进入vim写入:
user:web02_user
id:4444
测试调用:
---
- name: the play1
hosts: web_servers
become: no
tasks:
- name: the task1
user:
name: "{{user}}"
uid: "{{id}}"
state: present
# 尽管变量名相同,但效果是会为web01和web02各自创建不同的user
在/etc/ansbile/group_vars目录中定义变量
# 为主机组创建统一的变量,文件名必须与定义的主机组名相同
vim /etc/ansible/group_vars/web_servers
# vim写入:
user:group_uni_user
id: 4449
两种方式定义相同变量时,谁的优先被调用?
host_vars > group_vars
测试:
自定义host_vars目录和group_vars目录(不在/etc/ansible中)
注意:
1、playbook文件必须与host_vars目录和group_vars目录同级,如果你的host_vars和group_vars目录位于/etc/ansible下,那么你的剧本文件可以放在任何地方。Ansible会在执行时自动查找这些目录,因此不需要与剧本文件同级。
2、当/etc/ansible下的host_vars目录或是group_vars目录也同样定义了和自定义host_vars目录或group_vars目录下的变量的话,剧本文件会优先调用与它同级的(也就是自定义的)下面的变量值
以上所有的定义变量的方式谁的优先级高?
1、命令行方式
2、host_vars方式
3、group_vars方式
4、playbook中vars_files方式
5、playbook中vars方式
6、主机清单方式
Ansible变量注册register
指令
详见之前的文章"Ansible_模块"(链接)