Я хочу знать, есть ли способ Ansible (regex_replace), отсекающий номер версии - PullRequest
2 голосов
/ 12 февраля 2020

Есть ли Ansible (regex_replace) способ обрезки номера версии?

Я работаю над установкой сжатого архива. Он находится в каталоге {{HomeDir}} / ms2install .

Имя файла: ms2install_1.16.1.8.tgz

У меня есть оболочка задача, которая извлекает номер версии

# Get the version number from the archive
- name: Get MS2 verion number from the the file list
  shell: "ls -1 {{ HomeDir }}/ms2install | grep \"ms2iinstall_.*tgz\" | cut -d_ -f2 | rev | cut -c5- | rev"
  delegate_to: 127.0.0.1
  register: ms2Num

ms2Num is 1.16.1.8

Я в порядке с использованием команды оболочки здесь, поскольку это не меняет систему и манипуляции со строками в одной команде. Нет, мне нужно только найти 1.16 , чтобы найти каталог в удаленной системе после того, как я распакую архив. Каталог, который я хочу, находится на нескольких уровнях подкаталогов. Я также хочу установить пакеты из правильного каталога.

Я могу извлечь 1.16 с помощью команды simular shell.

# Get the version number from the archive
- name: Get truncated MS2 verion number from the the file list
  shell: "ls -1 {{ HomeDir }}/ms2install | grep \"ms2i_.*tgz\" | cut -d_ -f2 | rev | cut -c5- | rev | | cut -d. -f1-2"
  delegate_to: 127.0.0.1
  register: ms2KurtzNum

Это работает, и я зарегистрировать короткую строку 1.16 .

Я хочу знать, есть ли решение regex_replace для любого из определений. Поэтому создайте новую переменную только с первой частью строки 1.16 . Для регулярного выражения: /(^(\d{1,3}\.\d{1,3}))/g работает, но в Ansible выражение дает подстроку "1.16".

- name: Find version directory
  find:
    paths: "{{ DestDir | join }}/ms2install/patches"
    patterns: "{{ ms2Num.stdout | regex_replace( '([1-9]{1,3}\\.[1-9]{1,3}))' '\\1' ) }}" # <== pattern 1.16
    recurse: yes
    file_type: directory
  register: PatchVersionDir

Существует достаточно различий между bash regex и Ansible regex (Python?), Чтобы расстроить.

Есть ли лучшее решение в Ansible, чем оболочка задача

1 Ответ

1 голос
/ 12 февраля 2020

Q: "Есть ли лучшее решение в Ansible, чем задача оболочки?"

A: Да. Это. Например, задачи ниже (дано my_filename: ms2install_1.16.1.8.tgz)

    - set_fact:
        ms2Num: "{{ (my_filename|splitext).0.split('_').1 }}"
    - set_fact:
        ms2Num_short: "{{ ms2Num.split('.')[:2]|join('.') }}"
    - debug:
        msg:
          - "{{ ms2Num }}"
          - "{{ ms2Num_short }}"

дают

    "msg": [
        "1.16.1.8", 
        "1.16"
    ]
...