Ansible动态库存脚本的玩具示例?

时间:2015-03-20 09:26:42

标签: ansible

试图调试我的“正确”脚本 - 我试图尝试一个玩具示例 - 这也不起作用。

 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`.

(我假设我不需要支持 - 这个玩具测试的清单,因为我从来没有以这种方式调用它)

2 个答案:

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

编辑:基本上您已编辑到您的问题中。这样做有用吗?