Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。 </blockquote> 话接前文,我们继续来总结一些常用的过滤器。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #在调用shell模块时,如果引用某些变量时需要添加引号,则可以使用quote过滤器代替引号</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #示例如下,先看示例,后面会有注解</span></div> </div> <div class=""> <div><span class="enlighter-text"> - shell: </span><span class="enlighter-s0">"echo {{teststr | quote}} > /testdir/testfile"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">"a\nb\nc"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #上例中shell模块的写法与如下写法完全等效</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #shell: "echo '{{teststr}}' > /testdir/testfile"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #没错,如你所见,quote过滤器能够代替引号</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #上例中,如果不对{{teststr}}添加引号,则会报错,因为teststr变量中包含"\n"转义符</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #ternary过滤器可以实现三元运算的效果 示例如下</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如下示例表示如果name变量的值是John,那么对应的值则为Mr,否则则为Ms</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #简便的实现类似if else对变量赋值的效果</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug: </span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ (name == 'John') | ternary('Mr','Ms') }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name: </span><span class="enlighter-s0">"John"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #basename过滤器可以获取到一个路径字符串中的文件名</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{teststr | basename}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">"/testdir/ansible/testfile"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #获取到一个windows路径字符串中的文件名,2.0版本以后的ansible可用</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{teststr | win_basename}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">'D:\study\zsythink'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #dirname过滤器可以获取到一个路径字符串中的路径名</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{teststr | dirname}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">"/testdir/ansible/testfile"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #获取到一个windows路径字符串中的文件名,2.0版本以后的ansible可用</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{teststr | win_dirname}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">'D:\study\zsythink'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #将一个windows路径字符串中的盘符和路径分开,2.0版本以后的ansible可用</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{teststr | win_splitdrive}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">'D:\study\zsythink'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #可以配合之前总结的过滤器一起使用,比如只获取到盘符,示例如下</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #msg: "{{teststr | win_splitdrive | first}}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #可以配合之前总结的过滤器一起使用,比如只获取到路径,示例如下</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #msg: "{{teststr | win_splitdrive | last}}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #realpath过滤器可以获取软链接文件所指向的真正文件</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ path | realpath }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: </span><span class="enlighter-s0">"/testdir/ansible/testsoft"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #relpath过滤器可以获取到path对于“指定路径”来说的“相对路径”</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ path | relpath('/testdir/testdir') }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: </span><span class="enlighter-s0">"/testdir/ansible"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #splitext过滤器可以将带有文件名后缀的路径从“.后缀”部分分开</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ path | splitext }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: </span><span class="enlighter-s0">"/etc/nginx/conf.d/test.conf"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #可以配置之前总结的过滤器,获取到文件后缀</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #msg: "{{ path | splitext | last}}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #可以配置之前总结的过滤器,获取到文件前缀名</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #msg: "{{ path | splitext | first | basename}}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #to_uuid过滤器能够为对应的字符串生成uuid</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ teststr | to_uuid }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">"This is a test statement"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #bool过滤器可以根据字符串的内容返回bool值true或者false</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #字符串的内容为yes、1、True、true则返回布尔值true,字符串内容为其他内容则返回false</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ teststr | bool }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> teststr: </span><span class="enlighter-s0">"1"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #当和用户交互时,有可能需要用户从两个选项中选择一个,比如是否继续,</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #这时,将用户输入的字符串通过bool过滤器处理后得出布尔值,从而进行判断,比如如下用法</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #- debug:</span></div> </div> <div class=""> <div><span class="enlighter-c0"> # msg: "output when bool is true"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> # when: some_string_user_input | bool</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #map过滤器可以从列表中获取到每个元素所共有的某个属性的值,并将这些值组成一个列表</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #当列表中嵌套了列表,不能越级获取属性的值,也就是说只能获取直接子元素的共有属性值。</span></div> </div> <div class=""> <div><span class="enlighter-text"> - vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> users:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: tom</span></div> </div> <div class=""> <div><span class="enlighter-text"> age: </span><span class="enlighter-n1">18</span></div> </div> <div class=""> <div><span class="enlighter-text"> hobby:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - Skateboard</span></div> </div> <div class=""> <div><span class="enlighter-text"> - VideoGame</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: jerry</span></div> </div> <div class=""> <div><span class="enlighter-text"> age: </span><span class="enlighter-n1">20</span></div> </div> <div class=""> <div><span class="enlighter-text"> hobby:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - Music</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ users | map(attribute='name') | list }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #也可以组成一个字符串,用指定的字符隔开,比如分号</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #msg: "{{ users | map(attribute='name') | join(';') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #与python中的用法相同,两个日期类型相减能够算出两个日期间的时间差</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #下例中,我们使用to_datatime过滤器将字符串类型转换成了日期了类型,并且算出了时间差</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">'{{ ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 19:00:00" | to_datetime) }}'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #默认情况下,to_datatime转换的字符串的格式必须是“%Y-%m-%d %H:%M:%S”</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如果对应的字符串不是这种格式,则需要在to_datetime中指定与字符串相同的时间格式,才能正确的转换为时间类型</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">'{{ ("20160814"| to_datetime("%Y%m%d")) - ("2012-12-25 19:00:00" | to_datetime) }}'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如下方法可以获取到两个日期之间一共相差多少秒</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">'{{ ( ("20160814"| to_datetime("%Y%m%d")) - ("20121225" | to_datetime("%Y%m%d")) ).total_seconds() }}'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如下方法可以获取到两个日期“时间位”相差多少秒,注意:日期位不会纳入对比计算范围</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #也就是说,下例中的2016-08-14和2012-12-25不会纳入计算范围</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #只是计算20:00:12与08:30:00相差多少秒</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如果想要算出连带日期的秒数差则使用total_seconds()</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">'{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).seconds }}'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如下方法可以获取到两个日期“日期位”相差多少天,注意:时间位不会纳入对比计算范围</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">'{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).days }}'</span></div> </div> <div class=""> <div><span class="enlighter-c0"> ######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用base64编码方式对字符串进行编码</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ 'hello' | b64encode }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用base64编码方式对字符串进行解码</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ 'aGVsbG8=' | b64decode }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #######################################################################</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用sha1算法对字符串进行哈希</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123456' | hash('sha1') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用md5算法对字符串进行哈希</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123456' | hash('md5') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #获取到字符串的校验和,与md5哈希值一致</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123456' | checksum }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用blowfish算法对字符串进行哈希,注:部分系统支持</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123456' | hash('blowfish') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用sha256算法对字符串进行哈希,哈希过程中会生成随机"盐",以便无法直接对比出原值</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123456' | password_hash('sha256') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用sha256算法对字符串进行哈希,并使用指定的字符串作为"盐"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123456' | password_hash('sha256','mysalt') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用sha512算法对字符串进行哈希,哈希过程中会生成随机"盐",以便无法直接对比出原值</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123123' | password_hash('sha512') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #使用sha512算法对字符串进行哈希,并使用指定的字符串作为"盐"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123123' | password_hash('sha512','ebzL.U5cjaHe55KK') }}"</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #如下方法可以幂等的为每个主机的密码生成对应哈希串</span></div> </div> <div class=""> <div><span class="enlighter-c0"> #有了之前总结的过滤器用法作为基础,你一定已经看懂了</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{ '123123' | password_hash('sha512', 65534|random(seed=inventory_hostname)|string) }}"</span></div> </div> </div> </div> 这篇文章就总结到这里,快动手实践一下吧~ 转载自朱双印日志https://www.zsythink.net/archives/2885 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏