Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ansible dnf module enable Fedora Copr repository

I want to enable a Fedora Copr repository with Ansible. More specifically I want to convert this command:

dnf copr enable ganto/lxd

Using an Ansible command module I overcome this problem but break the task's idempotence (if run again, the role should not make any changes) (changed_when: false is not an option).

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

Also, I tried this:

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

Where I test many variations for the option enablerepo without any success.

Is that possible using the dnf Ansible module (or something else)?

like image 237
tvl Avatar asked Mar 07 '17 14:03

tvl


3 Answers

It is now possible thanks to https://docs.ansible.com/ansible/latest/collections/community/general/copr_module.html

The original snippet using command

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

can be changed to

- name: Enable Fedora Copr for LXD
  community.general.copr:
    name: ganto/lxd
like image 146
FrostyX Avatar answered Oct 10 '22 03:10

FrostyX


You can use creates to make your command idempotent; if the .repo file already exists then the task won't run:

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

(You'd have to check that enabled=1 manually)

$ 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
like image 28
Valeriy Solovyov Avatar answered Oct 10 '22 04:10

Valeriy Solovyov


No, the Ansible dnf module doesn't support enabling Copr repositories.

You can add a task that tests if your Copr repository is already enabled that guards the Copr enable task.

Example:

  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 == ''

Notes:

  • double check the id of your copr repository as it's different from the short name you use to enable it
  • I set warn: no because ansible warns about all dnf commands (because it suggests to use the dnf module, if possible)
  • I set check_mode: no since it's safe to execute it even in --check mode
  • I set changed_when: false because the command doesn't change system state

Alternatively you can add and enable a Copr repository with the yum_repository Ansible module.

Example:

- 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"]

This approximates the effect of the dnf copr enable ganto/lxd call. But there are some minor textual differences in the resulting .repo file (e.g. True vs. 1, keys with default values missing) that would lead to this task reporting changed if e.g. the repository was already enabled with dnf copr.

Also, this arguably has a higher maintenance overhead as one would have to track changes Copr introduces to its .repo files.

like image 29
maxschlepzig Avatar answered Oct 10 '22 04:10

maxschlepzig