I have a similar issue with a playbook which runs once a day using a cron 
job on the Ansible control host. Probably once a week, I get the follwoing 
error for a random server:

(..)

The following task failed for host ejpdxannnn-mgt.example.com:

 

template:  {"dest": "/tmp/fragments.d/SLES.frag", "src": 
"std-templates/std-playbook-make-inventory-by-os.j2", "group": "admin2", 
"mode": "0400", "owner": "admin2"}

 

with the following message:

 

AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_hostname'

 

A complete dump of the error:

 

{"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict 
object' has no attribute 'ansible_hostname'"}

(..)


Ansible version is 2.0.1.0. The playbook runs on 600 hosts with forks=20. 
The Ansible control host has 16 GB RAM and if I run the playbook manually 
there is no memory shortage (no swapping on Ansible control host) and I can 
not reproduce the error.
It seems that every now and then, Ansible does not gather the facts for all 
600 hosts or the facts get lost on the Ansible control host due to some 
unknown resource constraints. As far as I understand the concept, Ansible
keeps all the facts in the control host's memory while the playbook is run. 
For 600 hosts that is a lot of data.


The playbook is:

admin2@xxxxx:/data/ansible/playbooks> cat 
std-playbook-make-inventory-by-os.yml 
---

- hosts: all
  gather_facts: True 
  tasks:

  - set_fact:
      path_to_fragments: /tmp/fragments.d
      file_inventory: /data/ansible/inventory/inventory.os


- hosts: all[0]
  gather_facts: False
  tasks:
  - name: Remove file ansible host:{{ file_inventory }}
    local_action: file path={{ file_inventory }} state=absent
    changed_when: False

  - name: Remove dir ansible host:{{ path_to_fragments }}
    local_action: file path={{ path_to_fragments }} state=absent
    changed_when: False

  - name: Make dir ansible host:{{ path_to_fragments }}
    local_action: file path={{ path_to_fragments }} state=directory 
mode=0700
    changed_when: False



- hosts: all
  gather_facts: False
  tasks:  

  ##
  ## SLES, Solaris
  ##

  - name: Group server by distribution 
    group_by: key={{ ansible_distribution }}

  ##
  ## SLES-11, SLES-12
  ##

  - name: Group server by distribution, distribution_major_version
    group_by: key={{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}

  ##
  ## SLES-11-4, SLES-12-0
  ##

  - name: Group server by distribution, distribution_major_version, 
ansible_distribution_release 
    group_by: key={{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}-{{ansible_distribution_release}}

  ##  
  ## Solaris-10, Solaris-11.2
  ##  
  - name: Group server by distribution, distribution_version 
    group_by: key={{ ansible_distribution }}-{{ 
ansible_distribution_version }}


#
# For each following statement of type < - hosts: XXXX >, an Ansible group 
[ XXXX ]
# is generated in an single inventory file named 
inventory/{{file_inventory}} 
#

- hosts: SLES
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}]"
     run_once: true
     changed_when: False



- hosts: SLES-12
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}]"
     run_once: true
     changed_when: False



- hosts: SLES-12-0
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}-{{ ansible_distribution_release 
}}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}-{{ansible_distribution_release }}]"
     run_once: true
     changed_when: False



- hosts: SLES-11
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}]"
     run_once: true
     changed_when: False



- hosts: SLES-11-4
  gather_facts: False
  vars:  
    fragment_file: "{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}-{{ ansible_distribution_release 
}}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }} 
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}  
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}-{{ 
ansible_distribution_major_version }}-{{ ansible_distribution_release }}]"
     run_once: true    
     changed_when: False



- hosts: Solaris
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}]"
     run_once: true
     changed_when: False



- hosts: Solaris-11.2
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}-{{ 
ansible_distribution_version }}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}-{{ 
ansible_distribution_version }}]"
     run_once: true
     changed_when: False



- hosts: Solaris-10
  gather_facts: False
  vars:
    fragment_file: "{{ ansible_distribution }}-{{ 
ansible_distribution_version }}.frag"

  tasks:
   - name: Template file {{ path_to_fragments }}/{{ fragment_file }}
     local_action: template 
src=std-templates/std-playbook-make-inventory-by-os.j2 dest={{ 
path_to_fragments }}/{{ fragment_file }} owner=admin2 group=admin2 mode=0400
     run_once: true
     changed_when: False

   - name: Lineinfile header to file {{ path_to_fragments }}/{{ 
fragment_file }}
     local_action: lineinfile dest={{ path_to_fragments }}/{{ fragment_file 
}} insertbefore=BOF line="[{{ ansible_distribution }}-{{ 
ansible_distribution_version }}]"
     run_once: true
     changed_when: False



- hosts: all[0]
  gather_facts: False

  tasks:
  - name: Assemble fragments to file {{ file_inventory }}
    local_action: assemble src={{ path_to_fragments }} dest={{ 
file_inventory }} owner=admin2 group=admin2 mode=0644
    changed_when: False

  - name: Add header block to file {{ file_inventory }} 
    local_action:
      module: blockinfile
      dest: "{{ file_inventory }}"
      state: present
      block: |
       #
       #
       # This file is generated using a cron job and 
playbooks/std-playbook-make-inventory-by-os.yml
       #
       #
      insertbefore: BOF



-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/eb312faf-e412-4bff-a462-374bda7a67f0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to