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}
我正在使用以下命令运行playbook:
ansible-playbook --limit 'PM' akana-installation.yml
但是剧本仍在播放所有主持人,这意味着
Play 'PM:ND:CM'
Play 'PM'
Play 'ND'
Play 'CM'
所有戏剧都在播放。请帮我解决这个问题。
我需要的是:执行剧本时,我会给团体名称,只有团体才能播放,所以请告诉我有没有别的办法。
答案 0 :(得分:4)
原始问题是: - 限制选项不起作用
通过调用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]
答案 1 :(得分:2)
为playbook文件创建目录:
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
答案 2 :(得分:0)
这是添加到上一个答案。如果我误解了你的问题,我很抱歉,但你的示例剧本没有任何描述。
清理跳过的主机:
Group' ND'将(如上所述)与任何主机不匹配。如果你想从播放中删除输出,你将不得不使用一个Callback插件。我使用以下Gist:
另一种限制方式:
要限制您的要求,您需要使用TAGS。这将允许您通过播放限制(这似乎是您想要做的)而不是主机列表。
为此,请在游戏中添加标签:
...
- hosts: PM
remote_user: root
tags: pmtag
tasks:
{some thing}
然后根据您的需要排除或包含新标签来运行剧本。
ansible-playbook --limit 'PM' akana-installation.yml --tags pmtag
这将确保只有PM中的主机才会播放标记有pmtag的内容。