问题描述
在使用salt-stack时,想知道在复制文件时是否可以在include_pat中使用捕获组。他希望能够实现类似以下的操作:
copy_template:
file.recurse:
- name: '{{ service_path }}\$1'
- template: jinja
- include_pat: E@^(.*)\.template$
- source: {{ pillar['locations']['systemtoolsfolder'] }}
解决方案
请注意以下操作注意版本差异及修改前做好备份。
根据回答中的解释,Saltstack使用基于Python的re.match对象进行正则表达式匹配,支持捕获组。但是,在- include_pat
字段中无法将捕获组的值传递给- name
,因为- name
字段从未被re.match
对象处理过。即使被处理,变量作用域也会阻止您在re.match
调用之间共享捕获组。
解决这个问题的方法有以下几种:
1. 将- source
中的所有文件从myfile.conf.template
重命名为myfile.conf
。
2. 使用cmd.run
执行批处理文件进行重命名,并在file.recurse
中添加onchanges
,指向之前的事件,以防止它每次运行时都写出.template
文件。还要确保在cmd.run
中使用require
和onchanges
引用copy_template
。
这种方法的副作用是,您将无法更新jinja模板。您只能在第一次部署时使用它们,除非首先删除已有的模板文件,然后重新编写和复制源文件。
- 对于每个模板文件,使用
file.managed
。
以下是示例代码:
copy_template1:
file.managed:
- name: '{{ service_path }}\template1.conf'
- template: jinja
- source: {{ pillar['locations']['systemtoolsfolder'] }}\template1.conf.template
copy_template2:
file.managed:
- name: '{{ service_path }}\template2.conf'
- template: jinja
- source: {{ pillar['locations']['systemtoolsfolder'] }}\template2.conf.template
...以此类推
在上面的示例中,我们使用file.managed
为每个模板文件创建了一个任务。您可以根据需要添加更多的copy_template
任务。
请注意,这种方法需要为每个模板文件编写单独的任务,可能会增加代码量。但是,它可以确保您能够正确地复制文件并去除扩展名。
希望这些解决方案能够帮助到您!
正文完