Ansible:如何从yaml输入文件中获取值并填充到格式不确定的输出文件中



我有两个文件,一个是不确定但一致的格式(可能是某种html格式…),一个是yaml格式。我希望将yaml文件的值输入到另一个文件中。我已经为yaml输入文件使用了include_vars,并且可以正确地引用/操作它们。输出文件和值替换过程才是问题所在。

总体问题是:在一个可见的剧本中,是否有可能使用像"blockinfile模块"这样的循环?或者"lineinfile module"为两个文件中超过100个值简化此过程?

文件示例:以yaml格式输入文件/变量:

---
client_host_port: 6000
first_eth_port: 55
this_value_for_stuff: 233
this_value_for_stuff_2: 133

不确定/oddhtml格式的输出文件示例:

<client_host_port             value="fillwithyamlfilevalue"/>
<first_eth_port               value="fillwithyamlfilevalue"/>
Purpose: To define for the system the first ethernet port to use.
<this_value_for_stuff         value="fillwithyamlfilevalue"/>
<this_value_for_stuff_2       value="fillwithyamlfilevalue"/>
Note: value 2 is a backup value.

等等,等等等等。在真实的文件中,有数百个值,但每个值都匹配"关键字"。输入文件中定义的值将具有对应的"keyname"在输出文件中。注意,它们在一些值下面也会有一些注释。在这个过程中,这些可以而且应该被忽略。

现在我在"猜测"。要替换的行可能使用基于输入文件中的变量名的正则表达式来完成,但不确定最佳方法是什么。我希望有一种方法来做到这一点与循环,而不是100+任务。
引用输出文件值的最佳方式是什么?只是用某种正则表达式?这并不重要,只要它是一致的和容易使用的。不幸的是,我不能改变输出文件格式,它被一个很久以前制作的程序使用,不容易改变。
任何建议都将受到赞赏,并提前感谢!

(注意,我知道yaml文件关于空白的格式不完全正确,但是ansible仍然可以很好地解析它,并且在理论上使regex更容易。)

给定:

  1. 以下vars/my_values.yml变量文件:
    ---
    client_host_port: 6000
    first_eth_port: 55
    this_value_for_stuff: 233
    this_value_for_stuff_2: 133
    
  2. 以下templates/my_resultfile.weirdo.j2模板
    {% for name, value in my_options.items() %}
    <{{ "%-25s" | format(name) }} value="{{ value }}"/>
    {% endfor %}
    
  3. 及以下my_playbook.yml
    ---
    - hosts: localhost
    gather_facts: false
    tasks:
    - name: load variables from yaml file
    include_vars:
    file: my_values.yml
    name: my_options
    - name: output vars in weirdo format with template
    template:
    src: my_result_file.weirdo.j2
    dest: /tmp/my_result_file.weirdo
    

运行剧本给出:

$ ansible-playbook my_playbook.yml 
PLAY [localhost] *************************************************************
TASK [load variables from yaml file] *****************************************
ok: [localhost]
TASK [output vars in weirdo format with template] *******************************
changed: [localhost]
PLAY RECAP *******************************************************************
localhost: ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

并产生以下模板文件:

$ cat /tmp/my_result_file.weirdo 
<client_host_port          value="6000"/>
<first_eth_port            value="55"/>
<this_value_for_stuff      value="233"/>
<this_value_for_stuff_2    value="133"/>

最新更新