从变量创建Ansible本地事实

时间:2016-04-13 21:12:38

标签: automation ansible ansible-2.x

我正在尝试从变量中创建本地事实。

我的事实是:

datadog_http_checks:
  - name : {{ env }} ResourceManager
    url : http://{{ inventory_hostname }}:
    threshold : 5
    window : 5
    timeout : 10

我的任务是:

- include_vars: clouderamanager.yml

- lineinfile: dest=/etc/ansible/facts.d/datadog_http_checks.fact line={{ datadog_http_checks }} create=yes

哪个不会创建本地事实,它会失败并显示以下错误

TASK [hadoop : lineinfile] *****************************************************
fatal: [hmn001.dev.abc.cc]: FAILED! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/xyz/.ansible/tmp/ansible-tmp-1460581285.88-252089462921262/lineinfile\", line 2540, in <module>\r\n    main()\r\n  File \"/home/abc/.ansible/tmp/ansible-tmp-1460581285.88-252089462921262/lineinfile\", line 371, in main\r\n    ins_aft, ins_bef, create, backup, backrefs)\r\n  File \"/home/abc/.ansible/tmp/ansible-tmp-1460581285.88-252089462921262/lineinfile\", line 266, in present\r\n    lines.append(line + os.linesep)\r\nTypeError: can only concatenate list (not \"str\") to list\r\n", "msg": "MODULE FAILURE", "parsed": false}

1 个答案:

答案 0 :(得分:1)

Lineinfile完全按照它的说法执行操作:它会更改文件中的单行。

如果您想创建一个如下的本地事实:

datadog_http_checks:
  - name : {{ env }} ResourceManager
    url : http://{{ inventory_hostname }}:
    threshold : 5
    window : 5
    timeout : 10

然后你需要创建一个如下所示的文件:

[datadog_http_checks]
name={{ env }} ResourceManager
url=http://{{ inventory_hostname }}:
threshold=5
window=5
timeout=10

您可以使用template模块执行此操作,如果您的示例中包含要动态构建的变量,则可以使用Java documentation模块。

在这个确切的场景中虽然我很困惑这是什么好处而不是像你在你的问题中设置变量并使用它而不是模板化本地事实文件然后重新阅读它后面。