如何在 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]:
...
根据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]:
...