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?


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.