Suponha que eu tenha um host que seja, entre outras coisas, um servidor Web, em que a função Ansible relacionada seja instalada nginx
, execute algumas configurações essenciais /etc/nginx
e abra as portas 80 e 443 no firewall.
Em algum momento, quero que esse host em particular não seja mais um servidor Web, porque, por algum motivo, mudei esse serviço para outro lugar. Apenas remover o servidor do [webservers]
inventário deixaria lixo no servidor. Idealmente, eu gostaria de desinstalar nginx
, remover o /etc/nginx
diretório (e alguns outros diretórios) e fechar as portas 80 e 443 no firewall.
No Puppet eu posso fazer isso. Um host que é um servidor web terá algo parecido com isto em sua configuração:
class { 'nginx':
ensure => present,
}
e tudo o que preciso fazer é substituir "presente" por "ausente". Se a nginx
classe for bem escrita, ela desfará as alterações que fez. (Normalmente, um administrador substitui "presente" por "ausente" e, mais tarde, quando tiver certeza de que todos os hosts afetados desfeitaram a configuração, ele removerá o item do manifesto.)
Além do mais, acho que o módulo de firewall Puppet remove automaticamente as regras de firewall que não podem mais ser encontradas no manifesto; então acho que, para o firewall, você nem precisa fazer a coisa "ausente" acima, o firewall será fechado automaticamente de qualquer maneira.
Como posso conseguir essas coisas com o Ansible?
ensure => present
para oensure => absent
que também ... Como fazer o mesmo com o ansible" etc. Idealmente com um exemplo de qualquer coisa que você já tentou.Respostas:
Com o Ansible, você realmente não faria isso de maneira diferente da que faria com o Puppet.
No seu exemplo, onde você definiria
você está confiando que o autor desse módulo fantoche tenha escrito o código necessário para lidar com a remoção de tudo. Nem todo módulo de marionetes tem isso.
Da mesma forma, com o Ansible, você pode ter funções com as etapas necessárias para instalá-lo e para removê-lo. A diferença está apenas em como invocar os dois.
Uma abordagem pode ser aquela em que o papel em questão expõe uma variável para alternar o comportamento. Por exemplo, essa função nginx pode receber uma variável
nginx_state
que aceita os valoresinstalled
eabsent
.Nas funções
tasks/main.yml
, o autor da função pode ter algo parecido com ....com a respectiva lógica de instalação / desinstalação sendo dividida entre esses dois arquivos condicionalmente incluídos.
As funções possíveis também podem ser aninhadas. Como outra maneira de fazer o mesmo, um autor de função pode, por exemplo, fornecer uma função
nginx
com outra função dentro dela, chamadauninstalled
. Você pode então fazer:O Ansible, quando comparado ao Puppet, tem indiscutivelmente menos regras e diretrizes sobre como as coisas devem ser feitas, para que as práticas variem um pouco mais na natureza, mas os mesmos conceitos se aplicam.
fonte
- { role: nginx, state: absent }
), mas isso me parece extremamente detalhado. A única desvantagem da função aninhada que eu vi foi a necessidade de vincular os vars padrão do pai.roles: -nginx/uninstalled
trabalhar? Eu procurei por todo o lado, mas não consigo encontrar nenhuma documentação sobre funções de aninhamento de uma maneira que me permita fazer isso.Como você possui sua configuração / provisionamento no Ansible, você pode simplesmente explodir todo o servidor, reinstalar / provisionar um novo e ter um bom estado conhecido limpo para trabalhar com ele.
Se você realmente deseja "reconfigurá-lo" para outros fins, precisará criar um novo manual que execute as tarefas de limpeza necessárias.
Tanto quanto sei, todos os módulos de empacotamento Ansible suportam
state=absent
para garantir que um determinado pacote não esteja instalado no seu servidor. Além disso, oapt
módulo possui umpurge=yes
parâmetro que limpa todos os arquivos de configuração personalizados restantes.Você também pode criar tarefas para confirmar que a porta 80 está com firewall. No entanto, como você não terá nenhum processo em execução nessa porta, o firewall não fará diferença na segurança do seu servidor.
fonte
state=absent
adicionada. Há uma boa chance de excluir ou desfazer uma boa maioria das alterações de configuração que você fez. Dependendo do tamanho da função, pode ser uma PITA real para testar.