What is the equivalent of Puppet's `unless` in Ansible?

I think what you're looking do is this:

- name: get vhosts
  command: rabbitmqctl list_vhosts
  register: vhosts
  changed_when: false

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: "'/sensu' not in vhosts.stdout"

Re: #3 register does not create a file. If you're capturing the output of rabbitmqctl list_vhosts via register, the contents will be as valid as the system's current state.


The problem is the line when: rabbitmqctl list_vhosts | grep sensu. It is not possible to use bash here.

You need to put the rabbitmqctl list_vhosts | grep sensu in a separate task and register the result to use it in the when clause. You can use not filter to get unless like behavior.

Something like this should work:

- name: Get rabbitmq vhosts.
  command: rabbitmqctl list_vhosts | grep sensu
  register: rabbitmq_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: not 'sensu' in rabbitmq_vhosts.stdout

The Get rabbitmq vhosts. in this example will always be executed. The add vhost sensu only if the string sensu is not in the registered rabbitmq_vhosts.

Consult the documentation on conditionals and jinja filters for more information.