The playbook looks like:
- hosts: all tasks: - name: "run on all hosts,1" shell: something1 - name: "run on all hosts,2" shell: something2 - name: "run on one host, any host would do" shell: this_command_should_run_on_one_host - name: "run on all hosts,3" shell: something3
I know with command line option --limit
, I can limit to one host, is it possible to do it in playbook?
For such requirements where we need one tasks to run only once on a batch of hosts and we will be running that from Ansible controller node, we have feature parameter named run_once. When we have this parameter mentioned in a task, that task will run only once on first host it finds despite the host batch.
The easiest way to run only one task in Ansible Playbook is using the tags statement parameter of the “ansible-playbook” command. The default behavior is to execute all the tags in your Playbook with --tags all .
You can also limit the hosts you target on a particular run with the --limit flag. Negated limit. Note that single quotes MUST be used to prevent bash interpolation.
Ansible command limit option Using the --limit parameter of the ansible-playbook command is the easiest option to limit the execution of the code to only one host. The advantage is that you don't need to edit the Ansible Playbook code before executing to only one host.
For any host (with defaults it will match the first on the list):
- name: "run on first found host" shell: this_command_should_run_on_one_host run_once: true
For a specific host:
- name: "run on that_one_host host" shell: this_command_should_run_on_one_host when: ansible_hostname == 'that_one_host'
Or inventory_hostname
(hostname as defined in the Ansible inventory) instead of ansible_hostname
(hostname as defined on the target machine), depending on which name you want to use.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With