Ansible 抛出“错误!发现一名工作人员处于死亡状态”错误

Ansible 抛出“错误!发现一名工作人员处于死亡状态”错误

当我运行一个简单地将目录从一个地方复制到另一个地方的剧本时,ansible 会抛出

错误!一名工人被发现死亡

错误。经过一番谷歌搜索,看起来这是由 oom-killer 杀死 ansible 进程引起的(但我不确定是否如此)。我的记忆是:

              total        used        free      shared  buff/cache   available
Mem:            991         372         448           1         170         467
Swap:           511         365         146

我不知道该如何修复它。我应该提到,当我第一次执行剧本时,我只有 RAM,由于内存不足,剧本无法运行。之后,我添加了交换。不确定这是否相关,但请注意,这是一个交换文件,而不是单独的分区。

我在运行时观察了内存,发现一旦运行该任务,空闲交换就会迅速减少。当它达到 0 时,就会抛出错误消息。


我正在运行以下剧本。

---
- hosts: localhost
  become: true
  become_method: sudo
  become_user: root

  vars:
    portals:
      - mysite
    contentPath: "/var/www/"
    backupPath: "/home/dataFiles/backups/"

  tasks:

    - name: backup content
      copy:
        src: "{{ contentPath }}/{{ item }}"
        dest: "{{backupPath}}/{{ item }}/{{ ansible_date_time.date }}/"
      with_items:
        - "{{ portals }}"
...

上面给出的错误是我从 ansible 获得的唯一信息。即使详细运行剧本也不会提供任何额外信息。

答案1

有一条注释复制模块文档:

“copy”模块的递归复制功能无法扩展到大量(>数百个)文件。有关替代方案,请参阅synchronize模块,它是rsync的包装器。

假设情况确实如此,我们应该考虑使用同步模块。

答案2

这解决了我的问题:

export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

答案3

类似这样的方法对我有用:

env no_proxy='*' ansible-playbook collect-facts.yml

您还可以添加export no_proxy="*"到您的.bashrc.zshrc,这样您就不需要每次都输入它。

更多详细信息:https://www.whatan00b.com/posts/debugging-a-segfault-from-ansible/

(信用:https://github.com/ansible/ansible/issues/32554#issuecomment-572985680

答案4

我遇到了同样的错误,但我没有在任何任务中使用复制模块。

就我而言,问题是机器(出现错误时正在运行 ansible 任务)内存不足。

我通过启动剧本来检查它,然后在另一个终端启动htop并监视剧本执行过程中 RAM 和 SWAP 是如何填充的。

我通过增加出现故障的机器的 RAM 解决了这个问题。

(增加 SWAP 的效果不会那么好,因为它不是随机存取存储器而是磁盘存储器,所以 1GB SWAP 提供的“计算能力”远低于 1GB RAM 提供的计算能力。)

相关内容