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
文件中存在一些细微的文本差异(例如 True
与 1
,缺少默认值的键),如果例如存储库已启用 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
我想使用 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
文件中存在一些细微的文本差异(例如 True
与 1
,缺少默认值的键),如果例如存储库已启用 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