Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。 </blockquote> 前一篇文章中,我们总结了一些常用小技巧,这篇文章继续。 <h2 id="wznav_0">小技巧:向列表中追加项</h2> 在某些场景下,我们需要在剧本运行的过程中,向列表中加入指定的值,也就是说,我们需要利用task在list中加入新元素,那么我们该怎样实现呢?方法很简单,利用python中列表合并的特性,即可在ansible运行时,对list追加新元素,先来看一个小示例。 在python中,我们可以直接将两个列表相加,这样两个列表会合并成一个列表,我们在ansible中也可以这样做,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> l1:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> l2:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - a</span></div> </div> <div class=""> <div><span class="enlighter-text"> - b</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> l3: </span><span class="enlighter-s0">"{{ l1 + l2 }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: l3</span></div> </div> </div> </div> 如上例所示,我们定义了两个列表变量,l1和l2,然后在tasks中,使用”set_fact”模块,设置了l3变量,l3变量的值为l1和l2相加后的结果,这其实就是利用了python中列表合并的方法,在python中,我们可以使用加号将两个列表合并成一个列表,所以,执行上例playbook,debug模块的输出的结果如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"l3"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-n1">1</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">2</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 如上述信息所示,l3这个列表其实就是l1和l2两个列表合并后的结果,其实,我们可以利用列表合并的这一特性,在列表中追加元素,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist + ['a'] }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 如上例所示,当我们想要向tlist列表追加新元素’a’时,只需要先将字符串’a’变成一个列表,然后利用加号,将tlist列表和[‘a’]列表合并,再将合并后的结果赋值给tlist变量,即可实现我们想要的效果,那么执行上例playbook,debug模块的输出信息如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-n1">1</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">2</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 正如我们所愿,新元素’a’追加到了tlist列表中。 其实,我们也可以使用jinja2的语法,完成上述追加元素的过程,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{% set tlist = tlist + ['a'] %}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 执行上例playbook,也可以实现完全相同的效果,jinja2的语法在前文中已经总结过,此处不再赘述。 在python中,使用列表的extend()函数,也可以实现列表合并的效果,与使用”+”的效果完全相同,比如,将列表A和列表B合并,可以使用A.extend(B),在ansible中,我们也可以这样干,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist.extend([3,'a']) }}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 说到extend()函数,用过python的小伙伴可能会联想到另外一个函数,append()函数,append()函数可以直接在列表中追加元素,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist.append('a') }}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 细心如你一定发现了,当使用append函数时,我们并没有将’a’转换成列表,而是直接将字符串’a’追加到了tlist列表中,执行上例playbook,输出如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-n1">1</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">2</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 你一定看出了append函数和extend函数的区别,没错,extend函数操作的两个对象必须都是列表,而append函数只是单纯的将一个对象当做新元素追加到列表中,这个新元素可以时数值或者字符串,也可以是一个列表,或者字典,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist.append(['a','b']) }}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 执行上例playbook,debug模块输出如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-n1">1</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">2</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> <h2 id="wznav_1">小技巧:在列表中插入项</h2> 刚才一直在聊怎样向list中追加元素,追加的元素总是在列表的最后,但是有时,我们想要在列表的指定位置中插入新元素,该怎么办呢?聪明如你,一定已经想到了,既然追加元素能够利用python中的函数,那么插入元素肯定也可以使用同样的套路啊,没错,我们一起来看一个小示例。 我们可以利用python的insert()函数,在list的指定位置插入新元素,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist.insert(1,'a') }}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 上例表示,在tlist列表的索引1位置插入元素’a’,索引从0开始(0表示列表的第一项,索引可以为负数,为-1时表示列表中倒数第二个位置),执行上例playbook,debug模块的输出信息如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=</span><span class="enlighter-n1">11</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=a</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"a"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=</span><span class="enlighter-n1">2</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=</span><span class="enlighter-n1">11</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> <h2 id="wznav_2">小技巧:从列表中删除项</h2> 当我们需要在ansible中删除list中的元素时,有哪些小技巧可以使用呢?其实大致的思路与上文并没有什么不同,无非是利用python中的函数,但是,删除时有一些特殊的注意点,所以需要更加灵活一点,先来看一些小示例吧。 我们可以利用python的pop()函数,根据指定的索引删除元素。 但是需要注意,在python中,pop()函数会根据索引删除元素的同时,将被删除的元素值作为返回值,示例如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'a'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">3</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</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">"{{tlist.pop(2)}}"</span></div> </div> </div> </div> 上例中,我们使用pop函数删除了tlist列表中的第三个元素(索引为2),也就是元素’a’,执行上例playbook,会发现debug模块的输出信息就是被删除的元素’a’,输出如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"a"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 如你所见,pop()函数在删除元素的同时,会将删除的元素值作为返回值,所以,我们并不能生搬硬套上文中的套路,如果生搬硬套上文中的套路,得到的结果并不是我们想要的,你可以按照上文的套路尝试一下,就会明白为什么不行了,所以,我们需要变通一下,变通后的写法如下: 利用pop()函数删除列表中指定位置的元素 <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">2</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'a'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">3</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ [ tlist.pop(2),tlist ][1] }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 如上例所示,我们先利用pop()函数删除了列表中指定位置的元素,然后将”pop()函数的返回值”和”删除指定元素后的列表”组成了一个新的大列表,并且获取到了新的大列表中索引为1的元素(即删除指定元素后的列表),并且将这个删除元素后的列表通过set_fact模块赋值给了原来的列表变量,从而实现了我们的目的,上例debug模块的输出信息如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-n1">11</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">2</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-n1">3</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 我们可以利用python的remove()函数,根据指定的值删除元素(第一个与指定值匹配的元素会被删除),示例如下 <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'a'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">3</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist.remove('b') }}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 如上例所示,我们想要删除tlist列表中元素值为’b’的元素,于是,我们在remove函数中指定的值为’b’,执行上例playbook,debug模块的输出信息如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=</span><span class="enlighter-n1">11</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=a</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"a"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=b</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"b"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">(</span><span class="enlighter-text">item=</span><span class="enlighter-n1">3</span><span class="enlighter-g1">)</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-n1">3</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 如你所见,tlist中有两个元素的值都为’b’,但是只有第一个’b’被删除了,因为remove函数只会删除第一个匹配到的项,需要注意,使用这种方法删除元素时,如果指定的要删除的元素并不存在于列表中,则会报错。 正如刚才所说,remove函数只会删除第一个匹配到的项,于是,我使用了一个笨办法,利用jinja2的for循环,删除列表中所有匹配到的项,示例playbook如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'a'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-n1">11</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'a11'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'1a'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'11'</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{%for i in tlist%}{% if 11 in tlist%}{{tlist.remove(11)}}{%endif%}{%endfor%}{{tlist}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 上例中,结合jinja2语法中的for循环和if判断,循环的删除了列表中所有的数值为11的元素,执行上例playbook,debug模块的输出信息如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a11"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"1a"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"11"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 如你所见,由于最后一个元素”11″是字符串类型,而我们的匹配条件是匹配数字类型的11,所以最后一个元素”11″并没有被匹配到,也就没有被删除。 当我在网络上借鉴别人的做法时,我发现了如下一种写法,如下写法也可以删除列表中的元素,示例如下: 注:如下写法只适合所有元素都是字符串类型的列表,而且,如下写法可以通过正则表达式,删除掉所有匹配的元素。 <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'11'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'1a'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'1b'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'c'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'a1c'</span></div> </div> <div class=""> <div><span class="enlighter-text"> - </span><span class="enlighter-s0">'b1'</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist | reject('search','1') | list }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> </div> </div> 上例表示,删除tlist列表中所有包含字符’1’的元素,执行上例playbook,debug输出信息如下: <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"c"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 从输出结果可以看出,所有包含字符’1’的元素都被删除了。 上例playbook中,<span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cDovL2ppbmphLnBvY29vLm9yZy9kb2NzLzIuMTAvdGVtcGxhdGVzLyNidWlsdGluLWZpbHRlcnM=" target="_blank"><i data-feather="external-link"></i>reject</a></span>是jinja2中的一个内建的filter,<span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly9kb2NzLmFuc2libGUuY29tL2Fuc2libGUvbGF0ZXN0L3VzZXJfZ3VpZGUvcGxheWJvb2tzX3Rlc3RzLmh0bWwjdGVzdGluZy1zdHJpbmdz" target="_blank"><i data-feather="external-link"></i>search</a></span>是ansible实现的一个tests,list也是一个过滤器,上例通过将它们结合的方式,删除了列表中所有符合条件的元素,使用这种方法有个前提条件,就是列表中的所有元素都必须是字符串,当列表中的所有元素都是字符串时,使用这种方法,可以通过正则表达式灵活的删除元素,比如,删除所有’1’开头的元素,如下: <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">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-g1">[</span><span class="enlighter-s0">'11'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'b'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'1a'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'1b'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'c'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'a1c1'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'b11'</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> tlist: </span><span class="enlighter-s0">"{{ tlist | reject('search','^1') | list }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: tlist</span></div> </div> <div class=""> <div><span class="enlighter-text">上例playbook执行后,debug输出如下:</span></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"tlist"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"c"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"a1c1"</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"b11"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 如你所见,所有以字符’1’开头的元素都被删除了,很方便吧,快动手试试吧。 其实,上文中总结的小技巧,无非是将一些零散的知识点灵活的组合在一起罢了,比如filter、tests、在ansible中使用python的特性、jinja2的语法等等,这些知识我们在前文中都总结过,你肯定不会陌生的。 之前有个朋友留言,问了一个问题: 目标主机有8台,现在需要获取这8台主机上的某个fact(同一个fact),怎样通过循环,将这8台主机的fact的值写入到一个列表中。 我觉得这个问题就可以使用到上文的小技巧来解决,我给出的代码如下: <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">- hosts: 8hostsgroup</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testarr: </span><span class="enlighter-g1">[]</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testarr: </span><span class="enlighter-s0">"{{ testarr + [hostvars[item].ansible_uptime_seconds] }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> with_items: </span><span class="enlighter-s0">"{{play_hosts}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> run_once: </span><span class="enlighter-k1">true</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">"{{ testarr }}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> run_once: true</span></div> </div> </div> </div> 上例中获取到fact信息是ansible_uptime_seconds,你也可以改成你想要获取的fact信息。 这篇文章总结了一些小技巧,利用这些小技巧,可以在playbook运行的过程中,对列表追加元素、插入元素、或者删除元素,文章就先写到这里,希望能够对你有所帮助~ 转载自朱双印日志https://www.zsythink.net/archives/3282 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏