ansible中常用的正则匹配
2017-01-19 10:54
183 查看
本文主要介绍ansible中需要使用正则的模块和关键字,replace模块、 regex_replace和lineinfile模块等。
Tips:此处的run_once关键字配合delegate_to表示这个task只在delegate_to后面指定的ip上执行一次,不在-l和hosts指定的机器上执行;如果指定ip连不上的话,才会在hosts机器上执行一次。如果去掉run_once的话,表示task会在指定ip和默认hosts上都执行一遍。
这边官网给的示例解释的很清晰,我直接贴出来了,链接在此:
总结一下,对于不太会用正则的菜鸟(比如我),要多写playbook试试,比如replace模块官网给出的示例那边没有注释,试试就知道匹配修改了什么,自己动手,丰衣足食哈!
1、replace模块
主要用正则表达式匹配到相应字符串并进行替换。主要使用的选项是regex和replace,下面举一些例子。#test文档 wahhh.csv: userId=tmajkshfkljadfsjkvsd, selfCode=jasdgfjklasdfgajjsghdf,test=jksdagvasdv,asjdgfjsadvgblasfd, fieldId=abtmsadfasjk_tmjsdfladf_tmjsagflsjdaf_tmjasdf,wahahahah_tm
#将跟在’ 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选项内容。#将zabbix_agentd.conf中以Server=开头和ServerActive=开头的行替换成line内容 - name: change zabbix_agent config lineinfile: dest: /etc/zabbix/zabbix_agentd.conf regexp: "{{ item.regexp }}" line: "{{ item.line }}" with_items: - { regexp: '^Server=',line: 'Server=zbx-vip' } - { regexp: '^ServerActive=',line: 'ServerActive=zbx-vip' }
4、jinja中的正则
这边使用match和search关键字,匹配比较简单,用来when判断非常方便,直接贴一下官网代码和链接。vars: url: "http://example.com/users/foo/resources/bar" tasks: - debug: "msg='matched pattern 1'" when: url | match("http://example.com/users/.*/resources/.*") - debug: "msg='matched pattern 2'" when: url | search("/users/.*/resources/.*") - debug: "msg='matched pattern 3'" when: url | search("/users/")
总结一下,对于不太会用正则的菜鸟(比如我),要多写playbook试试,比如replace模块官网给出的示例那边没有注释,试试就知道匹配修改了什么,自己动手,丰衣足食哈!
相关文章推荐
- 比较常用的几个正则表达式(匹配数字)
- 正则表达式(一):php常用的正则匹配
- 正则匹配 常用提取正则
- 正则匹配常用案例
- 常用正则表达式匹配
- 常用正则匹配
- 常用的匹配正则表达式和实例
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- 常用正则匹配表达式
- 常用的匹配正则表达式和实例
- Python正则表达式的常用匹配用法
- 正则表达式学习笔记--常用匹配
- 常用正则匹配符号
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- C++常用正则表达式匹配
- 常用的匹配正则表达式和实例
- php常用的正则匹配
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- 正则匹配中文以及一些常用正则表达式
- 常用正则表达式大全!(例如:匹配中文、匹配html)