假设我有一个主机,它是一个 Web 服务器,其中安装了相关的 Ansible 角色nginx
,在 中执行一些基本配置/etc/nginx
,并在防火墙中打开端口 80 和 443。
在某些时候,我希望该特定主机不再是 Web 服务器,因为出于某种原因,我将该服务移到了其他地方。只是从[webservers]
库存中移除服务器会在服务器中留下垃圾。理想情况下,我想卸载nginx
、删除/etc/nginx
目录(和一些其他目录),并关闭防火墙中的端口 80 和 443。
在 Puppet 中,我可以做到这一点。作为 Web 服务器的主机将在其配置中具有以下内容:
class { 'nginx':
ensure => present,
}
Run Code Online (Sandbox Code Playgroud)
而我所要做的就是用“缺席”替换“存在”。如果nginx
类编写得很好,它将撤消所做的更改。(通常,管理员会将“present”替换为“absent”,然后,当他确定所有受影响的主机都已撤消配置时,他将从清单中删除该项目。)
更重要的是,我认为Puppet防火墙模块会自动删除清单中再也找不到的防火墙规则;所以我认为,对于防火墙,你甚至不需要做上面那个“缺席”的事情,无论如何防火墙都会自动关闭。
如何使用 Ansible 实现这些目标?
小智 11
使用 Ansible,您真正做到这一点与使用 Puppet 的方式没有任何不同。
在您将设置的示例中
class { 'nginx':
ensure => absent,
}
Run Code Online (Sandbox Code Playgroud)
您依赖于该 puppet 模块的作者编写了必要的代码来处理删除所有内容。不是每个人偶模块都有这个。
类似地,对于 Ansible,您可能拥有具有安装和删除它的必要步骤的角色。区别仅在于如何调用两者。
一种方法可能是所讨论的角色公开一个变量来切换行为。例如,该 nginx 角色可能采用一个变量nginx_state
,该变量采用值installed
和absent
。
在角色的 中tasks/main.yml
,角色作者可能具有以下内容:
- include: install.yml
when: nginx_state|default('present') == "present"
- include: uninstall.yml
when: nginx_state|default('present') == "absent"
Run Code Online (Sandbox Code Playgroud)
..在这两个有条件包含的文件之间拆分相应的安装/卸载逻辑。
Ansible 角色也可以嵌套。作为另一种方法,角色作者可能会提供一个角色,nginx
其中包含另一个角色,称为uninstalled
。然后你可以这样做:
- name: Uninstall nginx
hosts: some_group
roles:
- nginx/uninstalled
Run Code Online (Sandbox Code Playgroud)
与 Puppet 相比,Ansible 可以说关于如何做事的规则和指导方针更少,因此实践中的实践差异更大,但适用相同的概念。
归档时间: |
|
查看次数: |
12089 次 |
最近记录: |