0
votes

I have a playbook with this structure:

---
- hosts: foo-servers
  roles:
    - foo_setup
  become: yes
  tags: tweaks

- hosts: bar-servers
  roles:
    - bar_setup
  become: yes
  tags: tweaks

[a few more server groups with a similar pattern]

I have a somewhat similar feature to deploy in all servers but each server group has it's own small differences, so I need to keep separate roles for each group.

I also want to run just a select group of tasks from each role, the ones tagged 'tweaks', in all hosts.

And all hosts should be run with raised privileges, but that is not true for all playbooks, so I want that setting to apply just to this playbook (no global vars).

I would like to move all the repeated parameters - become: yes and tags: tweaks outside of host: plays where they will be indicated to apply to all roles bellow. Something to the effect of

--
- all_hosts_this_playbook:
  become: yes
  tags: tweaks

- hosts: foo-servers
  roles:
    - foo_setup

- hosts: bar-servers
  roles:
    - bar_setup

I suppose this is possible in the command line. Like ansible-playbook setup_tweaks.yml --tags "tweak" --become? But is there a playbook equivalent? I'd rather have these in the file than in the command line, where I often forget to add stuff.

And looping doesn't work...

ERROR! 'loop' is not a valid attribute for a Play

- name: Make tweaks in many servers
  become: yes
  tags: tweaks
  hosts: "{{ item.host }}"
  roles:
    - "{{ item.role }}"
  loop:
    - { host: 'foo-servers', role: 'foo_setup' }
    - { host: 'bar-servers', role: 'bar_setup' }

I also want to add post_tasks: to be run in all servers (maybe they also need to be tagged?):

post_tasks_all_hosts:
- name: Upgrade system
  apt:
  autoremove: yes
  autoclean: yes
  update_cache: yes
  upgrade: dist
  tags: tweaks

- name: Reboot
  shell: sleep 2 && reboot
  async: 3
  poll: 0
  tags: tweaks

Is it possible to define playbook-wide pre_tasks or post_tasks?

Here Ansible: How to declare global variable within playbook? it is indicated that one 'cannot define a variable accessible on a playbook level', but in my case it's not variables - it's task parameters and post_tasks:.

Maybe the parameters and the 'pre/post tasks' are different problems with different solutions, but I decided to ask in the same place because they both fall on the same category of parameters that I'd like to set for the whole playbook, outside of host: plays.

1

1 Answers

0
votes

Q: "I suppose this is possible in the command line. Like ansible-playbook setup_tweaks.yml --tags "tweak" --become? But is there a playbook equivalent?"

A: No. There is no such playbook equivalent.


--tags

only run plays and tasks tagged with these values

versus tag inheritance ?

Adding tags: to a play, or to statically imported tasks and roles, adds those tags to all of the contained tasks...When you apply tags: attributes to structures other than tasks, Ansible processes the tag attribute to apply ONLY to the tasks they contain. Applying tags anywhere other than tasks is just a convenience so you don’t have to tag tasks individually.

Details

In the play below tag "tweaks" is added to all of the contained tasks

- hosts: foo-servers
  roles:
    - foo_setup
  tags: tweaks

The command below selects only tasks tagged "tweaks"

ansible-playbook setup_tweaks.yml --tags "tweak"

Q: "Is it possible to define playbook-wide pre_tasks or post_tasks?"

A: No. It's not possible. The scope of pre/post_tasks is the play.