试图调试我的“正确”脚本 - 我试图尝试一个玩具示例 - 这也不起作用。
echo {\"admin\": \"foo\", \"datacenter\": \"bar\"}
直接运行它的行为符合预期:
%: ./test_inv --host blah
{"admin": "foo", "datacenter": "bar"}
但:
%: ansible blah -i test_inv
ERROR: The file test_inv is marked as executable, but failed to execute correctly. If this is not supposed to be an executable script, correct this with `chmod -x test_inv`.
(我假设我不需要支持 - 这个玩具测试的清单,因为我从来没有以这种方式调用它)
答案 0 :(得分:5)
我假设我不需要支持 - 这个玩具测试的清单,因为我从未以这种方式调用它
这是你的问题。你知道他们对假设的看法吗,对吧?这是一个快速测试你尝试:
创建一个这样的库存文件:
#!/bin/bash
echo "Called as: $*" >> log
if [ "$1" == "--list" ] ; then
echo '{ "localhost" : [ "localhost" ] }'
else
echo '{ "some_variable": "some value" }'
fi
现在运行如下:
$ ansible -i ./hosts -m setup localhost
它应该无错误地运行并显示localhost的所有事实。完成后:
$ cat log
Called as: --list
Called as: --host localhost
因此,ansible调用可执行主机文件两次,一次使用--list
参数,一次使用--host <hostname>
。 (如果您使用主机列表或包含多个主机的组调用ansible,那么将为每个主机使用--host
参数调用该脚本。)
由于当ansible使用--list
参数运行时,您的库存脚本没有返回有效主机列表,因此会产生错误。
答案 1 :(得分:0)
编辑:这个问题最初的引用不正确,因此这个初步答案。一旦引用被修复,问题仍然存在。
当您查看输出时,您会看到报价已从echo
中删除。我认为Ansible只是以非常空间的方式抱怨无效的JSON数据。试着像这样逃避引号:
echo {\"admin\": \"Bob Smith\", \"datacenter\": 1}
编辑:基本上您已编辑到您的问题中。这样做有用吗?