替换模块中的正则表达式过滤器用于ansible

时间:2018-11-29 18:29:55

标签: regex amazon-web-services ansible pcre

试图以正则表达式替换正则表达式,以进行自动缩放。 在我的CFT中,我具有以下映射:

  DevRegionSettings:
    us-east-1:
    primaryZone: us-east-1a
    # secondaryZone: us-east-1b

    # autoscale is wrong at point of instantiation
    amiAutoscale: ami-234sefsrwerwer21
    amiDB:        ami-12313123
    amiCoord:     ami-12312312
    amiWeb:       ami-13123123
    amiWorker:    ami-12312312

我只想用在角色中较早发现的最新ami替换amiAutoscale的值。

我是一个正则表达式菜鸟,无法一生解决这个问题。 在这个线程中正在使用一些正则表达式: Regex to match key in YAML

但是仍然不能让它做我想做的事:(

任何帮助将不胜感激!

我运行的ansible任务如下:

- name: Replacing ami in the Dev Cloudformation Template
  replace:
    regexp: '(^\s*(?P<key>\w+_amiAutoscale):\s*(?P<value>\d+))'
    replace: "{{ latest_ami.image_id }}"
    path: "$path_to_cft.yaml"

3 个答案:

答案 0 :(得分:0)

正则表达式有几个问题:

  • # File: app/_config/content.yml MyPage: extensions: - RemoveContentExtension -第\w+_amiAutoscale行在amiAutoscale之前没有amiAutoscale: ami-234sefsrwerwer21
  • _-(?P<value>\d+)不是数字序列。

这对我有用,但是可能过于开放:ami-234sefsrwerwer21

示例:https://regex101.com/r/76VGlJ/1

答案 1 :(得分:0)

- name: Replacing ami in the Dev Cloudformation Template
  replace:
   regexp: '(^\s*(?P<key>amiAutoscale):\s*(?P<value>.+))'
   replace: "{{ latest_ami.image_id }}"
   path: "$path_to_cft.yaml"

答案 2 :(得分:0)

您的正则表达式不匹配,因为正则表达式期望匹配1+个单词字符,然后紧跟数据中不存在的起始空白字符\w+_之后的下划线^\s*

此外,在命名的捕获组(?P<value>\d+)中,您匹配的1个以上数字与ami-234sefsrwerwer21不匹配

对于示例数据,您可能还会做的是仅使用两个捕获组,并在第二个组中使用character class来指定允许匹配的内容:

^\s*(?P<key>amiAutoscale)\s*:\s*(?P<value>[\w-]+)

Regex demo