Ansible 截断连接字符串

des*_*ing 4 ansible

我正在 Ansible 中生成一个 yaml 模板,我试图截断两个连接的字符串:这里下面的代码不起作用,因为连接没有正确输入 regex_replace 。我只想要前 n 个字符(本例中的前 10 个字符)

通常我可以将这两个组合成一个变量然后做

{{variabel [:10] }}

但在这种情况下我无法做到这一点,因为我正在处理的文件正在与变量结合,然后保存为 yaml 文件......

基本上我想在不首先组合或创建新变量的情况下截断字符串。

- hosts: localhost
  gather_facts: False


  vars:
    foo: "somelongstring"


  tasks:
- name: Display debug output
        debug:
          msg: "{{ foo  + '-moretext' | regex_replace('^.{0,10}', '\\1')  }} "
Run Code Online (Sandbox Code Playgroud)

zig*_*arn 9

要将过滤器或运算符应用于复杂表达式(过滤器序列除外),您必须用括号将其括起来。

因此,要在 1 个操作中截断连接的结果:

msg: "{{ (foo  + '-moretext')[:10] }} "
Run Code Online (Sandbox Code Playgroud)

顺便说一句,还有truncate过滤器

msg: "{{ (foo  + '-moretext') | truncate(10, True, '') }} "
Run Code Online (Sandbox Code Playgroud)

  • 大多数过滤器是 jinja2 内置过滤器:http://jinja.pocoo.org/docs/2.9/templates/#builtin-filters。Ansible 添加的过滤器记录在此处:http://docs.ansible.com/ansible/latest/playbooks_filters.html。您找到的链接很好地总结了所有可用的过滤器。 (2认同)
  • @refriedjello:确实,如果您不指定第四个参数,它似乎不起作用:`leeway` =“仅超出第四个参数中给出的容差范围的长度的字符串将不会被截断...较新的 Jinja2 版本的默认余量为 5,之前为 0" 示例: `ansible localhost -m debug -a "msg={{ '01234' | truncate(4, True, '') }}"` ==> `01234 ` 而 `ansible localhost -m debug -a "msg={{ '01234' | truncate(4, True, '', 0) }}"` ==> `0123` (2认同)