语境
我正在使用 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
并且相当冗长。
您将需要使用循环和带有“省略”的默认过滤器。像这样的东西...
这将适用于从原始版本修改后的变量。
这应该:
不相关,但看起来您试图传递一个列表,
install_args
根据文档,该列表只接受一个字符串。choco_args
另一方面,可以拿一个清单。我碰巧特别知道这个包,这些是包参数(尽管它们在传递给本机安装程序时也可能起作用,所以无论如何)。请务必仔细检查您要传递的参数(传递给包的参数 (choco_args
),或直接传递给安装程序的参数 (install_args
))win_chocolatey中唯一必需的参数是name。其他参数是可选的。使用过滤器默认值(别名:d)和特殊的省略变量来省略未定义的参数。请参阅省略参数。
例如,下面的任务应该做你想做的
笔记:
state: present
state 的默认值。