Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ansible playbook - does include_role and delegate_to work together

Tags:

ansible

Does include_role and delegate_to work together in Ansible 2.9 as I'm trying to execute the following playbook by running a role and delegating it to host 2 (code below)?

Ansible playbook

- name: top level playbook
  hosts: ["host1", "host2"]
  connection: local
  gather_facts: true
  ignore_errors: no
  tasks:
    - set_fact:
        playbook_dir: /Users/OneDrive 
        validation_overall: 'pass'
        result: {}
        all_hosts: "{{ ansible_play_hosts }}"

    - name: import hostvars
      include_vars:
        dir: '{{ playbook_dir }}/test_env_vars/hostvars'
        files_matching: '{{ inventory_hostname }}.*'

    - name: initialise required input variables
      set_fact:
        input_interfaces: "{{ e_input_interfaces }}"  

    # delegate role to host2
    - name: "call validate_rtr_state role with host '{{ansible_hostname}}' for hosts in '{{ansible_play_hosts}}'"
      include_role:
        name: validate_rtr_state
        tasks_from: cisco-ios-xr_ping.yml
      apply:
        delegate_to: "{{all_hosts[1]}}"
      loop: "{{ansible_play_hosts}}"
      loop_control:
        loop_var: all_hosts[1]

The error msg I receive is as follows:

ERROR! conflicting action statements: apply, include_role

The error appears to be in '/home/bbann/Ansible-Networking/ha_failover_top_level_reload.yml': line 46, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

    # delegate role to tusredrweca908
    - name: "call validate_rtr_state role with host '{{ansible_hostname}}' for hosts in '{{ansible_play_hosts}}'"
      ^ here

We could be wrong, but this one looks like it might be an issue with missing quotes. Always quote template expression brackets when they start a value. For instance:

with_items:
  - {{ foo }}

Should be written as:

with_items:
  - "{{ foo }}"

Any ideas why this is failing?

like image 960
bbann Avatar asked Sep 16 '25 03:09

bbann


1 Answers

Q: "ERROR! conflicting action statements: apply, include_role"

A: The indentation of apply is wrong. It's a parameter of the task include_role

# delegate role to host2
    - name: "call validate_rtr_state role with host '{{ ansible_hostname }}' for hosts in '{{ ansible_play_hosts }}'"
      include_role:
        name: validate_rtr_state
        tasks_from: cisco-ios-xr_ping.yml
        apply:
          delegate_to: "{{ all_hosts[1] }}"
      loop: "{{ ansible_play_hosts }}"
      loop_control:
        loop_var: all_hosts[1]

(not tested)

There are other weirdos:

  1. loop_var is the name of the 2nd host? i.e. Does the role implement the name of the 2nd host as a variable?

  2. Are there 2 hosts in the play both with connection: local?

  3. Why apply delegate_to: xy instead of delegate_to: xy the task?

like image 165
Vladimir Botka Avatar answered Sep 19 '25 15:09

Vladimir Botka



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!