在salt-stack中如何使用正则表达式的捕获组

34次阅读
没有评论

问题描述

在使用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中使用requireonchanges引用copy_template

这种方法的副作用是,您将无法更新jinja模板。您只能在第一次部署时使用它们,除非首先删除已有的模板文件,然后重新编写和复制源文件。

  1. 对于每个模板文件,使用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任务。

请注意,这种方法需要为每个模板文件编写单独的任务,可能会增加代码量。但是,它可以确保您能够正确地复制文件并去除扩展名。

希望这些解决方案能够帮助到您!

正文完