2015-11-04 35 views
1

我只是想循环一个字符串列表并替换文本。但是,当我这样做:如何将jinja2过滤器应用于安全列表项目?

---- 
- hosts: all 
    tasks: 
    - debug: msg= {{ item | replace('a','b') }} 
    with_items: 
     - 'apple' 
     - 'banana' 
     - 'cookie' 
     - 'dad' 

输出只是

ok: [host] => (item=apple) => { 
    "item": "apple", 
    "msg": "" 
} 
ok: [host] => (item=banana) => { 
    "item": "banana", 
    "msg": "" 
} 
ok: [host] => (item=cookie) => { 
    "item": "cookie", 
    "msg": "" 
} 
ok: [host] => (item=dad) => { 
    "item": "dad", 
    "msg": "" 
} 

我期待字母“A”与“B”被替换的所有实例。我知道它的作品,如果我只使用{{'a'|替换( 'A', 'B')}}。那么列表处理有什么不同呢?

我想要做的是解析一个文件,对某些行上的内容进行一些操作,然后根据操作内容执行一个命令。

我可以很容易地在bash脚本中完成所有操作,但是想知道如何在安全的脚本中执行此操作。

回答

2

你是真的接近它的工作。

首先,debug稍微挑剔。如果在调试行上有jinja代码,它必须位于msg=参数内,并且它不会显示在“任务名称”行上。所以,“苹果”和“香蕉”在第一行看起来总是如此。

其次,重要的是要正确引用事情。如果您引用了{{jinja}}或删除了该空间,它将会起作用。换句话说:

# bad 
msg= {{jinja}} 
# good 
msg={{jinja}} 
msg="{{jinja}}" 

这是使您的代码正常工作所必需的唯一更改。下面的代码:

- hosts: all 
    tasks: 
    - debug: msg={{ item | replace('a','b') }} 
    with_items: 
     - 'apple' 
     - 'banana' 
     - 'cookie' 
     - 'dad' 

而这里的输出:

TASK: [debug msg={{ item | replace('a','b') }}] ******************************* 
ok: [localhost] => (item=apple) => { 
    "item": "apple", 
    "msg": "bpple" 
} 
ok: [localhost] => (item=banana) => { 
    "item": "banana", 
    "msg": "bbnbnb" 
} 
ok: [localhost] => (item=cookie) => { 
    "item": "cookie", 
    "msg": "cookie" 
} 
ok: [localhost] => (item=dad) => { 
    "item": "dad", 
    "msg": "dbd" 
} 
+1

我以为我的报价也试了一下,结果发现,当我这样做,我仍然有后味精=的空间,所以'味精= “{{item | replace('a','b')}}”'也不起作用。谢谢! – EvilAmarant7x