由于这根本不是有效的YAML,但是你想把它编辑为YAML,你应该把它变成有效的YAML。如果你关闭错误,你可能不会拥有YAML编辑模式的所有优势。
如果saltstate允许你更改block_start_string
和variable_start_string
jinja2使用你可以将{%
更改为#%
(或###%
,如果#%
和###%
自然出现在你的来源),并且还将{{
更改为<{
(或<<{
,你明白了)。如果您直接调用jinja2,那么您将传递给FireSystemLoader
:block_start_string='<{'
和variable_start_string='#%'
如果以上是可能的,那么您必须只更改输入文件一次,使用编辑器执行此操作。
如果你无法控制saltstate来做理智的事情,你仍然没有陷入困境,但你必须使用Python,ruamel.yaml
和一些支持包做更多的事情(免责声明:我是这些包的作者)。安装时间:
pip install ruamel.yaml[jinja2] ruamel.std.pathlib
然后在编辑之前运行程序:
from ruamel.yaml import YAML
from ruamel.std.pathlib import Path
yamlj2 = YAML(typ='jinja2')
yamlrt = YAML()
yaml_flow_style = YAML()
yaml_flow_style.default_flow_style = True
in_file = Path('init.sls')
backup_file = Path('init.sls.org')
in_file.copy(backup_file)
data = yamlj2.load(in_file)
with in_file.open('w') as fp:
# write the header with info needed for revers
fp.write('# ruamel.yaml.jinja2: ') # no EOL
yaml_flow_style.dump(yamlj2._plug_in_jinja2, fp)
yamlrt.dump(data, fp)
它会更改有问题的jinja2序列,并添加一行标题注释以及用于文件的实际模式。然后,您应该能够编辑init.sls
文件而不会收到所有这些错误。
在调用saltstate之前,请运行以下命令:
from ruamel.yaml import YAML
from ruamel.std.pathlib import Path
in_file = Path('init.sls')
yamlj2 = YAML(typ='jinja2')
yamlrt = YAML()
yamlnort = YAML(typ='safe')
with in_file.open() as fp:
yamlj2._plug_in_jinja2 = yamlnort.load(fp.readline().split(':', 1)[1])
data = yamlrt.load(fp)
yamlj2.dump(data, in_file)
如果你有多个这些文件,你可能想从sys.argv [1]中获取你的文件名。实际上,您可能会从第二个Python程序中调用salstate程序(即解码并运行)。