Ansible dnf 模块启用 Fedora Copr 存储库

Ansible dnf module enable Fedora Copr repository

我想使用 Ansible 启用 Fedora Copr 存储库。更具体地说,我想转换这个命令:

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 的许多变体,但均未成功。

是否可以使用 dnf Ansible 模块(或其他模块)?

您可以使用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

不,Ansible dnf 模块不支持启用 Copr 存储库。

您可以添加一个任务来测试您的 Copr 存储库是否已启用,以保护 Copr 启用任务。

示例:

  shell:
      cmd: |
          dnf -C repolist enabled -v  | grep '^Repo-id' | awk ' == "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 存储库的 ID,因为它与您用来启用它的短名称不同
  • 我设置 warn: no 因为 ansible 会警告所有 dnf 命令(因为它建议尽可能使用 dnf 模块)
  • 我设置了 check_mode: no 因为即使在 --check 模式下执行它也是安全的
  • 我设置了changed_when: false因为命令不会改变系统状态

或者,您可以使用 yum_repository Ansible module 添加和启用 Copr 存储库。

示例:

- 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 文件中存在一些细微的文本差异(例如 True1,缺少默认值的键),如果例如存储库已启用 dnf copr.

此外,这可以说具有更高的维护开销,因为人们必须跟踪 Copr 引入其 .repo 文件的更改。

由于 https://docs.ansible.com/ansible/latest/collections/community/general/copr_module.html

现在可以实现了

使用 command

的原始片段
- name: Enable Fedora Copr for LXD
  command: "dnf copr enable -y ganto/lxd"

可以改成

- name: Enable Fedora Copr for LXD
  community.general.copr:
    name: ganto/lxd