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

13

Suponha que eu tenha um host que seja, entre outras coisas, um servidor da web, onde a função Ansible relacionada instale nginx , execute algumas configurações essenciais em /etc/nginx e abra as portas 80 e 443 no firewall. / p>

Em algum momento, eu 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 de [webservers] no inventário deixaria lixo no servidor. Idealmente, gostaria de desinstalar o nginx , remover o diretório /etc/nginx (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 da Web terá algo assim em sua configuração:

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

e tudo o que tenho a fazer é substituir "presente" por "ausente". Se a classe nginx estiver bem escrita, ela irá desfazer as alterações feitas. (Normalmente, um administrador substituirá "presente" por "ausente" e, mais tarde, quando tiver certeza de que todos os hosts afetados desfizeram 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 eu acho que, para o firewall, você nem precisa fazer essa coisa "ausente" acima, o firewall fechará automaticamente de qualquer maneira.

Como posso conseguir essas coisas com o Ansible?

    
por Antonis Christofides 11.07.2014 / 22:22

2 respostas

9

Com o Ansible, você não faria isso de forma diferente de como faria com o Puppet.

No seu exemplo, onde você definiria

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

você está confiando no autor do módulo de fantoche que escreveu o código necessário para lidar com a remoção de tudo. Nem todo módulo de fantoches tem isso.

Da mesma forma, com o Ansible, você pode ter funções que tenham as duas etapas necessárias para instalá-lo e removê-lo. A diferença é 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 levar uma variável nginx_state , que recebe os valores installed e absent .

Na função tasks/main.yml , o autor da função pode ter algo nos moldes de ...

- 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 incluídos condicionalmente.

Funções ansí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, chamada uninstalled . Você poderia então fazer:

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

O Ansible, quando comparado ao Puppet, tem menos regras e diretrizes sobre como as coisas devem ser feitas, então as práticas variam um pouco mais, mas os mesmos conceitos se aplicam.

    
por 12.07.2014 / 17:53
1

Como você tem sua configuração / provisionamento no Ansible, você pode simplesmente eliminar o servidor inteiro, reinstalar / provisionar um novo e ter um bom estado limpo para trabalhar.

Se você realmente quiser "reconfigurá-lo" para outros fins, será necessário criar um novo manual que execute as tarefas de limpeza necessárias.

Até onde eu sei, todos os módulos de empacotamento do Ansible suportam state=absent para garantir que um determinado pacote não esteja instalado em seu servidor. Além disso, o apt module possui o parâmetro purge=yes , que limpará os arquivos de configuração personalizados restantes.

Você também pode criar tarefas para confirmar que a porta 80 é protegida por 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.

    
por 12.07.2014 / 06:27

Tags