如何将jinja2过滤器应用于ansible列表项?

时间:2015-11-04 22:31:06

标签: jinja2 ansible

我只想尝试遍历字符串列表并替换文本。但是当我这样做时:

----
- 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' |替换('一个'' B')}}。那么列表处理有什么不同呢?

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

我可以非常轻松地在bash脚本中完成所有操作,但想知道如何/在ansible脚本中是否可行。

1 个答案:

答案 0 :(得分:2)

非常接近让它正常工作。

首先,debug略显挑剔。如果你在调试行上有jinja代码,它必须在msg=参数内,并且它不会显示在“任务名称”行上。所以,“apple”和“banana”在第一行看起来总是那样。

其次,正确引用事物很重要。如果您引用了{{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"
}