作为 Ansible 新手,我正在使用循环在多台 Ubuntu 机器上安装一些软件包,这是我的剧本:
---
- name: Install Software
hosts: all
become: true
tasks:
- name: Update package cache
package: # Use the package module
name: "{{ item }}"
state: present
with_items: # Loop over the package list
- vim
- tree
- figlet
ignore_errors: yes # Ignore errors if packages fail to install
retries: 3 # Number of retries if task fails
delay: 10 # Delay between retries in seconds
第一次运行 playbook 在其中一台主机上失败,错误消息如下:
失败:[serv01](项目=树)=> {“ansible_loop_var”:“项目”, “cache_update_time”:1716373387,“cache_updated”:假,“更改”: false, "item": "tree", "msg": "'/usr/bin/apt-get -y -o “Dpkg::选项::=--force-confdef”-o “Dpkg::Options::=--force-confold”安装“tree=2.0.2-1” 失败:E:无法获取锁/var/lib/dpkg/lock-frontend。举行 通过进程 1567 (apt-get) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有另一个进程正在使用它? ”,“rc”: 100, "stderr": "E: 无法获取锁 /var/lib/dpkg/lock-frontend。它 由进程 1567 (apt-get) 持有 E: 无法获取 dpkg 前端锁(/var/lib/dpkg/lock-frontend)是另一个使用的进程 它? ", "stderr_lines": ["E: 无法获取锁 /var/lib/dpkg/lock-frontend.它由进程 1567 (apt-get) 持有”, “E:无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有另一个进程在使用它?"], “stdout”:“”,“stdout_lines”:[]}失败:[serv01](item=figlet)=> {“ansible_loop_var”:“项目”,“cache_update_time”:1716373387, “cache_updated”:假,“更改”:假,“项目”:“figlet”,“msg”: "'/usr/bin/apt-get -y -o "Dpkg::Options::=--force-confdef" -o “Dpkg::Options::=--force-confold”安装“figlet=2.2.5-3” 失败:E:无法获取锁/var/lib/dpkg/lock-frontend。举行 通过进程 1567 (apt-get) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有另一个进程正在使用它? ”,“rc”: 100, "stderr": "E: 无法获取锁 /var/lib/dpkg/lock-frontend。它 由进程 1567 (apt-get) 持有 E: 无法获取 dpkg 前端锁(/var/lib/dpkg/lock-frontend)是另一个使用的进程 它? ", "stderr_lines": ["E: 无法获取锁 /var/lib/dpkg/lock-frontend.它由进程 1567 (apt-get) 持有”, “E:无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有另一个进程在使用它?"], “stdout”:“”,“stdout_lines”:[]} ...忽略
当我再次运行剧本时,它在所有主机上都成功了。
如何告诉 Ansible 等待直到锁被释放?或者可以同时安装软件包吗?
错误信息非常清楚;这不是一个可靠的问题。
E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1567 (apt-get)\nE: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
连接到服务器并找出该进程正在做什么。提供了数据并且无法访问服务器,这是唯一可能的建议。
如果它被卡住了(使用
strace
检查)杀死它。手动运行例如之后有能力找出可能破坏了之前(非ansible控制运行)的原因。一旦你解决了问题,ansible 就会做它的事情。