如何将 jinja2 过滤器应用于 ansible 列表项?
How to apply jinja2 filter to ansible list items?
我只是想遍历字符串列表并替换文本。但是当我这样做时:
----
- 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 脚本中完成这一切,但想知道 how/if 在 ansible 脚本中是可能的。
您真的即将开始工作。
首先,debug
有点挑剔。如果您在调试行上有 jinja 代码,它必须在 msg=
参数内,并且它不会正确显示在 "task name" 行上。因此,"apple" 和 "banana" 将始终显示在第一行。
其次,正确引用很重要。如果您引用了 {{jinja}}
或删除了 space,它就会起作用。换句话说:
# 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"
}
我只是想遍历字符串列表并替换文本。但是当我这样做时:
----
- 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 脚本中完成这一切,但想知道 how/if 在 ansible 脚本中是可能的。
您真的即将开始工作。
首先,debug
有点挑剔。如果您在调试行上有 jinja 代码,它必须在 msg=
参数内,并且它不会正确显示在 "task name" 行上。因此,"apple" 和 "banana" 将始终显示在第一行。
其次,正确引用很重要。如果您引用了 {{jinja}}
或删除了 space,它就会起作用。换句话说:
# 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"
}