AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 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

如何根据循环项具有的键设置 Ansible 命令参数?

  • 772

语境

我正在使用 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

但这不处理versionand的组合install_args并且相当冗长。

ansible
  • 2 2 个回答
  • 35 Views

2 个回答

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

    您将需要使用循环和带有“省略”的默认过滤器。像这样的东西...

     - 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 }}"
    

    这将适用于从原始版本修改后的变量。

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

    这应该:

    • 如果定义了版本则安装指定版本(定义版本时三元过滤器将返回“present”,否则将返回“latest”
    • choco_args 仅在定义时才会被传递
    • 仅当已定义版本时才会传递版本。

    不相关,但看起来您试图传递一个列表,install_args根据文档,该列表只接受一个字符串。

    choco_args另一方面,可以拿一个清单。我碰巧特别知道这个包,这些是包参数(尽管它们在传递给本机安装程序时也可能起作用,所以无论如何)。请务必仔细检查您要传递的参数(传递给包的参数 ( choco_args),或直接传递给安装程序的参数 ( install_args))

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

    win_chocolatey中唯一必需的参数是name。其他参数是可选的。使用过滤器默认值(别名:d)和特殊的省略变量来省略未定义的参数。请参阅省略参数。

    例如,下面的任务应该做你想做的

        - 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 }}"
    

    笔记:

    • 这样,您就可以根据需要使用其他模块参数(可能是全部)。
    • 在您的代码中是多余的,因为存在参数state: presentstate 的默认值。
    • 如果需要,您可以重新定义默认值。例如,
            state: "{{ item.state | d('latest') }}"
    
    • 在您的问题中,尚不清楚您如何决定应使用哪个状态。您可以将属性状态放入choco_packages中,或者您可以为此目的定义一个变量。例如,下面的声明使所有选项保持打开状态
            state: "{{ item.state | d(my_state|d('present')) }}"
    

    • 参数install_args需要一个字符串。
    • 1

相关问题

  • Ansible:将字符串转换为字典

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve