代码之家  ›  专栏  ›  技术社区  ›  René Link

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

  •  0
  • René Link  · 技术社区  · 5 年前

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

    我在远程主机上有一个java属性文件,我想删除它,所以我做了:

    - name slurp xyz properties
      slurp:
        src: /some/path/on/the/remote/my.properties
      register: myprops
    
    - debug:
        msg: "{{ myprops['content'] | b64decode }}"
    

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

    现在我想在ansible中使用这个词。E、 g.通过 lookup . 像这样:

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

    如何将slurped文件传递给lookup?

    我用的是ansible 2.9.9

    0 回复  |  直到 5 年前
        1
  •  1
  •   Moon    5 年前

    如果在控制主机上进行ansible查找,您还可以获得一个文件 from remote to local 使用 fetch 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

        2
  •  1
  •   René Link    5 年前

    Moon的回答是正确的,但是我想添加更多关于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 文件说明:

    逻辑线 保存一个键元素对的所有数据,可能是 分布在几个相邻的自然线上 逃逸 反斜杠 性格。

    因此

    目标城市=\
    底特律\
    

    应等同于

    targetCities=Detroit,Chicago,Los Angeles
    

    但事实并非如此。

    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]:
    ...
    
    推荐文章