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.