Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >记一次容器内执行ansible命令卡住

记一次容器内执行ansible命令卡住

作者头像
yaohong
发布于 2020-11-26 03:53:44
发布于 2020-11-26 03:53:44
1.9K00
代码可运行
举报
文章被收录于专栏:姚红专栏姚红专栏
运行总次数:0
代码可运行

1.由来

  最近在使用kylin_v10系统,发现当在此系统下运行的容器内执行#ansible localhost -m setup 命令会卡住不动,于是和同事一起经过如下排查最终找到解决问题的办法。

2.环境

2.1.系统信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cat /etc/*-release
Kylin Linux Advanced Server release V10 (Tercel)
NAME="Kylin Linux Advanced Server"
VERSION="V10 (Tercel)"
ID="kylin"
VERSION_ID="V10"
PRETTY_NAME="Kylin Linux Advanced Server V10 (Tercel)"
ANSI_COLOR="0;31"

Kylin Linux Advanced Server release V10 (Tercel)  

2.2.内核信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# uname -a
Linux reg.wps.lan 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64 aarch64 aarch64 GNU/Linux

2.3. docker信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# docker info
Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 18.09.9
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs

2.4.ansible信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ansible --version
ansible 2.6.2
  config file = None
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.16 (default, Jul  9 2020, 06:35:45) [GCC 7.3.0]

3.分析排查

  在排查时候发现#ansible localhost -m setup命令卡住,放将localhost换成自定义ip+账号密码的配置文件即可正常运行。

于是加入export ANSIBLE_DEBUG=True用于输出debug日志。

发现卡在如下地方:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    82 1606185861.10586: transferring module to remote /root/.ansible/tmp/ansible-tmp-1606185860.41-269842916667107/AnsiballZ_setup.py
    82 1606185861.10840: done transferring module to remote
    82 1606185861.10894: _low_level_execute_command(): starting
    82 1606185861.10924: _low_level_execute_command(): executing: /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1606185860.41-269842916667107/ /root/.ansible/tmp/ansible-tmp-1606185860.41-269842916667107/AnsiballZ_setup.py && sleep 0'
    82 1606185861.10940: in local.exec_command()
    82 1606185861.10957: opening command with Popen()
    82 1606185861.11488: done running command with Popen()
    82 1606185861.11523: getting output with communicate()
    82 1606185861.11918: done communicating
    82 1606185861.11936: done with local.exec_command()
    82 1606185861.11961: _low_level_execute_command() done: rc=0, stdout=, stderr=
    82 1606185861.11977: _low_level_execute_command(): starting
    82 1606185861.12019: _low_level_execute_command(): executing: /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1606185860.41-269842916667107/AnsiballZ_setup.py && sleep 0'
    82 1606185861.12038: in local.exec_command()
    82 1606185861.12055: opening command with Popen()
    82 1606185861.12599: done running command with Popen()
    82 1606185861.12631: getting output with communicate()

  于是进到物理机上去查看ansible进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ps -ef |grep ansible
root      672540  672016 99 10:44 pts/0    00:03:06 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1606185860.41-269842916667107/AnsiballZ_setup.py
root      673881  672428 51 10:47 pts/0    00:00:02 /usr/bin/python /usr/local/bin/ansible localhost -m setup
root      673893  673881 33 10:47 pts/0    00:00:00 /usr/bin/python /usr/local/bin/ansible localhost -m setup
root      673908  673893  0 10:47 pts/0    00:00:00 /bin/sh -c /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1606186046.03-129145088760493/AnsiballZ_setup.py && sleep 0'
root      673909  673908  0 10:47 pts/0    00:00:00 /bin/sh -c /usr/bin/python /root/.ansible/tmp/ansible-tmp-1606186046.03-129145088760493/AnsiballZ_setup.py && sleep 0
root      673910  673909 23 10:47 pts/0    00:00:00 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1606186046.03-129145088760493/AnsiballZ_setup.py
root      673914  673910 99 10:47 pts/0    00:00:01 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1606186046.03-129145088760493/AnsiballZ_setup.py
root      673971  443741  0 10:47 pts/1    00:00:00 grep ansible

  再用strace追踪下673914进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# strace -p 673914
close(216995106)                        = -1 EBADF (错误的文件描述符)
close(216995107)                        = -1 EBADF (错误的文件描述符)
close(216995108)                        = -1 EBADF (错误的文件描述符)
close(216995109)                        = -1 EBADF (错误的文件描述符)
close(216995110)                        = -1 EBADF (错误的文件描述符)
close(216995111)                        = -1 EBADF (错误的文件描述符)
close(216995112)                        = -1 EBADF (错误的文件描述符)
close(216995113)                        = -1 EBADF (错误的文件描述符)
close(216995114)                        = -1 EBADF (错误的文件描述符)
close(216995115)                        = -1 EBADF (错误的文件描述符)
close(216995116)                        = -1 EBADF (错误的文件描述符)
close(216995117)                        = -1 EBADF (错误的文件描述符)
close(216995118)                        = -1 EBADF (错误的文件描述符)
close(216995119)                        = -1 EBADF (错误的文件描述符)
close(216995120)                        = -1 EBADF (错误的文件描述符)
close(216995121)                        = -1 EBADF (错误的文件描述符)
close(216995122)                        = -1 EBADF (错误的文件描述符)
close(216995123)                        = -1 EBADF (错误的文件描述符)
close(216995124)                        = -1 EBADF (错误的文件描述符)
close(216995125)                        = -1 EBADF (错误的文件描述符)
close(216995126)                        = -1 EBADF (错误的文件描述符)
close(216995127)                        = -1 EBADF (错误的文件描述符)
close(216995128)                        = -1 EBADF (错误的文件描述符)
close(216995129)                        = -1 EBADF (错误的文件描述符)
close(216995130)                        = -1 EBADF (错误的文件描述符)
close(216995131)                        = -1 EBADF (错误的文件描述符)
close(216995132)                        = -1 EBADF (错误的文件描述符)

  终端一直刷上面的,看样子是文件描述符泄露,搜了下 docker Bad file descriptor,找到了 Spawning PTY processes is many times slower on Docker 18.09 里几位大佬排查到是容器的 nofile 太高就会卡,如果启动容器 nofile 设置低则没问题,

在容器内执行ulimit -n果然默认值很高

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> ulimit -n
1073741816

再查了下 docker nofile limit 找到 Docker: How to increase number of open files limit 里面描述可以在run docker的时候设置容器内的nofile参数大小。

于是添加 --ulimit nofile=65535 重新启动docker,并查看容器内ulimit -n值果然变小了,而且#ansible localhost -m setup 问题也得到了解决。

4.参考

  https://github.com/pexpect/ptyprocess/issues/50   https://github.com/docker/for-linux/issues/502   https://github.com/moby/moby/issues/38814

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Ansible自动化运维配置与应用(结合实例)
注: command模块和shell模块的区别是:shell模块支持“管道符”及脚本。
阿dai学长
2019/04/03
2.8K0
ansible生产常用十一大模块总结
注:-a参数后的命令用单引号,单引号,单引号;双引号有可能会出问题,特别是在user模块;
菲宇
2019/06/12
5870
ansible生产常用十一大模块总结
centos ansible常用命令
ansible在日常运维中经常使用,特别是批量执行多台服务器的时候,有效减小重复的操作成本,以下从安装到使用仅讲解工作中常用的几种方式,模块很多功能很强大,但不做全面讨论。
钢铁知识库
2022/08/20
4500
Ansible自动化运维工具之常用模块使用实战(5)
 可以看到在创建testfile文件时,并没有创建在tmp目录下,而是被默认创建到了root目录下,说明ansible 是使用 ssh 多次连接执行,连接退出以后之前的状态就全部失效了。
非著名运维
2022/06/22
4140
Ansible自动化运维工具之常用模块使用实战(5)
Linux堡垒机Jumpserver安装
Jumpserver是一款由python编写, Django开发的开源跳板机/堡垒机系统, 助力互联网企业高效 用户、资产、权限、审计 管理。jumpserver实现了跳板机应有的功能,基于ssh协议来管理,客户端无需安装agent。
菲宇
2019/06/11
2.5K0
Linux堡垒机Jumpserver安装
Ansible 以及 Ansible-playbook介绍
Anasible 是基于Python2-Paramiko 模块开发的自动化维护工具,实现了批量系统配置、部署、运行等功能。Ansible是基于模块工作的,本身不具备批量部署的功能,如果想要实现批量自动化部署,是Ansible自身的各种模块的集合。
jwangkun
2021/12/23
6.2K0
Ansible 以及 Ansible-playbook介绍
Ansible常用模块实例
为了避免ansible每次下发指令都要输入目标主机密码,所以这里使用(ssh-keygen)在控制主机创建一对秘钥,使用(ssh-copy-id)来下发生成的公钥。
HaydenGuo
2019/12/12
1.1K0
Ansible常用模块实例
ansible
  ansible是目前最受运维欢迎的自动化运维工具,基于Python开发,集合了众多运维工具(SaltStack puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。   ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
Cyylog
2020/08/19
4K1
Ansible 命令执行模块
经过前面的介绍,我们已经熟悉了 Ansible 的一些常识性的东西和如何编译安装Ansible,从本章开始我们将全面介绍 Ansible 的各种生产常用模块,这些也是我们使用 Ansible 的过程中必须掌握的重点,本章将介绍和使用 Ansible 中经常使用的一些模块,大体模块分为: 文件操作类,命令执行类,系统管理类,等使我们能对 Ansible 有一个全面的了解.
王瑞MVP
2023/01/05
2.1K0
ansible 基本命令学习
1、替换某行内容 2、在某行前插入内容 3、在某行后面插入内容 4、删除某行
用户9949933
2023/02/24
1.3K0
Ansible安装配置及实例
根据用户提供的文章内容,总结为摘要。
刘远飞
2017/04/20
2.4K0
IO重定向及管道操作
程序是由指令+数据组成的。换言之,程序是对读入的数据进行处理,再输出数据。数据的输入(Input),输出(Output),简称为IO,在没有指定输入输出的情况下,默认为标准输入和标准输出。打开的文件都有一个文件描述符(fd: file descriptor)表现为一个数字 标准输入:keyborad(键盘), 文件描述符:0 标准输出:monitor(显示屏), 文件描述符:1 标准错误输出:monitor, 文件描述符:2 I/O重定向:改变标准输入与输出的默认位置 标准输出重定向 输出重定向
章鱼喵
2018/06/27
6340
Ansible 基础搭建配置
一、初识Ansible 在这个风起云涌的自动化运维时代,选择一个拿手的自动化工具不仅可以解放双手,更重要的是工作效率大大提升! Ansible特点 就目前的优势来说: ①轻量级;②不需要安装客户端,通过sshd通信;③基于模块工作,配置更加简单,容易上手。④使用Python开发。 二、环境配置 IP地址 作用 192.168.96.129 Server 192.168.96.135 Client 192.168.96.136 Client 只需要在 Server 端安装 Ansible 服务即可。 yum
老七Linux
2018/05/31
7730
Ansible 系统概述与部署
Ansible的编排引擎可以出色地完成配置管理、流程控制、资源部署等多方面工作,与其他IT自动化产品相比较,Ansible为你提供一种不需要安装客户端软件、管理简便、功能强大的基础架构配置、维护工具,Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。
王瑞MVP
2022/12/28
4170
Ansible简介、安装、命令及常用模块
  ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。   ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
菲宇
2021/12/06
1.1K0
Ansible简介、安装、命令及常用模块
[Ansible专栏]Ansible安装和基本使用
以上只是一小部分关于default的相关配置,还有其他更多的配置这里暂时不一一列举。因为ansible的大部分参数都可以保持默认,无需更改。但是当你的被管理机器数量增加以后,建议将forks数量适当的调整。
没有故事的陈师傅
2022/12/06
9480
11 个步骤完美排查Linux机器是否已经被入侵
原文:https://cloud.tencent.com/developer/article/1882357
入门笔记
2022/06/03
7210
RLIMIT_NOFILE设置陷阱:容器应用高频异常的元凶
我们在Fedora系统上将containerd.io从1.4.13版本升级到了1.5.10之后,发现多个项目中所有MySQL 容器实例消耗内存暴涨超过20GB,而在此之前它们仅消耗不到300MB。同事直接上了重启大招,但重启后问题依旧存在。最后选择回滚到1.4.13版本,该现象也随之消失。
zouyee
2024/06/19
6410
RLIMIT_NOFILE设置陷阱:容器应用高频异常的元凶
Ansible常用模块介绍
1、 ansible-doc 希望知道更加详细的module的信息,最好的方法是使用ansible自带的ansible-doc的-s选项 [root@node1 ~]# ansible-doc -s
程裕强
2018/01/02
1.7K0
Linux lsof 命令详解
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
阳光岛主
2019/02/19
7.6K0
Linux lsof 命令详解
相关推荐
Ansible自动化运维配置与应用(结合实例)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验