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
相关产品推荐
相关产品推荐

