我有两个文件,一个是不确定但一致的格式(可能是某种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更容易。)
给定:
- 以下
vars/my_values.yml
变量文件:--- client_host_port: 6000 first_eth_port: 55 this_value_for_stuff: 233 this_value_for_stuff_2: 133
- 以下
templates/my_resultfile.weirdo.j2
模板{% for name, value in my_options.items() %} <{{ "%-25s" | format(name) }} value="{{ value }}"/> {% endfor %}
- 及以下
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"/>