Run an Ansible task only when the hostname contain

2019-03-23 08:16发布

I have multiple tasks in a role as follows. I do not want to create another yml file to handle this task. I already have an include for the web servers, but a couple of our Perl servers require some web packages to be installed.

- name: Install Perl Modules
  command: <command>
  with_dict: perl_modules

- name: Install PHP Modules
  command: <command>
  with_dict: php_modules
  when: <Install php modules only if hostname contains the word "batch">

Host inventory file

[webs]
web01
web02
web03

[perl]
perl01
perl02
perl03
perl-batch01
perl-batch02

标签: ansible
2条回答
劫难
2楼-- · 2019-03-23 09:02

Below should do the trick:

- name: Install PHP Modules
  command: <command>
  with_dict: php_modules
  when: "'batch' in inventory_hostname"

Note you'll have a couple of skipped hosts during playbook run.

inventory_hostname is one of Ansible's "magic" variables:

Additionally, inventory_hostname is the name of the hostname as configured in Ansible’s inventory host file. This can be useful for when you don’t want to rely on the discovered hostname ansible_hostname or for other mysterious reasons. If you have a long FQDN, inventory_hostname_short also contains the part up to the first period, without the rest of the domain.

Source: Ansible Docs - Magic variables and how to access information about other hosts

查看更多
Melony?
3楼-- · 2019-03-23 09:17

You can even filter tasks for hosts of a specific group (not the whole inventory).

The following condition will execute your task - only if an inventory group [perl], has a host name, which includes the sub-string "batch":

 when: "groups['perl'] | select('search','batch') | list"

So if that group does not have a host with that sub-string, then the list is empty, which means false condition.

查看更多
登录 后发表回答