如何在单个 ansible 剧本中为不同的主机运行不同的角色?

如何在单个 ansible 剧本中为不同的主机运行不同的角色?

我有 3 个 ansible 剧本。

my_ansible
├── hosts
├── play1.yaml
├── play2.yaml
├── play3.yaml
└── roles
    ├── role1
    ├── role2
    └── role3

主办方

[play1]
host1

[play2]
host2

[play3]
host3

现在,当我跑步时play3,我想play2(role2)一直跑host2下去。play1(role1)host1

我检查了一下,角色依赖,但这适用于同一主机,意味着,如果我添加role-dependencyrole3role1那么role2这两个角色将对抗host3

我想确保,仅play1在 上运行host1、仅play2在 上运行、仅在 上运行。host2play3host3

我尝试寻找playbook依赖关系,但还没有成功。

如果有更好的方法来解决这个问题,那么我也愿意尝试这种方法。

答案1

我想实现此目的的最简单方法是创建一个主剧本并在其中定义剧本的顺序。

可以将剧本包含在主剧本中。[...] 列出的每个剧本中的剧本和任务将按照列出的顺序运行,就像直接在这里定义它们一样。

关于剧本重用的 Ansible 文档包括

为了实现该play3运行play2play1我们只需要定义一个这样的主剧本:

---
- import_playbook: play3.yml
- import_playbook: play2.yml
- import_playbook: play1.yml

答案2

不确定我是否理解,但我认为你的问题是你不想在没有先运行 play2 和 play1 的情况下运行 play3?

我不知道如何强制执行这一点,但我可以想到一些方法使其更方便。

首先,只需将所有三个剧本放入一个文件中,然后当您运行其中一个剧本时,就会运行它们全部。如果您偶尔想运行 play1 而不运行 play2 和 play3,请使用标签。使用标签,您可以让 play1 和 play2 具有 play3 标签,这样您就不会意外运行 play3 而不运行 play1 和 play2。

我通常将 ansible-playbook 命令放入脚本文件中,这样我就不必记住它了。如果您喜欢这样做,您可以让脚本启动三个播放。当您的同事不太了解 ansible 时,这尤其有用。例如,我创建了一个名为的文件,run.sh其中包含:

ansible-playbook -i hosts myplay.yaml $@

bash$@用于添加任何参数,因此我可以执行./run.sh -t play1类似的事情。

希望有帮助!

相关内容