尝试运行剧本时,我总是收到错误。我不明白为什么会收到错误。
我的手册
- hosts: 127.0.0.1
gather_facts: no
connection: local
tasks:
#Call ansible module "userinfo" with parameter "username="
- name: 'Ansible module in shell'
action: userinfo username=ansible
register: userInfoVariable
- name: 'Abort execution if user does not exist'
fail: msg="User does not exist"
when: userInfoVariable.isUserExist == False
- name: 'Execute task if user exist'
#action: someaction
shell: echo 'User exist - Replace shell with your action here.'
register: userExist
when: userInfoVariable.isUserExist == True
- debug: var=userExist
我想将此shell脚本作为模块运行
#!/bin/bash
source ${1}
if id -u $username >/dev/null 2>&1; then
isUserExist="True"
else
isUserExist="False"
fi
echo "changed=True msg=OK isUserExist='$isUserExist'"
这是运行剧本后的结果
18:14:38-admin@serv17:~/ans-playbooks$ ansible-playbook test-cust-module.yml
PLAY [127.0.0.1] **************************************************************
TASK: [Ansible module in shell] ***********************************************
failed: [127.0.0.1] => {"failed": true, "parsed": false}
changed=True msg=OK isUserExist='True'
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/admin/test-cust-module.retry
127.0.0.1 : ok=0 changed=0 unreachable=0 failed=1
我的脚本基于此输出运行
changed=True msg=OK isUserExist='True'
但预计不会出现此错误
failed: [127.0.0.1] => {"failed": true, "parsed": false}
为什么会发生?
答案 0 :(得分:2)
"parsed": false
表示Ansible无法解析模块的输出。失败的原因是输出始终是一个JSON字符串。来自模块开发的common-pitfalls部分:
您也不应该在模块中执行此操作:
print "some status message"
因为输出应该是有效的JSON。
模块不能在标准错误上输出任何内容,因为系统会将标准错误与标准错误合并,并阻止JSON解析。捕获标准错误并将其作为标准输出中的JSON中的变量返回是很好的,事实上,它是如何实现命令模块的。
如果模块返回stderr或者无法生成有效的JSON,则实际输出仍将显示在Ansible中,但该命令将不会成功。
因此,您需要更改上一个echo
以输出有效的JSON字符串。像这样:
echo "{\"changed\": true, \"msg\": \"OK\", \"isUserExist\": \"'$isUserExist'\"}"