AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1158815
Accepted
Saaru Lindestøkke
Saaru Lindestøkke
Asked: 2024-05-02 23:42:05 +0800 CST2024-05-02 23:42:05 +0800 CST 2024-05-02 23:42:05 +0800 CST

Como posso definir argumentos de comando Ansible com base nas chaves que um item de loop possui?

  • 772

Contexto

Estou usando o Ansible para configurar servidores Windows usando o módulo win_chocolatey .

No meu group_vars/windows_servers.ymlarquivo 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 **kwargscom 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 versione install_argse é bastante detalhado.

ansible
  • 2 2 respostas
  • 35 Views

2 respostas

  • Voted
  1. Best Answer
    Semicolon
    2024-05-03T00:36:28+08:002024-05-03T00:36:28+08:00

    Você desejará usar um loop e o filtro padrão com "omitir". Algo assim...

     - name: Install stuff
       chocolatey.chocolatey.win_chocolatey:
         name: "{{ item.name }}"
         state: "{{ item.version is defined | ternary('present','latest') }}"
         version: "{{ item.version | default(omit) }}"
         choco_args: "{{ item.choco_args | default(omit) }}"
         install_args: "{{ item.install_args | default(omit) }}"
       loop: "{{ choco_packages }}"
    

    Isso funcionará com esta var modificada do original.

    choco_packages:
     - { name: "7zip", version: "22.1" }
     - { name: "git" , choco_args: ["/NoGuiHereIntegration", "/NoGitLfs"] }
     - { name: "vscode" }
    

    Isto deveria:

    • Instale uma versão especificada se a versão estiver definida (o filtro ternário retornará "presente" quando a versão for definida, caso contrário, retornará "mais recente"
    • choco_args só será passado se estiver definido
    • version só será passada se estiver definida.

    Não relacionado, mas parece que você estava tentando passar uma lista para install_argsa qual, segundo a documentação, leva apenas uma string.

    choco_argspor 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)

    • 1
  2. Vladimir Botka
    2024-05-03T00:40:29+08:002024-05-03T00:40:29+08:00

    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

        - chocolatey.chocolatey.win_chocolatey:
            name: "{{ item.name }}"
            version: "{{ item.version | d(omit) }}"
            install_args: "{{ item.install_args | d(omit) }}"
            state: "{{ item.state | d(omit) }}"
          loop: "{{ choco_packages }}"
    

    Notas:

    • Dessa forma, você pode usar outros parâmetros do módulo conforme necessário (potencialmente todos).
    • No seu código state: presenté redundante porque o valor padrão do parâmetro state está presente .
    • Você pode redefinir os padrões se desejar. Por exemplo,
            state: "{{ item.state | d('latest') }}"
    
    • Na sua pergunta, não está claro como você decide qual estado deve ser usado. Você coloca o estado do atributo em choco_packages ou pode definir uma variável para esse propósito. Por exemplo, a declaração abaixo mantém todas as opções abertas
            state: "{{ item.state | d(my_state|d('present')) }}"
    

    • O parâmetro install_args requer uma sequência.
    • 1

relate perguntas

  • Ansible: Converter string em dicionário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve