代码之家  ›  专栏  ›  技术社区  ›  Andy Baker

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

  •  1
  • Andy Baker  · 技术社区  · 11 年前

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

     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 回复  |  直到 11 年前
        1
  •  5
  •   Bruce P    11 年前

    我假设我不需要支持这个玩具测试的列表,因为我从未以这种方式调用它

    这是你的问题。你知道他们怎么说假设,对吧?这里有一个快速测试供您尝试:

    创建如下库存文件:

    #!/bin/bash
    
    echo "Called as: $*" >> log
    
    if [ "$1" == "--list" ] ; then
      echo '{ "localhost" : [ "localhost" ] }'
    else
      echo '{ "some_variable": "some value" }'
    fi
    

    现在像这样运行ansible:

    $ ansible -i ./hosts -m setup localhost
    

    它应该运行无错误,并显示本地主机的所有事实。完成后:

    $ cat log
    Called as: --list
    Called as: --host localhost
    

    因此,ansible调用可执行主机文件两次,一次使用 --list 参数,并使用 --host <hostname> 。(如果使用包含多个主机的主机列表或组调用ansible,则脚本将使用 --host 每个主机一次参数)。

    因为当ansible使用 --列表 参数引发错误。

        2
  •  0
  •   Andy Baker    11 年前

    编辑:问题最初有错误的引用,因此给出了最初的答案。一旦报价被修正,问题仍然存在。

    当您查看输出时,您将看到从您的 echo 。我认为Ansible只是以非常空间的方式抱怨无效的JSON数据。试着这样转义引号:

    echo {\"admin\": \"Bob Smith\", \"datacenter\": 1}
    

    编辑:基本上你在问题中编辑了什么。它是这样工作的吗?