如何在 slurped 文件中查找属性?

How can I lookup properties in a slurped file?

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

我在远程主机上有一个 java 属性文件,我想获取它,所以我这样做了:

- 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 查找工作,您还可以使用 fetch module. Then use ini 查找从属性文件中读取特定 属性 来获取文件 from remote to local

我无法测试代码,但像下面这样的代码应该可以工作。

- 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 下的文件,而不会在给定目标目录中创建带有主机名的目录,这是默认行为。如果您只有一个主机或者不关心文件是否被覆盖,这可能很有用。

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 文档说:

Properties are processed in terms of lines. There are two kinds of line, natural lines and logical lines. A natural line is defined as a line of characters that is terminated either by a set of line terminator characters (\n or \r or \r\n) or by the end of the stream. A natural line may be either a blank line, a comment line, or hold all or some of a key-element pair. A logical line holds all the data of a key-element pair, which may be spread out across several adjacent natural lines by escaping the line terminator sequence with a backslash character .

因此

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]:
...