这是我的剧本
---
- name: This is a hello-world example
hosts: localhost
vars:
mystr: "I.To.Be.war"
tasks:
- name: Hi
debug:
msg: "{{ mystr.split('.') | first | trim }}"
输出:
I
trim
过滤器是为了去掉变量末尾的\r\n
,以防它有。
但是,我希望有一个通用的解决方案,应该在分割定界符的最后一个元素之前打印所有内容,即:
.
。
预期输出:
I.To.Be
注意:我不想要像
"{{ mystr.split('.')[0][1][2] }}"
这样的解决方案,因为它本质上不是通用的。
trim
过滤器将
map
$ ansible localhost -m debug \
-a "msg={{ (mystr.split('.') | map('trim'))[:-1] | join('.') }}" \
-e "mystr=I.to.be.war"
localhost | SUCCESS => {
"msg": "I.to.be"
}
或者,您可以使用正则表达式来匹配字符串的第一部分
$ ansible localhost -m debug \
-a 'msg={{ mystr | regex_replace("^(.*)\\.[^.]*$", "\\1") }}' \
-e "mystr=I.to.be.war"
localhost | SUCCESS => {
"msg": "I.to.be"
}
由于您的要求似乎是获取不带扩展名的文件名,请注意有一个额外的 Jinja 过滤器,
splitext
,专用于此:
地点、任务
- debug:
var: "'I.To.Be.war' | splitext | first | trim"
会给你期望的
ok: [localhost] =>
'''I.To.Be.war'' | splitext | first | trim': I.To.Be
虽然过滤器 splitext 实际上返回一个元组,但比常规
split
更方便:
ok: [localhost] =>
'''I.To.Be.war'' | splitext | trim': ('I.To.Be', '.war')
要创建一个目录作为 Ansible 任务,而不在变量的路径中定义子文件夹:
- name: "Create folder"
ansible.builtin.file:
path: '{{ sample_variable_name_from_group_vars_all | regex_replace("^(.*)\\.[^.]*$", "\\1") }}'
state: directory
请注意,此示例有一个文件夹
group_vars
,其中包含一个名为 all
的文件
以及内部的变量,例如:
---
sample_variable_name_from_group_vars_all: /var/www/mywebsite/subfolder
任务将创建目录:
/var/www/mywebsite