Модуль Ansible dnf включает репозиторий Fedora Copr

Я хочу включить репозиторий Fedora Copr с помощью Ansible. В частности, я хочу преобразовать эту команду:

dnf copr enable ganto/lxd

Используя модуль Ansible command, я преодолеваю эту проблему, но нарушаю идемпотентность задачи (при повторном запуске роль не должна вносить никаких изменений) (changed_when: false не вариант).

- name: Enable Fedora Copr for LXD
  command: "dnf copr enable -y ganto/lxd"

Кроме того, я пробовал это:

- name: Install LXD
  dnf:
    name: "{{ item }}"
    state: latest
    enablerepo: "xxx"
  with_items:
    - lxd
    - lxd-client

Где я безуспешно тестирую множество вариантов варианта enablerepo.

Возможно ли это с помощью модуля Ansible dnf (или чего-то еще)?


person tvl    schedule 07.03.2017    source источник
comment
модуль dnf должен быть идемпотентным   -  person Valeriy Solovyov    schedule 03.09.2017


Ответы (2)


Вы можете использовать creates, чтобы сделать вашу команду идемпотентной; если файл .repo уже существует, задача не запустится:

- name: Enable Fedora Copr for LXD
  command:
      cmd: dnf copr enable -y ganto/lxd
      creates: /etc/yum.repos.d/_copr_ganto-lxd.repo

(Вам придется проверить это enabled=1 вручную)

$ cat /etc/yum.repos.d/_copr_ganto-lxd.repo

[ganto-lxd]
name=Copr repo for lxd owned by ganto
baseurl=https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/fedora-$releasever-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/pubkey.gpg
repo_gpgcheck=0
enabled=1
person Valeriy Solovyov    schedule 03.09.2017
comment
@Dzintars была синтаксическая ошибка, я ее исправил (см. docs. ansible.com/ansible/latest/modules/command_module.html) - person maxschlepzig; 28.03.2020

Нет, модуль Ansible dnf не поддерживает включение репозиториев Copr.

Вы можете добавить задачу, которая проверяет, включен ли уже ваш репозиторий Copr, который защищает задачу включения Copr.

Пример:

  shell:
      cmd: |
          dnf -C repolist enabled -v  | grep '^Repo-id' | awk '$3 == "copr:copr.fedorainfracloud.org:ganto:lxd" {print "enabled"}'
      warn: no
  check_mode: no
  changed_when: false
  register: lxd_copr

- name: Enable Fedora Copr for LXD
  command:
      cmd: dnf -y copr enable ganto/lxd
      warn: no
  when: lxd_copr.stdout == ''

Примечания:

  • дважды проверьте идентификатор вашего репозитория copr, так как он отличается от короткого имени, которое вы используете для его включения.
  • Я установил warn: no, потому что ansible предупреждает обо всех командах dnf (потому что предлагает использовать модуль dnf, если это возможно)
  • Я установил check_mode: no, так как его безопасно выполнять даже в режиме --check
  • Я установил changed_when: false, потому что команда не меняет состояние системы

В качестве альтернативы вы можете добавить и включить репозиторий Copr с помощью модуля yum_repository Ansible. .

Пример:

- name: enable copr
  yum_repository:
      name: "copr:copr.fedorainfracloud.org:{{ item[0] }}:{{ item[1] }}"
      file: "_copr:copr.fedorainfracloud.org:{{ item[0] }}:{{ item[1] }}"
      description: "{{ item[2] }}"
      baseurl: "{{ copr_url }}/results/{{ item[0] }}/{{ item[1] }}/fedora-$releasever-$basearch/"
      gpgkey: "{{ copr_url }}/results/{{ item[0] }}/{{ item[1] }}/pubkey.gpg"
      gpgcheck: yes
      enabled: yes
      skip_if_unavailable: yes
  vars:
      #copr_url: https://copr-be.cloud.fedoraproject.org
      copr_url: https://download.copr.fedorainfracloud.org
  loop:
      - [ganto, lxd, "Copr repo for LXD"]

Это приблизительно соответствует эффекту вызова dnf copr enable ganto/lxd. Но в результирующем файле .repo есть некоторые незначительные текстовые различия (например, True против 1, ключи с отсутствующими значениями по умолчанию), которые могут привести к изменению этого отчета о задаче, если, например. репозиторий уже был включен с dnf copr.

Кроме того, это, вероятно, связано с более высокими накладными расходами на обслуживание, поскольку необходимо отслеживать изменения, которые Copr вносит в свои файлы .repo.

person maxschlepzig    schedule 28.03.2020