Rajesh
(Rajesh)
April 2, 2020, 2:16am
1
Hi All,
I created a custom facts playbook. But I am getting an error when I run. I could not figure out why?
Playbook
name: Create a custom facts file
hosts: database
become: true
become_user: root
gather_facts: true
tasks:
name: Create a custom facts directory
file:
path: /etc/ansible/facts.d
state: directory
name: Create a custom facts
template:
src: templates/custom.fact.j2
dest: /etc/ansible/facts.d/custom.fact
name: Print ansible_local
debug: var=ansible_local
name: Print the custom facts value
debug:
msg: “{{ ansible_local.custom.sample_exam }}”
Template file
[automation@workstation plays]$ cat templates/server_list.j2
{% for host in groups[‘all’] %}
{{ hostvars[host][‘ansible_facts’][‘fqdn’] }}
{% endfor %}
[automation@workstation plays]$
[automation@workstation plays]$ ansible-playbook facts.yml
PLAY [Create a custom facts file] **********************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************
fatal: [ansible5]: FAILED! => {“ansible_facts”: {}, “changed”: false, “failed_modules”: {“setup”: {“ansible_facts”: {“discovered_interpreter_python”: “/usr/libexec/platform-python”}, “cmd”: “/etc/ansible/facts.d/custom.fact”, “failed”: true, “invocation”: {“module_args”: {“fact_path”: “/etc/ansible/facts.d”, “filter”: “*”, “gather_subset”: [“all”], “gather_timeout”: 10}}, “msg”: “[Errno 8] Exec format error: b’/etc/ansible/facts.d/custom.fact’”, “rc”: 8}}, “msg”: “The following modules failed to execute: setup\n”}
PLAY RECAP *********************************************************************************************************************************************************************************************************************************
ansible5 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
[automation@workstation plays]$
racke
(Stefan Hornburg)
April 2, 2020, 5:45am
2
Hi All,
I created a custom facts playbook. But I am getting an error when I run. I could not figure out why?
Hello Rajesh,
if /etc/ansible/facts.d/custom.fact is supposed to be a script it needs executable permissions:
- name: Create a custom facts
template:
src: templates/custom.fact.j2
dest: /etc/ansible/facts.d/custom.fact
mode: 0755
Regards
Racke
Rajesh
(Rajesh)
April 2, 2020, 6:38am
3
Thanks for that. I have modified the playbook as you suggested. The playbook creates the custom file, but still giving the below error.
[automation@workstation plays]$ cat facts.yml
name: Create a custom facts file
hosts: database
become: true
become_user: root
gather_facts: true
tasks:
name: Create a custom facts directory
file:
path: /etc/ansible/facts.d
state: directory
name: Create a custom facts
template:
src: templates/custom.fact.j2
dest: /etc/ansible/facts.d/custom.fact
mode: 0755
name: Output our newly created static fact
debug:
msg: “{{ ansible_local.custom.sample_exam }}”
[automation@workstation plays]$
[automation@workstation plays]$ ansible-playbook facts.yml
PLAY [Create a custom facts file] **********************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [Create a custom facts directory] *****************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [Create a custom facts] ***************************************************************************************************************************************************************************************************************
changed: [ansible5]
TASK [Output our newly created static fact] ************************************************************************************************************************************************************************************************
fatal: [ansible5]: FAILED! => {“msg”: “The task includes an option with an undefined variable. The error was: ‘dict object’ has no attribute ‘custom’\n\nThe error appears to be in ‘/home/automation/plays/facts.yml’: line 18, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Output our newly created static fact\n ^ here\n”}
PLAY RECAP *********************************************************************************************************************************************************************************************************************************
ansible5 : ok=3 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
[automation@workstation plays]$
Rajesh
(Rajesh)
April 4, 2020, 8:18am
4
Could someone help why I am still getting the below error?
Thanks,
Rajesh
The first time you run it, files are not yet in place, so you probably need to regather fact, no ? You can do it with setup:
Regards,
I’ve written a GitHub repo to demo using local_facts here: https://github.com/dmccuk/ansible_local_facts
The bit you need to do is this (which is also part of the demo):
Rajesh
(Rajesh)
April 5, 2020, 6:21am
7
Thanks Dennis. I have modified my playbook as you suggested. But I am still getting the below error.
name: Create a custom facts file
hosts: database
become: true
become_user: root
gather_facts: true
tasks:
name: Create a custom facts directory
file:
path: /etc/ansible/facts.d
state: directory
name: Create a custom facts
template:
src: templates/custom.fact.j2
dest: /etc/ansible/facts.d/custom.fact
mode: 0755
name: local facts
debug: var=ansible_local
notify:
reload facts
name: reload facts
setup: filter=ansible_local
[automation@workstation plays]$ cat templates/custom.fact.j2
[sample_exam]
server_role=mysql
[automation@workstation plays]$ ansible-playbook facts.yml
PLAY [Create a custom facts file] **********************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [Create a custom facts directory] *****************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [Create a custom facts] ***************************************************************************************************************************************************************************************************************
changed: [ansible5]
TASK [local facts] *************************************************************************************************************************************************************************************************************************
ok: [ansible5] => {
“ansible_local”: {}
}
TASK [reload facts] ************************************************************************************************************************************************************************************************************************
fatal: [ansible5]: FAILED! => {“changed”: false, “cmd”: “/etc/ansible/facts.d/custom.fact”, “msg”: “[Errno 8] Exec format error: b’/etc/ansible/facts.d/custom.fact’”, “rc”: 8}
PLAY RECAP *********************************************************************************************************************************************************************************************************************************
ansible5 : ok=4 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Rajesh
(Rajesh)
April 5, 2020, 6:22am
8
Tried that but still not working. Thanks for your help.
try deleting: /etc/ansible/facts.d
and let ansible recreate it. If you still get the same issue (delete /etc/ansible/facts.d again) and try running ansible either as root or with sudo just to rule out permissions.
Hi,
Your fact is simple INI file, not a script which give json output.
Try removing the execution bit on your fact (644 for example)
Info provided here with some 2 mn googling :
https://groups.google.com/forum/#!topic/ansible-project/2JRR8a-K9_8
Regards,
Rajesh
(Rajesh)
April 6, 2020, 11:36am
11
Thanks a lot Jean-Yves. I have changed the mode to 0644 and ran the playbook. It worked fine without any issues. I can’t find good documentation on custom facts. Thanks for your help.
name: Create a custom facts file
hosts: database
become: true
become_user: root
gather_facts: true
tasks:
name: Create a custom facts directory
file:
path: /etc/ansible/facts.d
state: directory
name: Create a custom facts
template:
src: templates/custom.fact.j2
dest: /etc/ansible/facts.d/custom.fact
mode: 0644
name: local facts
debug: var=ansible_local
notify:
reload facts
name: reload facts
setup: filter=ansible_local
[automation@workstation plays]$ ansible-playbook facts.yml
PLAY [Create a custom facts file] **********************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [Create a custom facts directory] *****************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [Create a custom facts] ***************************************************************************************************************************************************************************************************************
ok: [ansible5]
TASK [local facts] *************************************************************************************************************************************************************************************************************************
ok: [ansible5] => {
“ansible_local”: {
“custom”: {
“sample_exam”: {
“server_role”: “mysql”
}
}
}
}
TASK [reload facts] ************************************************************************************************************************************************************************************************************************
ok: [ansible5]
PLAY RECAP *********************************************************************************************************************************************************************************************************************************
ansible5 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Rajesh
(Rajesh)
April 6, 2020, 11:36am
12
Thanks Dennis for your help. Once I changed the mode to “644” as suggested by Jean-Yves, the playbook worked fine.