为什么我的Ansible剧本总是返回'错误'?

时间:2016-01-25 17:27:32

标签: bash shell ansible ansible-playbook

尝试运行剧本时,我总是收到错误。我不明白为什么会收到错误。

我的手册

- 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}

为什么会发生?

1 个答案:

答案 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'\"}"