Como limpar itens de funções que não são mais usadas em um servidor?

15

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/nginxe 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/nginxdiretó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 nginxclasse 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?

Antonis Christofides
fonte
1
As perguntas hipotéticas não estão realmente no tópico aqui, eu acho, embora sua pergunta em si não seja sem mérito. Em vez de "vamos fingir ..." reformule e diga, por exemplo, "No fantoche, posso alterar uma função de servidor e desinstalar o nginx que foi instalado anteriormente, alterando ensure => present para o ensure => absentque também ... Como fazer o mesmo com o ansible" etc. Idealmente com um exemplo de qualquer coisa que você já tentou.
HBruijn
2
Eu diria que o Ansible não é realmente projetado para esse tipo de coisa. É direcionado a servidores descartáveis ​​e reproduzíveis. Se você não deseja mais que uma máquina seja um servidor da Web, basta limpá-la (ou encerrá-la se for uma instância da nuvem) em vez de redirecioná-la.
ceejayoz
@ceejayoz o máximo que eu li sobre Ansibles está em Orson Cartão Scott jogo de Ender & Sequals, mas o que você diz faz muito sentido em orquestração de nuvem
HBruijn
@ceejayoz: Atualmente, não uso o Ansible para configuração de vários servidores, mas para configurar pequenos servidores autônomos. Eu acho que esse é um uso válido. Portanto, um servidor pode ter o nginx + django + PostgreSQL. Se mais tarde eu decidir colocar o nginx ou o nginx + django em outro lugar, acabar com o servidor inteiro e precisar recuperar o PostgreSQL do backup pareceria um valor ótimo (sem mencionar o tempo de inatividade).
Antonis Christofides

Respostas:

10

Com o Ansible, você realmente não faria isso de maneira diferente da que faria com o Puppet.

No seu exemplo, onde você definiria

class { 'nginx':
  ensure => absent,
}

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_stateque aceita os valores installede absent.

Nas funções tasks/main.yml, o autor da função pode ter algo parecido com ..

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

..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 nginxcom outra função dentro dela, chamada uninstalled. Você pode então fazer:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

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.

Nick Groenen
fonte
1
Embora tecnicamente você também possa passar argumentos diretamente para as funções, eu recomendaria o uso da função aninhada. Eu acharia realmente estranho ver em um manual um papel que será desinstalado na execução do manual, pois nas variáveis ​​definidas como tal. Tê-lo explícito através da função aninhada parece muito mais limpo. Tecnicamente, é possível passar argumentos para o papel ( - { 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.
bogdan.mustiata
O que você precisa fazer para algo como roles: -nginx/uninstalledtrabalhar? 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.
aggregate1166877
1

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=absentpara garantir que um determinado pacote não esteja instalado no seu servidor. Além disso, o aptmódulo possui um purge=yesparâ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.

Mxx
fonte
Para adicionar a isso, estou apostando que a maioria das peças nesse papel poderia ter sido state=absentadicionada. 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.
Christopher Karel