【问题标题】:How can I lookup properties in a slurped file?如何在 slurped 文件中查找属性?
【发布时间】:2020-07-18 05:48:06
【问题描述】:

根据ansible文档,我可以使用slurp来读取远程文件。

我有一个远程主机上的 java 属性文件,我想 slurp,所以我做了:

- name slurp xyz properties
  slurp:
    src: /some/path/on/the/remote/my.properties
  register: myprops

- debug:
    msg: "{{ myprops['content'] | b64decode }}"

如果我这样做,我会得到内容。

现在我想在 ansible 中使用该内容。例如。通过lookup。像这样的:

{{lookup('somePropertyInPropertiesFile', myprops['content'])}}

但这不起作用,因为查找模块只允许在文件中查找。

如何将 slurped 文件传递​​给查找?

我正在使用 ansible 2.9.9

【问题讨论】:

    标签: ansible ansible-facts


    【解决方案1】:

    鉴于 ansible 查找在控制主机上工作,您还可以使用 fetch 模块获取文件 from remote to local。然后使用ini查找从属性文件中读取特定属性。

    我无法测试代码,但类似下面的代码应该可以工作。

    - name: Fetch my properties
      fetch:
        src: /some/path/on/the/remote/my.properties
        dest: /tmp/
        flat: yes
    
    - debug: 
        msg: "content is {{ lookup('ini', 'content type=properties file=/tmp/my.properties') }}"
    

    flat: yes 将复制 /tmp 下的文件,而不在给定的目标目录中创建具有主机名的目录,这是默认行为。如果您只有一个主机或者不关心文件是否被覆盖,这可能会很有用。

    【讨论】:

    • 谢谢,我希望我可以只使用 slurp 并省略一个临时文件,因为远程文件可能包含安全敏感信息。因此,我只想在 ansible 执行期间将其保存在内存中。
    【解决方案2】:

    Moon的回答是正确的,但是我想补充更多关于java属性文件的细节。

    似乎ansible只能处理简单的java属性文件,例如:

    user.name=robert
    user.pass=somerandompassword
    

    但 java 属性文件格式也允许值跨越多行,例如

    targetCities=\
        Detroit,\
        Chicago,\
        Los Angeles
    

    当你有这样的条目时,ansible 不会正确解析它们。 Ansible 的结果是:

    ok: [..............] => {
        "msg": "content is \\\nDetroit,\\\nChicago,\\\nLos Angeles"
    }
    

    但是 java Properties 文档说:

    属性是按行处理的。线有两种,自然线和逻辑线。自然行定义为由一组行终止符(\n 或 \r 或 \r\n)或流的末尾终止的字符行。自然行可以是空行、注释行,或者包含全部或部分关键元素对。 逻辑行包含关键元素对的所有数据,可以通过转义行终止符跨多个相邻的自然行展开 反斜杠字符的序列。

    这样

    targetCities=\
        Detroit,\
        Chicago,\
        Los Angeles
    

    应该等价于

    targetCities=Detroit,Chicago,Los Angeles
    

    上述情况并非如此。

    编辑

    可惜有些属性文件,比如tomcat的catalina.properties,根本无法解析。

    fatal: [..............]: FAILED! => {"msg": "An unhandled exception occurred while running 
    the lookup plugin 'ini'. Error was a <class 'ConfigParser.ParsingError'>, original 
    message: File contains parsing errors: <???>\n\t[line 35]: u'org.apache.jasper.,org.apache.naming.,org.apache.tomcat.\\r\\n'\n\t[line 110]:
    ...
    

    【讨论】:

    • 是的,基本上= 之后的任何内容都被解析为带有字符转义的字符串。如果是多行,则还添加回车,就好像它是多行 yaml 字符串一样。作为一种解决方法,可以使用替换过滤器replace('\\\n', '') 替换转义的反斜杠和换行符。不是那么优雅,但我猜会做这项工作。
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多