如何替换 Ansible 变量值中的几个字符?

How to replace several characters in an Ansible variable's value?

我有一个名为 joomlaversion 的变量,我使用它 json_query。 joomlaversion 的值是 4.0.2 但我试图用破折号交换点所以它变成 4-0-2

如何在此 ansible 变量值中用点替换破折号?

我正在使用 Ansible 2.9.6

这是我试过的。

---
- name: Download JSON content
  uri:
    url: https://api.github.com/repos/joomla/joomla-cms/releases
    return_content: yes
  register: jsoncontent

- name: Get latest version of Joomla from the tag using contains
  set_fact:
          joomlaversion: "{{ jsoncontent.json | to_json | from_json |json_query(jmesquery)|json_query(jmesquery2) }}"
  vars:
            jmesquery: "[? (draft==`false` && prerelease==`false`)]"
            jmesquery2: "[?name.contains(@, 'Joomla! 4')].tag_name|[0]"

  
- name: Replace the dots with dashes in Joomla version
  set_fact: 
          joomlaversion2: "{{ joomlaversion }} | replace('.', '-')"      
          #joomlaversion2: '{{ joomlaversion | regex_findall("\."),("\-") }}'
      
      

它不是将点更改为破折号,而是附加 | replace('.','-') 到变量值上,所以它变成“4.0.2 | replace ('.', '-')”

也许我可以使用 https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#manipulating-strings

中提到的过滤器

如果我可以使用 split(".") 拆分它,然后再加入它?

If I could split it using split(".") then join it again afterwards perhaps?

你完全可以做到!

例如:

- set_fact:
    joomlaversion2: "{{ joomlaversion.split('.') | join('-') }}"

或者,使用 regex_replace,这将找到一个模式并将其替换为连字符。

# since . matches any char, we need to escape it with \
- set_fact:
    joomlaversion2: "{{ joomlaversion | regex_replace('\.', '-') }}"

您必须添加 {{ }} 和转义。与 \:

- set_fact:
    joomlaversion: "4.0.2"
- set_fact:
    joomlaversion2: "{{ joomlaversion | regex_replace('\.', '-') }}"

- debug:
    var: joomlaversion2

结果:

ok: [localhost] => {
    "joomlaversion2": "4-0-2"
}