Как отсортировать номера версий в Ansible - PullRequest
0 голосов
/ 03 января 2019

Я создаю Ansible playbook, в котором я хочу сделать резервную копию базы данных на случай, если мне потребуется обновить программное обеспечение.Для этого я хочу сравнить самый высокий номер версии с номером версии, которая установлена.Если последняя версия выше установленной, я создам резервную копию базы данных.

Однако проблема в том, что я не могу найти хороший способ сортировки номеров версий в Ansible.Стандартный фильтр сортировки сортирует по строкам, а не по номерам / версиям.

Вот что я сейчас делаю:

- name: Get package version
  yum:
    list: package
  register: software_version

- name: Read which version is installed and available
  set_fact:
    software_version_installed: "{{ software_version | json_query(\"results[?yumstate=='installed'].version\") | sort | last }}"
    software_version_available: "{{ software_version | json_query(\"results[?yumstate=='available'].version\") | sort | last }}"

- name: Backup old database file on remote host
  copy:
    src: "{{ software.database_path }}"
    dest: "{{ software.database_path }}_{{ ansible_date_time.date }}_v{{ software_version_installed }}"
    remote_src: yes
  when: software_version_installed is version(software_version_available, "<")

Книга воспроизведения выше работает, пока номера версий остаются под ней.число 10 (например, 1.2.3, но не 1.10.1), поскольку сортировка выполняется как строка.Когда номер версии должен быть отсортирован, например, 1.2.3 и 1.10.1, он будет использовать 1.2.3 в качестве последней версии.

Чтобы показать проблему:

- name: Read which version is installed and available
  set_fact:
    software_versions: [ "2.5.0", "2.9.0", "2.10.0", "2.11.0" ]

- name: Debug
  debug:
    var: software_versions | sort

TASK [grafana : Debug]**********************************
ok: [localhost] => {
    "software_versions | sort": [
        "2.10.0",
        "2.11.0",
        "2.5.0",
        "2.9.0"
    ]
}

Кто-нибудь знаетхороший способ сортировки номеров версий в Ansible?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Теперь это решено по-другому. Вместо сортировки версий я сравнил текущую версию со всеми доступными версиями.

  • Я начал с установки переменной обновления в false
  • Далее я сравнил установленную версию со всеми доступными версиями
  • Если установлена ​​версия> текущая версия, установите для переменной обновления значение true

Задача, выполняющая резервное копирование, будет выполняться, только если переменная обновления имеет значение true.

- name: Get package version
  yum:
    list: package
  register: software_version

- name: Read which version is installed and available
  set_fact:
    software_update: false
    software_version_installed: "{{ software_version | json_query(\"results[?yumstate=='installed'].version\") | last }}"
    software_version_available: "{{ software_version | json_query(\"results[?yumstate=='available'].version\") }}"

- name: Check if upgrade is needed
  set_fact:
    software_update: true
  when: software_version_installed is version(item, "<")
  with_items: "{{ software_version_available }}"

- name: Backup old database file on remote host
  copy:
    src: "{{ software.database_path }}"
    dest: "{{ software.database_path }}_{{ ansible_date_time.date }}_v{{ software_version_installed }}"
    remote_src: yes
  when: software_update
0 голосов
/ 03 января 2019

Я не могу подтвердить ваш опыт, что:

сортировка выполняется как строка.

См. Пример ниже

  vars:
    version_installed: "1.10.1"
    versions:
      - "1.1.3"
      - "1.2.3"
      - "1.7.5"
      - "1.10.7"
  tasks:
    - debug: msg="{{ item }} is newer than {{ version_installed }}"
      loop: "{{ versions }}"
      when: item is version(version_installed, '>')

> ansible-playbook test-versions.yml | grep msg
"msg": "1.10.7 is newer than 1.10.1"
...