On 17/04/16 12:56, Phonthip Namkaew wrote:
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'"}
Remenber that all variables staring with 'ansible_*' are gathered at the beginning of a play section in a playbook. Your playbook contains several plays, each play will initiate fact gathering by using the setup module, unless the play section specifies no fact gathering, as you do. If memory serves me well, the default behaviour for fact gathering between plays in one playbook changed a while ago. I use the 'smart' gathering, so new hosts get facts gathered, while old ones don't

[defaults]
gathering = smart

http://docs.ansible.com/ansible/intro_configuration.html#gathering



(..)


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.

I am guessing and presuming you are doing this for speed.
It might be worth looking at setting up your ansible host with fact caching in redis

For a redis setup that would be as following
[defaults]
fact_caching = redis
fact_caching_timeout = 3600
fact_caching_connection = localhost:6379:0

I have used this in the case of a +/- 500 host setup with a mgmt host of 4GB works fine, and reduces ram, while speeding up most operations

If you want them on your disk you could setup file based caching, however for 600 hosts that might be slow.
For a file setup that would be as following
[defaults]
fact_caching = jsonfile
fact_caching_timeout = 3600
fact_caching_connection = /tmp/ansible/facts/cache





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
Here is you problem


   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]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[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
<https://groups.google.com/d/msgid/ansible-project/eb312faf-e412-4bff-a462-374bda7a67f0%40googlegroups.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.

--
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/5714E18F.6000702%40vantosh.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to