1 前言
一个问题,一篇文章,一出故事。
笔者定位某个IP地址在集群中的位置,于是笔者想到使用循环去遍历集群中的物理主机,然后使用docker命令查询出信息并搜索,于是产生本文。
2 最佳实践
2.1 集群的主机列表
cat /etc/hosts
命令现实如下,
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.168.0.24 hd01.cmdschool.org 10.168.0.25 hd02.cmdschool.org 10.168.0.26 hd03.cmdschool.org 10.168.0.27 hd04.cmdschool.org 10.168.0.28 hd05.cmdschool.org #....
注:“#….”表示省略的主机名称
2.2 配置公钥认证
此步骤需要你配置公钥认证允许运行脚本的主机通过无需密码的方式登录上一个步骤配置在列表中的主机,详细如下,
2.3 创建搜索脚本
mkdir -p ~/scripts/ vim ~/scripts/docker-search.sh
加入如下脚本,
#!/bin/bash searchKeywork="10.168.2.250" hostKeyWork="hd" hosts=`cat /etc/hosts | awk -F' ' '{print $2}' | grep -i "$hostKeyWork"` for i in $hosts; do host="$i" dockerInstall=`ssh "$host" whereis docker | grep /usr/bin/docker | wc -l` if [ "$dockerInstall" == "0" ]; then continue fi containers=`ssh "$host" docker container ls | awk -F' ' '{print $1}' | grep -v "CONTAINER"` for j in $containers; do container="$j" echo "$host:$container," ssh "$host" docker container inspect "$container" | grep -i "$searchKeywork" done networks=`ssh "$host" docker network ls | awk -F' ' '{print $1}' | grep -v "NETWORK"` for k in $networks; do network="$k" echo "$host:$network," ssh "$host" docker network inspect "$network" | grep -i "$searchKeywork" done done
脚本解析,
– 变量“searchKeywork”定义需要搜索关键字
– 变量“hostKeyWork”定义筛选出容器物理主机的关键字
– 变量“hosts”定义筛选出容器物理主机列表的命令,,即变量存储物理机的列表
– 循环“for”即第一个循环迭代找到的每一台容器物理主机
– 命令“if”判断变量“dockerInstall”的计数如果等于零则跳过循环(没有安装docker,直接跳过)
– 变量“containers”定义筛选出容器虚拟机的ID列表的命令,即变量存储当前物理机的容器列表
– 循环“for”即第二个循环迭代当前物理主机上的每个“container”
– 循环“for”即第二个循环的“echo”命令输出当前主机和容器“container”
– 循环“for”即第二个循环的“ssh”命令连接到当前主机并执行命令“docker container inspect”
– 循环“for”即第二个循环的“docker container inspect”查询容器“container”的实例详细信息
– 循环“for”即第二个循环的“grep”使用变量“searchKeywork”定义的关键字过滤“container”实例的详细信息
– 循环“for”即第三个循环类似第二个循环,不同的是搜索对象为“container”的“network”信息
2.3 测试脚本
sh ~/scripts/docker-search.sh
没有评论