Skip to main content

2.资产(Inventory)

资产(Inventory)

定义

资产通常指的是被 Ansible 管理的主机、设备或节点。这些资产信息被组织在清单(Inventory)中。资产可以分为静态资产和动态资产。

静态资产

静态资产是在清单文件中静态定义的,手动编写并存储在文件中的主机信息。这些主机信息包括主机名、IP地址、连接信息等,以及可选的主机变量。

特点

  • 手动管理: 由管理员手动编辑清单文件,添加、修改、删除主机信息。
  • 简单: 适用于相对稳定、数量较少的环境,主机信息不频繁变化。
  • INI 或 YAML 格式: 静态清单文件可以采用 INI 格式或 YAML 格式。

格式

对于/etc/ansible/hosts最简单的定义格式像下面:

示例:

[web_servers]
10.25.1.57 #单台主机
web1 ansible_host=192.168.1.101 ansible_user=ubuntu #web01是主机别名

[db_servers]
db1 ansible_host=192.168.1.201 ansible_user=admin

[all_servers]
[all_servers:children] #子组,:children 是固定写法
db1 ansible_host=192.168.1.201 ansible_user=admin
www[001:006].example.com #代表001到006的6台主机

格式简介:

  • [all_servers]:组名
  • [all_servers:children]: 子组,组名:children 是固定写法,代表一个子组。
  • www[001:006].example.com:代表多个资产
    • 格式:[start:end]
  • web1 : 这是主机的别名,也是在 Ansible 中用于标识和引用这台主机的名称。这个名字可以在 Ansible 的 Playbooks 或 Ad-Hoc 命令中使用。
  • ansible_host=192.168.1.101 : 这是指定主机的 IP 地址。ansible_host 是 Ansible 中用于指定主机 IP 地址的关键字。
  • ansible_user=ubuntu : 这是指定连接到主机时所使用的用户名。ansible_user 是 Ansible 中用于指定连接用户的关键字。

提示:

ansible_hostansible_user 是 Ansible 中特定的预定义变量名,用于指定主机的 IP 地址和连接用户名。这些变量名是 Ansible 约定的,具有特殊的含义,因此在清单文件中使用这些名称来定义主机信息是一种推荐的做法。

示例(YAML 格式):

all:
hosts:
web1:
ansible_host: 192.168.1.101
ansible_user: ubuntu
web2:
ansible_host: 192.168.1.102
ansible_user: centos
children:
db_servers:
hosts:
db1:
ansible_host: 192.168.1.201
ansible_user: admin

动态资产

动态资产是在运行时由外部脚本或程序生成的主机信息。这种方式允许 Ansible 自动发现和管理主机,适用于动态云环境、容器化环境等场景。

特点

  • 自动发现: 主机信息在运行时动态生成,而非静态写入文件。
  • 灵活性: 适用于动态、弹性的环境,主机数量可能动态变化。
  • 脚本或程序: 外部脚本或程序负责生成主机信息。

示例:

Ansible 动态清单脚本通常以 JSON 格式输出主机信息。

{
"web_servers": [
{"ansible_host": "192.168.1.101", "ansible_user": "ubuntu"},
{"ansible_host": "192.168.1.102", "ansible_user": "centos"}
],
"db_servers": [
{"ansible_host": "192.168.1.201", "ansible_user": "admin"}
]
}

示例(使用动态清单):

ansible all -i dynamic_inventory_script.py -m ping

dynamic_inventory_script.py 是一个动态清单脚本。

自定义资产

使用自定义资产需要用 -i 选项

列出资产中的主机

列出所有资产

  • ansible all -i ./inventory.ini --list-hosts
    • all代表资产文件中的所有组

列出指定资产

  • ansible web_name -i ./inventory.ini --list-hosts
    • web_name是指定组的组名

列出自定义资产所有主机

创建自定义资产文件

cat << EOF > inventory.ini 
[web]
192.168.123.1
192.168.123.20
[test]
192.168.123.200
192.168.123.210
EOF

运行ansbile命令

#列出所有组主机
ansible all -i ./inventory.ini --list-hosts #all代表资产文件中的所有组
#结果:
hosts (4):
192.168.123.1
192.168.123.20
192.168.123.200
192.168.123.210

#匹配指定组
ansible web -i ./inventory.ini --list-hosts #web是指定组的组名
hosts (2):
192.168.123.1
192.168.123.20

#匹配多个组
ansible 'london,boston' --list-hosts

#匹配单个主机
ansible all -i 192.168.123.1 --list-hosts

#匹配多个主机
ansible 'lb1.lab.example.com,s1.lab.example.com,db1.example.com' --list-hosts #也可使用IP

#匹配不属于任何组的主机
ansible ungrouped --list-hosts #使用ungrouped选项

通配符匹配

匹配'*.example.com'

ansible '*.example.com' --list-hosts

匹配 172.25.* 的主机

ansible '172.25.*' --list-hosts 

匹配以 s 开头的主机及主机组

ansible 's*' --list-hosts

通配符组合匹配

匹配包含 *.example.com 但不包含 *.lab.example.com 的主机

ansible '*.example.com,!*.lab.example.com' --list-hosts

匹配包含prod以及172开头、包含lab关键字的主机或组

ansible 'prod,172*,*lab*' --list-hosts

匹配属于db组同时还属于london组的主机

ansible 'db,&london' --list-hosts

匹配在london组或者boston组,还必须在prod组中且必须不在lb组中的主机

ansible 'boston,london,&prod,!lb' --list-hosts

正则表达式匹配

在开头的地方使用”~”,用来表示这是一个正则表达式

ansible '~(s|db).*example\.com' --list-hosts

通过 --limit 明确指定主机或组

通过 --limit 在选定的组中明确指定主机

ansible ungrouped --limit srv1.example.com --list-hosts

通过 --limit 参数,还可以指定一个文件,该文件中定义明确指定的主机的列表,定义一个retry_hosts.txt如 下

srv1.example.com

再次执行ansible指令如下

ansible ungrouped --limit @retry_hosts.txt --list-hosts

资产选择器

资产选择器(Inventory Selectors)是一种机制,用于从主机清单(Inventory)中选择特定的主机组或主机。

格式

ansible PATTERN -i inventory -m module a argument

常见的资产选择器示例

ansible all -i inventory.ini -m ping				#选择所有主机
ansible 192.168.123.1,192.168.123.2 -i inventory.ini -m ping #选择多台主机
ansible web_servers -i inventory.ini -m ping #选择特定主机组
ansible web_servers[0] -i inventory.ini -m ping #选择主机组中的特定主机,0是索引,索引从0开始

ansible 'web*' -i inventory.ini -m ping #使用模式匹配选择主机
ansible web_servers:db_servers -i inventory.ini -m ping #使用组合选择器选择多个主机组

ansible 'web_servers:&db_servers' -i inventory.ini -m ping #选择两个组的交集的主机

ansible all:!excluded_host -i inventory.ini -m ping #选择除了某个主机的所有主机

Ad-Hoc