Thanks Brian Coca!
I fixed the issue by updating my custom module as follow:
#!/usr/bin/python
import json
import commands
import re
def get_ansible_private_ipv4_address():
iprex = "(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])"
output = commands.getoutput("""/sbin/ifconfig |grep "Link encap" |awk
'{print $1}' |grep -wv 'lo'""")
nics = output.split('\n')
for i in nics:
ipaddr = commands.getoutput("""/sbin/ifconfig %s |grep -w "inet addr"
|cut -d: -f2 | awk '{print $1}'""" % (i))
if re.match(iprex,ipaddr):
ansible_private_ipv4_address = ipaddr
return ansible_private_ipv4_address
def main():
global module
module = AnsibleModule(
argument_spec = dict(
get_facts=dict(default="yes", required=False),
),
supports_check_mode = True,
)
ansible_facts_dict = {
"changed" : False,
"ansible_facts": {
}
}
if module.params['get_facts'] == 'yes':
ansible_private_ipv4_address = get_ansible_private_ipv4_address()
ansible_facts_dict['ansible_facts']['ansible_private_ipv4_address'] =
ansible_private_ipv4_address
print json.dumps(ansible_facts_dict)
from ansible.module_utils.basic import *
from ansible.module_utils.facts import *
main()
On Friday, December 19, 2014 11:35:27 AM UTC+8, Dong Guo wrote:
>
> Hi gentlemen,
> We are using the Ansible to manage many servers, and we like the dry run
> mode which with parameters "--check" and "--diff". We always run with these
> parameters first to verify that if the changes will be made correctly.
> The customized facts are very helpful, to generate some dynamic facts. But
> the trouble is, when we ran with "--check", ansible skipped the customized
> module.
> So we can't use the dry run to check before we push if there are some
> customized facts used in templates files.
> Is there a way to fix this or work around?
>
> Here are the detailed informations:
>
> [root@idc1-server1 ansible]# cat roles/myfacts/tasks/main.yml
> ---
> - name: run myfacts module to get customized facts
> myfacts: get_facts=yes
>
> - name: update file with the customized facts
> template: src=myfacts.txt.j2 dest=/tmp/myfacts.txt
>
> [root@idc1-server1 ansible]# cat roles/myfacts/templates/myfacts.txt.j2
> ansible_private_ipv4_address : {{ ansible_private_ipv4_address }}
>
> [root@idc1-server1 ansible]# cat library/heylinux/myfacts
>
> #!/usr/bin/python
>
> import sys
> import json
> import shlex
> import commands
> import re
>
> def get_ansible_private_ipv4_address():
> iprex = "(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])"
> output = commands.getoutput("""/sbin/ifconfig |grep "Link encap" |awk
> '{print $1}' |grep -wv 'lo'""")
> nics = output.split('\n')
> for i in nics:
> ipaddr = commands.getoutput("""/sbin/ifconfig %s |grep -w "inet addr"
> |cut -d: -f2 | awk '{print $1}'""" % (i))
> if re.match(iprex,ipaddr):
> ansible_private_ipv4_address = ipaddr
> return ansible_private_ipv4_address
>
> ansible_facts_dict = {
> "changed" : False,
> "ansible_facts" : {
> }
> }
>
> args_file = sys.argv[1]
> args_data = file(args_file).read()
>
> arguments = shlex.split(args_data)
> for arg in arguments:
> if "=" in arg:
> (key, value) = arg.split("=")
> if key == "get_facts" and value == "yes":
> ansible_private_ipv4_address = get_ansible_private_ipv4_address()
>
> ansible_facts_dict['ansible_facts']['ansible_private_ipv4_address'] =
> ansible_private_ipv4_address
>
> print json.dumps(ansible_facts_dict)
>
>
> [root@idc1-server1 ansible]# cat myfacts.yml
> ---
> - hosts: all
> roles:
> - myfacts
>
> [root@idc1-server1 ansible]#ansroot myfacts.yml -i hosts.idc1 --limit
> idc1-server1
> PLAY [all]
> ********************************************************************
>
> GATHERING FACTS
> ***************************************************************
> ok: [idc1-server1]
>
> TASK: [myfacts | run myfacts module to get customized facts] **************
> ok: [idc1-server1]
>
> TASK: [myfacts | update file with the customized facts]
> *********************
> changed: [idc1-server1]
>
> PLAY RECAP
> ********************************************************************
> idc1-server1 : ok=3 changed=1 unreachable=0
> failed=0
>
> [root@idc1-server1 ansible]#ansroot myfacts.yml -i hosts.idc1 --limit
> idc1-server1 --check --diff
> PLAY [all]
> ********************************************************************
>
> GATHERING FACTS
> ***************************************************************
>
> ok: [idc1-server1]
>
> TASK: [myfacts | run myfacts module to get customized facts] **************
> skipping: [idc1-server1]
>
> TASK: [myfacts | update file with the customized facts]
> *********************
> fatal: [idc1-server1] => {'msg': "One or more undefined variables:
> 'ansible_private_ipv4_address' is undefined", 'failed': True}
> fatal: [idc1-server1] => {'msg': "One or more undefined variables:
> 'ansible_private_ipv4_address' is undefined", 'failed': True}
>
> FATAL: all hosts have already failed -- aborting
>
> PLAY RECAP
> ********************************************************************
> to retry, use: --limit @/root/myfacts.retry
>
> idc1-server1 : ok=1 changed=0 unreachable=1
> failed=0
>
--
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/54ae0617-dbbf-44ee-991e-142f243be60a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.