3

Ansible 学习笔记 - 定位主机和组的模式 - 东风微鸣

 1 year ago
source link: https://www.cnblogs.com/east4ming/p/17053102.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

中英文对照表

英文 中文 备注
host 主机
group (主机)组
pattern 模式
ad hoc 特别命令
playbook 剧本 Ansible 专有名词,一段复杂的编排
inventory 库存 Ansible 专有名词
flag 标志
alias 别名

模式(Patterns):定位主机和主机组

当您通过一个特别命令(ad hoc)或运行一个剧本(playbook)执行 Ansible 时,您必须选择要针对哪个受管节点或组执行。模式允许您针对库存(inventory)中的特定主机和/或组运行命令和剧本。Ansible 模式可以引用单个主机、IP地址、库存组、一组 组或库存中的所有主机。模式非常灵活——您可以排除或要求主机子集,使用通配符或正则表达式,等等。Ansible 在模式中包含的所有库存主机上执行。

几乎在执行特别命令或剧本时都要使用模式。模式是特别命令(ad hoc command )中唯一没有标志的元素。其通常是第二个元素:

ansible <pattern> -m <module_name> -a "<module options>"
ansible webservers -m service -a "name=httpd state=restarted"

⚠️ 注意:

如果 shell 是 zsh,<pattern> 需要用双引号括起来,如下:

  • ✅ ansible "component*" -m ping
  • ❌ ansible component* -m ping ,这个会报错:「zsh: no matches found: component*」

在剧本中,模式是每个剧本的 hosts: 行内容:

- name: <play_name>
  hosts: <pattern>
- name: restart webservers
  hosts: webservers

由于您经常希望一次针对多个主机运行命令或剧本,因此模式通常引用库存组。特别命令和上面的剧本都将对 webservers 组中的所有机器执行。

该表列出了针对库存主机和组的常见模式。

描述 模式 目标
所有主机 all (或 *)
一台主机 host1
多台主机 host1:host2 (或 host1,host2)
一个(主机)组 webservers
多个(主机)组 webservers:dbservers webservers 组中的所有主机加上 dbservers 中的所有主机
排除(主机)组 webservers:!atlanta 在 webservers 且不在 atlanta 组中的所有主机
组的交集 webservers:&staging 既在 webservers 又在 staging 中的所有主机

✍️ 笔记:

可以使用逗号(,)或冒号(:)分隔主机列表。在处理范围和 IPv6 地址时,首选逗号。

一旦你知道了基本的模式,你就可以把它们组合起来。举个例子:

webservers:dbservers:&staging:!phoenix

针对 “webservers” 组和 “dbservers” 组中所有也在 “staging” 组中的机器,除了 “phoenix” 组中的机器。

您可以对 FQDN 或 IP 地址使用通配符模式,只要目录中的主机是通过 FQDN 或 IP 地址命名的:

192.0.\*
\*.example.com
\*.com

你可以同时混合通配符模式和组:

one*.com:dbservers

模式的限制

模式取决于库存。如果一个主机或组没有列在你的目录中,你不能使用模式来锁定它。如果你的模式包含一个 IP 地址或主机名,但没有出现在库存中,你会看到这样的错误:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com

您的模式必须与库存语法匹配。如果将主机定义为别名:

atlanta:
  host1:
    http_port: 80
    maxRequestsPerChild: 808
    host: 127.0.0.2

您必须在模式中使用别名。在上面的示例中,必须在模式中使用 host1。如果你使用 IP 地址,你将再次报错:

[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2

高级模式选项

上面描述的通用模式将满足您的大多数需求,但是 Ansible 提供了其他几种方法来定义您想要目标的主机和组。

在模式中使用变量

你可以通过 -e 参数使用变量来向 ansible-playbook 传递组说明符:

webservers:!{{ excluded }}:&{{ required }}

在模式中使用组位置

可以根据主机在组中的位置定义主机或主机子集。例如,给定下列组:

[webservers]
cobweb
webbing
weber

您可以使用下标来选择单独的主机或范围内的 webservers 组:

webservers[0]       # == cobweb
webservers[-1]      # == weber
webservers[0:2]     # == webservers[0],webservers[1]
                    # == cobweb,webbing
webservers[1:]      # == webbing,weber
webservers[:3]      # == cobweb,webbing,weber

在模式中使用正则

你可以以 ~ 开头,指定一个模式作为一个正则表达式:

~(web|db).*\.example\.com

模式和 ansible-playbook 标志

您可以使用命令行选项更改剧本中定义的模式的行为。例如,可以通过指定 -i 127.0.0.2, (注意末尾的逗号),在单个主机上运行一个定义了所有主机的剧本。即使你的目标主机没有在你的库存中定义,这也可以工作。你也可以使用 --limit 标志来限制你的目标主机:

ansible-playbook site.yml --limit datacenter2

最后,您可以使用 --limit 从文件中读取主机列表,方法是在文件名前加上 @ 前缀:

ansible-playbook site.yml --limit @retry_hosts.txt

如果 RETRY_FILES_ENABLED 设置为 True, ansible-playbook 运行后将创建一个 .retry 文件,其中包含所有剧本中失败的主机列表。每次 ansible-playbook 运行结束时,该文件都会被覆盖。

ansible-playbook site.yml –limit @site.retry

要使用 Ansible 命令和脚本应用您的模式知识,请阅读特别命令介绍脚本介绍

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK