You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible community.general.homebrew模块未安装指定包求助

问题描述

我配置了如下Ansible任务,通过brew在本地安装一批软件包:

- name: Install general packages
  community.general.homebrew:
    name:
      - neovim
      - ansible-lint
...
      - vim
      - watch
      - wget
      - yaml-language-server
      - zsh
      - zsh-autosuggestions
    state: present
  tags:
    - home
    - work
  async: 300
  poll: 0

执行ansible-playbook playbook.yaml --diff --tags home后仅输出:

TASK [brew : Install general packages] *****************************************
changed: [localhost]

但所有指定的软件包均未实际安装到机器上,导致后续依赖zsh的任务失败:

- name: Install oh-my-zsh
  ansible.builtin.command: zsh /tmp/install-oh-my-zsh.sh
  when: not oh_my_stats.stat.exists
  tags:
    - home
    - work

报错信息为:

fatal: [localhost]: FAILED! => {"changed": false, "cmd": "zsh /tmp/install-oh-my-zsh.sh", "msg": "[Errno 2] No such file or directory: b'zsh'", "rc": 2, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
原因分析

问题核心在于async: 300和poll: 0的参数组合:

  • async: 300表示任务以异步模式执行,最长允许运行300秒
  • poll: 0表示Ansible不会等待该异步任务完成,直接标记任务为"changed"并推进到后续步骤

这就导致brew安装包的任务还在后台运行(甚至可能未开始实际安装),后续依赖zsh的任务就已执行,此时zsh尚未安装,必然触发"找不到文件"的错误。同时因为没有等待异步任务结束,Ansible无法捕获安装过程中的异常,仅显示任务状态变更,但实际安装并未完成。

解决方法

有两种可行方案:

方案1:取消异步执行(推荐)

如果不需要异步执行安装任务,直接删除async和poll参数,让Ansible等待brew完成所有包的安装后,再执行后续任务:

- name: Install general packages
  community.general.homebrew:
    name:
      - neovim
      - ansible-lint
...
      - vim
      - watch
      - wget
      - yaml-language-server
      - zsh
      - zsh-autosuggestions
    state: present
  tags:
    - home
    - work

方案2:等待异步任务完成

如果必须使用异步执行,需新增任务等待异步安装任务结束,确保软件包安装完成后再执行后续步骤:

- name: Install general packages
  community.general.homebrew:
    name:
      - neovim
      - ansible-lint
...
      - vim
      - watch
      - wget
      - yaml-language-server
      - zsh
      - zsh-autosuggestions
    state: present
  tags:
    - home
    - work
  async: 300
  poll: 0
  register: brew_install_task

- name: Wait for brew installation to complete
  ansible.builtin.async_status:
    jid: "{{ brew_install_task.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 30
  delay: 10
  tags:
    - home
    - work

其中retries: 30和delay: 10表示每隔10秒检查一次任务状态,最多检查30次(总等待时长300秒,与async超时时间匹配),直到任务执行完成。

额外可添加验证步骤,确保zsh确实安装成功:

- name: Verify zsh is installed
  ansible.builtin.command: which zsh
  register: zsh_path
  failed_when: zsh_path.rc != 0
  tags:
    - home
    - work

内容的提问来源于stack exchange,提问作者Cdhippen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:20:39