Ansible 剧本中启动/停止命令的约定

Ansible 剧本中启动/停止命令的约定

我是 Ansible 的新用户,到目前为止,我很喜欢它。我使用 Ansible 来定义和应用 Web 服务器配置。我使用剧本。假设我有一个角色来安装和配置 Nginx,任务在 处定义roles/nginx/tasks/main.yml并引用,./site.yml因此当我配置新服务器时,它们总是运行。类似以下示例:https://github.com/ansible/ansible-examples/tree/master/wordpress-nginx/roles/nginx。这很好,但有时我想明确停止、启动或重新启动 Nginx。我知道如何使用 Ansible 实现这一点,但我的问题是关于惯例或常见做法。我应该...

A. 在 Nginx 角色文件夹中创建启动、停止和重新启动任务?如果是,我应该如何声明和调用它们。显然,我不应该只是将它们添加到 main.yml 中,否则每当我配置新服务器时它们都会被调用。我应该创建roles/nginx/tasks/start.ymlroles/nginx/tasks/stop.yml并像 一样调用它们吗ansible-playbook -i staging nginx/roles/stop.yml

B. 或者我不应该在剧本中声明这些,而是​​使用ansible诸如 来执行它们ansible webservers -i staging -a "nginx stop" -s

C. 关于如何最好地实现这一目标的任何其他建议。

非常感谢 ( :

答案1

如果这是一项临时操作,你的环境很小而且不太复杂,所有相关人员都已获知,你希望在两分钟内恢复正常,并且你不介意下一次 ansible 运行是否会改变这种情况(例如,已停止的服务已重新启动,因为 ansible 剧本中的服务状态定义是这样说的),那么请继续执行 B。请注意,你更改的系统状态与 ansible 中的描述不同……

如果你想让事情更清楚,解决方案 A 是一个很好的起点。你可以为 nginx 停止、启动等创建适当的定义,但总的来说它就像 B,只是任务定义在某些文件中。

至于 C,您可以进一步开发 A:使状态依赖于变量。这样,您就可以在 ansible 配置中明确所需状态。为什么是变量而不是在服务定义中更改状态?在更复杂的场景中(例如同时启动/停止多个服务),它可以帮助您保持清晰和简单。如果您有多个环境(暂存、生产等),这可以轻松地保持定义相同,同时仅在一个环境中更改状态。

使事情明确化可以带来一些好处:

  • 它被记录下来,供其他人(以及未来的你)查看

  • 独立于你的任务运行 ansible 不会干扰(假设每个人都有当前状态)

  • 如果你自动运行 ansible(由版本控制触发),你可以使用它来改变你的状态,也可以将其改回

答案2

没有必要将有关某件事的每项任务都放在一个角色中。此外,如果你深入角色内部,了解其部分任务,感觉就像是违反了抽象原则。我知道,我曾经这样做过。

例如,Web 更新剧本可以通过其自己的任务将内容复制到 Web 根目录,并在需要时重新启动 nginx。

特别强大的是在一个剧本中描述整个状态。调用角色 nginx,并在 post_tasks 中复制此特定网站的内容。您的网站将在那里,必要时安装 nginx。nginx 重新启动只是调用处理程序任务时的副作用。

相关内容