Ansible脚本在AWS启动Ubuntu 16.04时遇到dpkg锁定问题

5
我有一个启动脚本(用户数据),在AWS上使用Ubuntu 16.04镜像启动时运行。我的问题是,当它运行Ansible playbook的部分时,playbook会失败,并显示基本错误消息“Could not get lock /var/lib/dpkg/lock”。现在,当我登录并尝试手动运行ansible脚本时,它可以正常工作,但如果我从AWS用户数据中运行它,则会出现错误。
以下是完整的错误信息:
TASK [rabbitmq : install packages (Ubuntu default repo is used)] ***************
task path: /etc/ansible/roles/rabbitmq/tasks/main.yml:50
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1480352390.01-116502531862586 `" && echo ansible-tmp-1480352390.01-116502531862586="` echo $HOME/.ansible/tmp/ansible-tmp-1480352390.01-116502531862586 `" ) && sleep 0'
<localhost> PUT /tmp/tmpGHaVRP TO /.ansible/tmp/ansible-tmp-1480352390.01-116502531862586/apt
<localhost> EXEC /bin/sh -c 'chmod u+x /.ansible/tmp/ansible-tmp-1480352390.01-116502531862586/ /.ansible/tmp/ansible-tmp-1480352390.01-116502531862586/apt && sleep 0'
<localhost> EXEC /bin/sh -c 'LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /.ansible/tmp/ansible-tmp-1480352390.01-116502531862586/apt; rm -rf "/.ansible/tmp/ansible-tmp-1480352390.01-116502531862586/" > /dev/null 2>&1 && sleep 0'
fatal: [localhost]: FAILED! => {"cache_update_time": 0, "cache_updated": 
false, "changed": false, "failed": true, "invocation": {"module_args": 
{"allow_unauthenticated": false, "autoremove": false, "cache_valid_time": 
null, "deb": null, "default_release": null, "dpkg_options": "force-
confdef,force-confold", "force": false, "install_recommends": null, "name": 
"rabbitmq-server", "only_upgrade": false, "package": ["rabbitmq-server"], 
"purge": false, "state": "present", "update_cache": false, "upgrade": null}, 
"module_name": "apt"}, "msg": "'/usr/bin/apt-get -y -o \"Dpkg::Options::=--
force-confdef\" -o \"Dpkg::Options::=--force-confold\"     install 
'rabbitmq-server'' failed: E: Could not get lock /var/lib/dpkg/lock - open 
(11: Resource temporarily unavailable)\nE: Unable to lock the administration 
directory (/var/lib/dpkg/), is another process using it?\n", "stderr": "E:     Could 
not get lock /var/lib/dpkg/lock - open (11: Resource temporarily 
unavailable)\nE: Unable to lock the administration directory (/var/lib/dpkg/), 
is another process using it?\n", "stdout": "", "stdout_lines": []}

问题很可能与“安装软件包(使用Ubuntu默认仓库)”任务的权限有关。您能否发布包含此任务的Ansible剧本(/etc/ansible/roles/rabbitmq/tasks/main.yml)?请同时包括您完整的UserData脚本。 - Michal Gasek
1
自动升级锁定文件可能会导致这种行为。这个讨论可能会有所帮助:https://github.com/chef/bento/issues/609 - Michal Gasek
@MichalGasek 我马上会发布它,但是我刚刚尝试了一些东西,它起作用了。在用户数据的开头,我放置了一个 sleep 5m,现在我不确定这是用户数据还是ansible playbook的问题。 - Luis F Hernandez
1
请参考上面的评论,可能是Ubuntu的无人值守升级锁定了该文件。 - Michal Gasek
看看这个问题 https://askubuntu.com/questions/953779/programmatically-disable-apt-unattended-upgrades/1196788。它帮助我解决了同样的Ansible配置问题。 - Most Wanted
1个回答

7
我遇到了同样的锁定问题。我发现Ubuntu在第一次启动时安装了一些软件包,但cloud-init没有等待。
我使用以下脚本,在尝试安装任何东西之前检查锁定文件是否可用至少15秒钟。
#!/bin/bash

i="0"
while [ $i -lt 15 ] 
do 
if [ $(fuser /var/lib/dpkg/lock) ]; then 
  i="0" 
fi 
sleep 1 
i=$[$i+1] 
done

我更喜欢使用这种方式而不是sleep 5m,因为在自动缩放组中,实例可能在其创建之前就被移除了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接