如何使用 Ansible Playbook 与特定组一起玩

How to Play with particular group using Ansible Playbook

Ansible 版本:2.1.0

我的 ansible 主机文件是:

[PM]
xyz.example.com ansible_connection=ssh

[ND]
pqr.example.com ansible_connection=ssh

[CM]
xyz.example.com ansible_connection=ssh
pqr.example.com ansible_connection=ssh

剧本是:

- hosts: PM:ND:CM
   remote_user: root
   tasks:
    {some thing}

- hosts: PM
   remote_user: root
   tasks:
    {some thing}

 - hosts: ND
   remote_user: root
   tasks:
    {some thing}

- hosts: CM
   remote_user: root
   tasks:
    {some thing}

我是 运行 剧本,命令如下:

ansible-playbook --limit 'PM' akana-installation.yml

但剧本仍然在与所有主机一起玩,这意味着

Play 'PM:ND:CM'
Play 'PM'
Play 'ND'
Play 'CM'

所有的戏都在演。请帮我解决这个问题。

我需要的是:在执行剧本时我会给出组名,只有那个组应该玩,所以请让我知道有没有其他方法。

原问题是:--限制选项不起作用

通过调用 ansible-playbook --limit 'PM' akana-installation.yml 告诉 ansible 将服务器限制为 PM 组中的主机。
在你的情况下它将是 xyz.example.com.
请记住,如果您像现在一样在多个组中拥有此服务器,它仍将是该组的成员。
您的有限库存将变为:

[PM]
xyz.example.com ansible_connection=ssh

[ND]

[CM]
xyz.example.com ansible_connection=ssh

ansible-playbook 将执行您的剧本中适用于 asma.example.com 的每个剧本。
在你的情况下:

Play 'PM:ND:CM'
[xyz.example.com]
Play 'PM'
[xyz.example.com]
Play 'ND'
skipping: no hosts matched
Play 'CM'
[xyz.example.com]

这是对上一个答案的补充。如果我误解了您的问题,我深表歉意,但是您的示例剧本没有任何描述。

正在清理跳过的主机:
组 'ND' 将(如上所述)不匹配任何主机。如果您想从播放中删除输出,则必须使用回调插件。我使用以下 Gist

另一种限制方式:
要限制您要求的方式,您需要使用 TAGS。这将允许您通过播放(这似乎是您想要做的)而不是主机列表来限制。

为此,请在播放中添加标签:

...
- hosts: PM
  remote_user: root
  tags: pmtag
  tasks:
    {some thing}

然后 运行 根据您的需要排除或包含带有新标签的剧本。

ansible-playbook --limit 'PM' akana-installation.yml --tags pmtag

这将确保只有 PM 运行 中的主机才能播放带有 pmtag 标记的内容。

为剧本文件创建目录:

mkdir playbooks

将您的剧本拆分成单独的文件,例如。 playbooks/pm.yml:

- hosts: PM
  remote_user: root
  tasks:
  {some thing}

创建文件all.yml

- hosts: PM:ND:CM
  remote_user: root
  tasks:
  {some thing}

- include: playbooks/pm.yml
- include: playbooks/nd.yml
- include: playbooks/cm.yml    

现在你有了独立的逻辑,你可以用命令播放所有内容:

ansible-playbook all.yml

或运行单独的命令:

ansible-playbook playbooks/pm.yml

ansible-playbook playbooks/nd.yml