语境
我正在使用 Ansible 通过win_chocolatey模块设置 Windows 服务器。
在我的group_vars/windows_servers.yml
文件中我有:
choco_packages:
- 7zip
- git
- vscode
在我的剧本任务中,我有:
- name: Install and upgrade software using Chocolatey
hosts: windows_servers
tasks:
- name: Install latest package versions
chocolatey.chocolatey.win_chocolatey:
name: "{{ item }}"
state: latest
loop: "{{ choco_packages }}"
到目前为止,一切都很好。
但是,现在我有一些软件包需要安装特定版本和/或需要传递某些安装参数。我可以在 my 中创建三个列表group_vars/windows_servers.yml
,每个列表对应一个目标(最新包、特定版本、带参数的包),并由每个列表提供三个任务,设置适当的键。
但为了减少维护负担,我宁愿有一个包列表,其中我可以选择设置所需的键,并有一个任务根据可用的项目键设置适当的选项。例如:
choco_packages:
- { name: "7zip", version: "22.1" }
- { name: "git" , install_args: [ "/NoGuiHereIntegration", "/NoGitLfs"] }
- { name: "vscode" }
问题
我应该如何编写 Ansible 任务来设置版本和安装参数(如果提供),并安装最新版本(如果没有)?我希望能**kwargs
在 Python 中找到类似的东西。
我尝试过的
使用when:
条件,我可以创建三个处理适用列表部分的任务:
- name: Install and upgrade software using Chocolatey
hosts: windows_servers
tasks:
- name: Install latest versions
chocolatey.chocolatey.win_chocolatey:
name: "{{ item.name }}"
state: latest
loop: "{{ choco_packages }}"
when: item.version is not defined and item.install_args is not defined
- name: Install specific versions
chocolatey.chocolatey.win_chocolatey:
name: "{{ item.name }}"
version: "{{ item.version }}"
state: present
loop: "{{ choco_packages }}"
when: item.version is defined
- name: Install with parameters
chocolatey.chocolatey.win_chocolatey:
name: "{{ item.name }}"
install_args: "{{ item.install_args }}"
state: present
loop: "{{ choco_packages }}"
when: item.install_args is defined
但这不处理version
and的组合install_args
并且相当冗长。