使用 Ansible OSS 部署和安排更改
Deploying and scheduling changes with Ansible OSS
请注意:我不对任何enterprise/for-pay感兴趣(塔?) 解决方案在这里,只有通过 Ansible 的 OSS 产品可用的解决方案。
好的,我已经配置好我的 Ansible 项目并完美运行,太棒了!看起来像这样:
myansible01.example.com:/opt/ansible/
site.yml
fizz.yml
buzz.yml
group_vars/
roles/
common/
tasks/
main.yml
handlers
main.yml
foos/
tasks/
main.yml
handlers/
main.yml
要在生产环境中运行,我需要完成几件事:
- 我需要能够自动部署对此项目的更改
- 我需要将 playbook 安排为 运行,比如说,每 30 秒一次(以确保所有托管节点始终合规)
所以我的担忧:
- 更改通常如何部署到实时 Ansible 项目?假设项目位于
myansible01.example.com:/opt/ansible
(我的 Ansible 服务器)。仅删除 Ansible 项目根目录 (rm -rf /opt/ansible
) 然后将最新的(包含更改的)Ansible 项目复制回相同位置就足够了吗?如果当我执行此“drop-n-swap”时 Ansible 当前正在 运行ning 任何播放会发生什么?
- 看起来商业产品 (Ansible Tower) 内置了调度功能,但 OSS 产品没有。我如何安排 Ansible OSS 在特定时间播放 运行?例如,我可能希望某些播放每 30 秒 运行,以确保节点始终符合要求。
cron
是否足以做到这一点,或者是否有更标准的方法?
对于此类任务,您通常需要诸如 Jenkins 之类的编排引擎来完成您的所有编排工作。
您可以将 Jenkins 设置为 运行 关于计时器或其他事件的剧本,例如推送到 SCM,例如 git。
通常,一项工作从检查我们的 Ansible 代码库的 tag/branch 开始,然后将其应用于我们所有指定的服务器,这样您就可以始终了解正在发生的事情 运行。如果你愿意,这可以简单地成为 master 的头(在 git 术语中)所以它总是应用最新的更改。如果您还想将其连接到您的 SCM 存储库中,那么一个简单的推送将强制将这些更改应用到您的所有服务器。
由于这种即时性,您可能只想考虑在某些测试服务器上执行此操作,然后对它们进行某种形式的测试(例如 Serverspec)以在滚动之前验证您的更改是否正确到生产环境。
Jenkins,默认情况下,不会 运行 一个作业,而同一个作业正在 运行ning(或者如果你的执行程序槽已经用完了),所以你总是可以确定它会仅在 Ansible 运行 完成后才提取回购协议(包括任何更改)。如果您有多个作业 运行ning,您可以使用阻塞来阻止同时作业 运行ning(两者都试图对服务器应用可能不同的配置),但您不必担心新工作开始并将回购拉入已经 运行 的工作中,因为 Jenkins 将这些工作分成单独的工作空间。
我们使用 Jenkins 来针对我们的环境手动 运行s Ansible,但我们也有一个 "self healing" Jenkins 作业,它只是 运行s 我们的 Ansible 代码库的标记提交环境,迫使它进入幂等状态以防止配置的自然漂移。当我们需要对环境做一些不同的事情或者 运行 稍微提前提交我们的代码库时,我们可以轻松地禁用自我修复工作,直到我们对事情感到满意,然后再重新- 允许作业将事情放回去或推进 Jenkins 正在使用的标签,现在使用更新的提交。
请注意:我不对任何enterprise/for-pay感兴趣(塔?) 解决方案在这里,只有通过 Ansible 的 OSS 产品可用的解决方案。
好的,我已经配置好我的 Ansible 项目并完美运行,太棒了!看起来像这样:
myansible01.example.com:/opt/ansible/
site.yml
fizz.yml
buzz.yml
group_vars/
roles/
common/
tasks/
main.yml
handlers
main.yml
foos/
tasks/
main.yml
handlers/
main.yml
要在生产环境中运行,我需要完成几件事:
- 我需要能够自动部署对此项目的更改
- 我需要将 playbook 安排为 运行,比如说,每 30 秒一次(以确保所有托管节点始终合规)
所以我的担忧:
- 更改通常如何部署到实时 Ansible 项目?假设项目位于
myansible01.example.com:/opt/ansible
(我的 Ansible 服务器)。仅删除 Ansible 项目根目录 (rm -rf /opt/ansible
) 然后将最新的(包含更改的)Ansible 项目复制回相同位置就足够了吗?如果当我执行此“drop-n-swap”时 Ansible 当前正在 运行ning 任何播放会发生什么? - 看起来商业产品 (Ansible Tower) 内置了调度功能,但 OSS 产品没有。我如何安排 Ansible OSS 在特定时间播放 运行?例如,我可能希望某些播放每 30 秒 运行,以确保节点始终符合要求。
cron
是否足以做到这一点,或者是否有更标准的方法?
对于此类任务,您通常需要诸如 Jenkins 之类的编排引擎来完成您的所有编排工作。
您可以将 Jenkins 设置为 运行 关于计时器或其他事件的剧本,例如推送到 SCM,例如 git。
通常,一项工作从检查我们的 Ansible 代码库的 tag/branch 开始,然后将其应用于我们所有指定的服务器,这样您就可以始终了解正在发生的事情 运行。如果你愿意,这可以简单地成为 master 的头(在 git 术语中)所以它总是应用最新的更改。如果您还想将其连接到您的 SCM 存储库中,那么一个简单的推送将强制将这些更改应用到您的所有服务器。
由于这种即时性,您可能只想考虑在某些测试服务器上执行此操作,然后对它们进行某种形式的测试(例如 Serverspec)以在滚动之前验证您的更改是否正确到生产环境。
Jenkins,默认情况下,不会 运行 一个作业,而同一个作业正在 运行ning(或者如果你的执行程序槽已经用完了),所以你总是可以确定它会仅在 Ansible 运行 完成后才提取回购协议(包括任何更改)。如果您有多个作业 运行ning,您可以使用阻塞来阻止同时作业 运行ning(两者都试图对服务器应用可能不同的配置),但您不必担心新工作开始并将回购拉入已经 运行 的工作中,因为 Jenkins 将这些工作分成单独的工作空间。
我们使用 Jenkins 来针对我们的环境手动 运行s Ansible,但我们也有一个 "self healing" Jenkins 作业,它只是 运行s 我们的 Ansible 代码库的标记提交环境,迫使它进入幂等状态以防止配置的自然漂移。当我们需要对环境做一些不同的事情或者 运行 稍微提前提交我们的代码库时,我们可以轻松地禁用自我修复工作,直到我们对事情感到满意,然后再重新- 允许作业将事情放回去或推进 Jenkins 正在使用的标签,现在使用更新的提交。