ansible中常⽤的正则匹配
本⽂主要介绍ansible中需要使⽤正则的模块和关键字,replace模块、 regex_replace和lineinfile模块等。
1、replace模块
主要⽤正则表达式匹配到相应字符串并进⾏替换。主要使⽤的选项是regex和replace,下⾯举⼀些例⼦。
#test⽂档
wahhh.csv:
userId=tmajkshfkljadfsjkvsd, selfCode=jasdgfjklasdfgajjsghdf,test=jksdagvasdv,asjdgfjsadvgblasfd, fieldId=abtmsadfasjk_tmjsdfladf_tmjsagflsjdaf_tmjasdf,wa #将跟在’ userId=’后⾯的tm改成cm,\1表⽰正则中的⼩括号内容。
- replace:
dest: wahhh.csv
regexp: '(userId=)+tm'
replace: '\1cm'
#将以selfCode=开头,第⼀个逗号结尾的字符串中的最后⼀个字符修改为T,此处使⽤?进⾏⾮贪婪匹配。
- replace:
dest: wahhh.csv
regexp: '(selfCode=)(.*?).,'
replace: '\1\2T,'
#将’fileId=’字段的值中的tm全部替换成cm,这边没有⽤正则匹配,⼲脆⽤的shell模块将value取出来替换好了,再replace进去。
- shell: "line=`grep 'fileId=' wahhh.csv`;str1=${line#*fileId=};
str2=`echo $str1 | cut  -d ',' -f 1`; echo ${str2//TM/CM}"
register: fileId
run_once: true
delegate_to: 127.0.0.1
- replace:
dest: wahhh.csv
regexp: '(fileId=).*?,'
replace: '\1{{ fileId.stdout }},'
Tips:此处的run_once关键字配合delegate_to表⽰这个task只在delegate_to后⾯指定的ip上执⾏⼀次,不在-l和hosts指定的机器上执
⾏;如果指定ip连不上的话,才会在hosts机器上执⾏⼀次。如果去掉run_once的话,表⽰task会在指定ip和默认hosts上都执⾏⼀遍。
2、regex_replace
ansible的⼀个关键字,类似于replace模块,更⽅便直接地替换字符串中的匹配内容,可以⽤作变量、判断、template中等等。
这边官⽹给的⽰例解释的很清晰,我直接贴出来了,:
# convert "ansible" to "able"
{{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }}
# convert "foobar" to "bar"
{{ 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }}
# convert "localhost:80" to "localhost, 80" using named groups
{{ 'localhost:80' | regex_replace('^(?P<host>.+):(?P<port>\\d+)$', '\\g<host>, \\g<port>') }}
3、lineinfile模块
对⽂件中的每⼀⾏进⾏增删改操作。这边的正则只要regexp选项为⼀⾏中的部分连续字符,就会进⾏匹配,当然也可以正则精确匹配,然后将正则匹配的那⼀⾏替换为line选项内容。
#将f中以Server=开头和ServerActive=开头的⾏替换成line内容
-name: change zabbix_agent config
regex匹配lineinfile:
dest: /etc/zabbix/f
regexp: "{{ p }}"
line: "{{ item.line }}"
with_items:
- { regexp:'^Server=',line:'Server=zbx-vip' }
- { regexp:'^ServerActive=',line:'ServerActive=zbx-vip' }
4、jinja中的正则
这边使⽤match和search关键字,匹配⽐较简单,⽤来when判断⾮常⽅便,直接贴⼀下官⽹代码和。
vars:
url: "example/users/foo/resources/bar"
tasks:
- debug: "msg='matched pattern 1'"
when: url | match("example/users/.*/resources/.*")
- debug: "msg='matched pattern 2'"
when: url | search("/users/.*/resources/.*")
- debug: "msg='matched pattern 3'"
when: url | search("/users/")
总结⼀下,对于不太会⽤正则的菜鸟(⽐如我),要多写playbook试试,⽐如replace模块官⽹给出的⽰例那边没有注释,试试就知道匹配修改了什么,⾃⼰动⼿,丰⾐⾜⾷哈!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。