Contexto
Estou usando o Ansible para configurar servidores Windows usando o módulo win_chocolatey .
No meu group_vars/windows_servers.yml
arquivo eu tenho:
choco_packages:
- 7zip
- git
- vscode
E na minha tarefa do manual eu tenho:
- 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 }}"
Até agora tudo bem.
No entanto, agora tenho alguns pacotes onde preciso instalar uma versão específica e/ou preciso passar determinados argumentos de instalação. Posso criar três listas no meu group_vars/windows_servers.yml
, uma para cada objetivo (pacote mais recente, versão específica, pacote com parâmetros) e ter três tarefas que são alimentadas por cada lista, definindo as chaves apropriadas.
Mas para reduzir a carga de manutenção, prefiro ter uma única lista de pacotes onde eu opcionalmente defino as chaves necessárias e tenho uma tarefa que define as opções apropriadas dependendo das chaves de item disponíveis. Por exemplo:
choco_packages:
- { name: "7zip", version: "22.1" }
- { name: "git" , install_args: [ "/NoGuiHereIntegration", "/NoGitLfs"] }
- { name: "vscode" }
Pergunta
Como devo escrever a tarefa Ansible para definir a versão e instalar os argumentos, se eles forem fornecidos, e instalar a versão mais recente, se não? Espero encontrar algo parecido **kwargs
com Python.
O que eu tentei
Usando a when:
condicional, posso criar três tarefas que tratam da parte da lista aplicável:
- 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
Mas isso não lida com combinações de version
e install_args
e é bastante detalhado.
Você desejará usar um loop e o filtro padrão com "omitir". Algo assim...
Isso funcionará com esta var modificada do original.
Isto deveria:
Não relacionado, mas parece que você estava tentando passar uma lista para
install_args
a qual, segundo a documentação, leva apenas uma string.choco_args
por outro lado, pode pegar uma lista. Acontece que conheço este pacote em particular e estes são parâmetros de pacote (embora eles também possam funcionar quando passados para o instalador nativo, tanto faz). Apenas certifique-se de verificar qual você está tentando passar (um parâmetro para o pacote (choco_args
) ou um parâmetro diretamente para o instalador (install_args
)O único parâmetro obrigatório em win_chocolatey é name . Outros parâmetros são opcionais. Use o filtro padrão (alias: d) e a variável omit especial para omitir parâmetros indefinidos. Consulte Omitindo parâmetros .
Por exemplo, a tarefa abaixo deve fazer o que você deseja
Notas:
state: present
é redundante porque o valor padrão do parâmetro state está presente .