在Ubuntu上使用apt更新时,Ansible无法实现

时间:2016-06-29 11:19:52

标签: ansible ansible-playbook

我用Vagrant创建了几台Ubuntu 14.04机器。我有一些ansible 2.1 playbook在某些任务中使用apt,例如:

  • update apt
  • 添加docker repo
  • 添加java8 repo

所有这些任务在随机主机上随机失败。例如,这里是简单的java8安装角色:

- name: Add Oracle Java Repository
  apt_repository:
    repo: 'ppa:webupd8team/java'
    update_cache: yes
    state: present
#  register: result
#  until: result|success
#  retries: 10
  tags: [java]

- name: Accept Java 8 License
  debconf: name='oracle-java8-installer' question='shared/accepted-oracle-license-v1-1' value='true' vtype='select'
  tags: [java]

- name: Install Oracle Java 8
  apt: name={{item}} state=latest
  with_items:
    - oracle-java8-installer
    - ca-certificates
    - oracle-java8-set-default
  tags: [java]

非常简单,但apt_repository随机失败很多。我不得不使用重试黑客才能使它工作。问题报告here,但这只是一个。

错误如下:

fatal: [xx.xx.xxx.x]: FAILED! => {"changed": false, "failed": true, "module_stderr": "",
"module_stdout": "Traceback (most recent call last):\r\n
File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1454536847.17-86172912102079/apt\", line 2630, in \r\n
 main()\r\n
File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1454536847.17-86172912102079/apt\", line 603, in main\r\n
 cache = apt.Cache()\r\n
File \"/usr/lib/python2.7/dist-packages/apt/cache.py\", line 107, in init\r\n
 self.open(progress)\r\n
File \"/usr/lib/python2.7/dist-packages/apt/cache.py\", line 151, in open\r\n
 self._cache = apt_pkg.Cache(progress)\r\n
SystemError: E:Encountered a section with no Package: header,\
 E:Problem with MergeList /var/lib/apt/lists/us-west-\
 2.ec2.archive.ubuntu.com_ubuntu_dists_trusty-updates_universe_i18n_Translation-en\
, E:The package lists or status file could not be parsed or opened.\r\n
", "msg": "MODULE FAILURE", "parsed": false}

我错过了什么吗?你怎么做生产?

1 个答案:

答案 0 :(得分:1)

这不是一个Ansible问题,虽然Ansible肯定没有帮助。

这是apt偶尔将垃圾文件(某种二进制文件)保存为包列表的问题,该列表应该是文本。 There's been a bug open forever about ithere's a fix from AskUbuntu

在这种情况下,查看文件,确认它是二进制文件,然后将其删除:

head /var/lib/apt/lists/us-west-2.ec2.archive.ubuntu.com_ubuntu_dists_trusty-updates_universe_i18n_Translation-en
rm /var/lib/apt/lists/us-west-2.ec2.archive.ubuntu.com_ubuntu_dists_trusty-updates_universe_i18n_Translation-en

apt会在apt-get update运行时重新创建。

你如何用Ansible解决这个问题? There are some workarounds in the ansible issue you found,最终应该修补apt模块以简单地解决这个问题 - 检测失败,删除文件,然后重新运行更新。但向Ansible发送拉动请求意味着它将在大约一年内不会被释放。我发现它很少发生,我只是手动修复它。