CentOS 8 上安装好pssh之后报ModuleNotFoundError: No module named ‘version’

可以说pssh是我日常用的最多的批量管理工具,毕竟简单、快捷,灵活。

考虑到当前VPS提供商提供的机器无法选择我比较看好的套餐,故打算迁移到其他的VPS提供商,刚好看到已经提供了CentOS8的 support,故打算试一下。

毕竟CentOS 8 比较新,说点实在的,我这次之所以打算用CentOS 8 ,就是想尝尝鲜,毕竟任何一款操作系统刚出来的一年半,并不能作为Production环境的base。这段时间自己花点时间踩踩坑,目测是不错的选择。

安装之后,奇葩的事情就都发生了,其中最奇葩的就是发现pssh无法正常的安装使用了。

首先,还是用默认方式,安装pip:

yum install -y python3-pip

然后使用pip命令安装pssh

pip3 install --user pssh

然后,奇葩的事情发生了,居然,居然特么的给我爆了这个错误:

ModuleNotFoundError: No module named 'version'

一脸懵逼……

回头查了一下,发现pssh项目好像还没有迁移到Python3,这效率,也是特么的醉了https://pypi.org/project/pssh/
https://code.google.com/archive/p/parallel-ssh/

好吧,那就还得在机器上装python2……

这里可以得知,CentOS8虽然同时支持Python2和Python3,但是默认情况下只安装Python3。

dnf install -y python2 python2-pip && pip2 install --user pssh

嗯,此时的pssh系列工具就都可以使用了。

发表在 AutomaticOPS, Linux, OS, SSH/PSSH | 标签为 , , | 留下评论

给Apache增加x-forwarded-for支持

细心的读者可能发现了,本站是建立在K8S之上,并使用了CloudFlare CDN进行加速。而且这个博客是我build的第一个Project,所以相关的Yaml文件写的也是很low。

昨天在Trace log的时候发现,Wordpress 默认的docker image居然没有增加X-forward-for support,也就是说,我根本无法通过log确认哪个IP访问过我的网站。log里记录但所有CIP都是我的Ingress IP。

由于docke hub上并没有提供比较直接的获取真实客户IP地址方案(比如提供一个环境变量作为开关),故想使用比较传统的启动remoteip 模块然后修改logFormat字段的方案。毕竟这个方案其实是最常用的方案。

在apache2.conf中或虚拟主机的配置文件中添加以下内容:

<IfModule remoteip_module> RemoteIPHeader CF-Connecting-IP RemoteIPInternalProxy 127.0.0.1/24 </IfModule> 

修改apache access log格式(在/etc/apache2/site-enable/*.conf中添加或修改)

LogFormat "%{CF-Connecting-IP}i %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" proxied CustomLog ${APACHE_LOG_DIR}/access-example.com.log proxied

参考链接:https://www.centos.bz/2017/07/apache-get-real-client-ip/ 中的方案一

但是这样存在三个问题:
1. 需要修改两个配置文件,其中包括Wordpress docker image中自带的apache主配置文件,然而主配置文件我希望尽可能不要去动,毕竟我希望Wordpress docker image能随着docker生命周期的结束而自动更新。而强制指定apache的配置文件可能会导致在某些极端情况下无法apache运行失败。
2. 从k8s和docker的ops思想出发,docker image里的内容应该是一个black box,ops尽可能少的去干预,black box的可用性由owner去管(wordpress)就好了,我们只需要对实际的线上环境进行适配就好了
3. 正如前文所说,我的Yaml写的比较早,把所有的资源配置都写在了同一个Yaml文件里,包括Deployment, Secret, PV, PVC, Service…如果只是增加了一个ConfigMap,也许还好,如果增加的内容过多(一整个Apache主配置文件),这个Yaml就更没法看了,虽然可以单独写一个Yaml文件或者将所有的内容都拆分成多个Yaml,但是考虑到这需要一些时间成本,且优先级很低,所以还是决定先往后放一放。

通过在网上搜索,发现了https://www.centos.bz/2017/07/apache-get-real-client-ip/
可以说,这个方法是大学时学Linux系统管理时,教材里从没有讲过的Apache配置方法:

直接在/etc/apache2/site-enable/下创建一个新的realip.conf文件就可以解决这个问题。

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
#CloudFlare IP Ranges
RemoteIPInternalProxy 103.21.244.0/22
RemoteIPInternalProxy 103.22.200.0/22
RemoteIPInternalProxy 103.31.4.0/22
RemoteIPInternalProxy 104.16.0.0/12
RemoteIPInternalProxy 108.162.192.0/18
RemoteIPInternalProxy 131.0.72.0/22
RemoteIPInternalProxy 141.101.64.0/18
RemoteIPInternalProxy 162.158.0.0/15
RemoteIPInternalProxy 172.64.0.0/13
RemoteIPInternalProxy 173.245.48.0/20
RemoteIPInternalProxy 188.114.96.0/20
RemoteIPInternalProxy 190.93.240.0/20
RemoteIPInternalProxy 197.234.240.0/22
RemoteIPInternalProxy 198.41.128.0/17
</IfModule>

应用到K8S上,其实更简单:
1. 先创建一个ConfigMap文件:

2. 在之前的WordPress deployment 配置文件中增加新的volume:

3. 在之前的WordPress deployment 配置文件中增加新的volumeMount:

然后要做的就是使用kubectl apply以下这个Yaml文件,最后再次查看日志,就可以看到这所有的CIP都变成真实的访问IP了。

发表在 httpd, Kubernetes, Platform, WebServer | 标签为 , , , , , , , , | 留下评论

简单的搭建了一个smokeping

“非典“期间,闲来无事,突然发现老家的网络运营商虽然是联通,但是国际出口居然走的是电信出口,而且网络质量还不错,故打算弄个监控玩玩,看看情况。

由于老家的台式机并不是长期开机,使用的路由器又是普通的傻瓜路由器,故只能将其安装在树莓派上,方法参考自:https://allenouyangke.github.io/2018/04/25/smokeping-install/

一开始的时候在安装软件包的过程中没有任何问题:

yum -y install rrdtool perl-rrdtool  perl-core openssl-devel fping curl gcc-c++

但是需要注意磁盘剩余空间。

具体的软件包可以在: https://oss.oetiker.ch/smokeping/pub 处找最新版

在编译安装完成之后需要注意,默认smokeping需要奖新创建的var data cache 目录放在htdocs中,以保证可以正常读写,为避免不必要的麻烦,需要为其赋予nginx权限:

chown -R nginx.nginx htdocs

添加地址和修改图例可以参考:https://www.cnblogs.com/icecrystal/p/5851631.html

发表在 Monitor, Smokeping | 标签为 , | 留下评论

从openstack近几年发展到国内外云计算环境的不同

其实本来是想说说Openstack的,毕竟相比之下,openstack更会被大家所知晓。况且之前在学RHCA的过程中,也学习过这方面的内容,再加上后期也给朋友做过相关的项目,share一些小经验完全不为过。

但是openstack近些年一直在走下坡路,国内的一众公有云厂商大多也都放弃了基于openstack进行二次开发的计划。追其根本原因无非是那么几点:

  1. 体系过于庞杂:过于庞杂的体系导致openstack无法被国内众多追求产品的更新速度、以“先上线、后优化”为生存之道的公司所接受,往往为了满足客户的某个需求,单独抽出几个coder熬了几个通宵才写出来的一个function,结果在下一个版本中,这个function被社区实现了。此时要面临着继续follow upstream还是自己开一个新的branch的选择,无论怎么选择,最终的结果都会给原本资金、技术积累并不雄厚的公司带来很重的负担。
  2. 项目参与者私心太重:不得不说openstack原本是一场NASA和AWS之间的较量,但最终的后果却让大家很是大跌眼镜,NASA本不具有如此大规模的开发能力,只能找来HP(现在应该被称之为HPE了)、Dell、Redhat、Microsoft、F5……等一众公司来为其出力。However,这是个开源项目,为了让开源项目也能最大化创造利益,这些公司会尽可能给自己家的产品留好适配的接口以增加在该项目中的集成能力。但是这对国内的公司而言,是很难接受的,毕竟自己起家的前往往都是融资来的,买得起垃圾的服务器和国产的垃圾网络设备就已经很不错了。利用软件压榨硬件的全部价值才是王道,大品牌产品?NONONO,滚粗……然而这样,就要面临对无用的冗余组建删减的问题了。
  3. 运算能力的利用率太低……嗯,我相信搭建过实际项目的人都应该有所了解,openstack明明是奔着vSphere6.x去的,结果照猫画虎、一顿操作猛如虎,最后画虎不成反类犬……说白了,如果转化率不能达到需求,看起来再牛逼,最终也是绣花枕头大草包,除非你有自己的团队进行深度定制、删减……如果那样,我为什么不买vSphere系列的产品或者使用更轻量级的Ovirt呢?当前状况下养一个能handle 整个openstack平台团队的人工成本,往往不比买vSphere便宜,而且国内的很多公司都在用盗版vSphere,除非你是开云厂商的。
  4. 国内云计算厂商几乎已经处于饱和状态,从IaaS到PaaS,想要什么,基本上都能找得到,找不到只要你肯砸钱,做非标也不是不行。不是厂商sales没底线,而是云计算如果没有额外的经济来源真的不赚钱。大马云的本质是将平日里闲置的资源拿来做云赚外快,做活动的时候人家就算超卖,最终解释权仍然在人家手里。小马云的本质也是如此,之前在硬件厂商工作的时候,我见过它们购买的服务器,我们的trainer在在给我们做training的时候说,它们被称之为“小霸王”服务器一点都不过分。如果真的把这些过保的机器作为云计算的基础架构设施,相当于变相空手套白狼。也不知道它们是不是真的意识到了这方面的商机。不过这些机器上勉强跑一个KVM还不算过分,但是真的要跑Openstack,好像还真的不一定能支撑的起来。

也许,openstack在某些国外的企业里,会更有市场,毕竟国外很多时候没有国内的竞争这么激烈,我身边的一些朋友是专门给国外公司做openstack云产品infrastructure support的,它们不缺非常知名且业务量庞大的用户。

事实上,百年企业就是百年企业,它们可以宁可不要每年20%的不稳定增长而去选择5%的稳定增长。也许,只有在这种比较能沉淀下来的公司里,员工才会更有心思去针对于自己的公司基于openstack进行定制、冗余裁剪,项目经理才会更有底气的对sales说No,把真正急切的需求安排到下一个sprint,架构师会更愿意采购商业设备设计方案以稳定为优先,切实的把业务上出现的异常所造成的责任问题进行拆分,将垃圾的、该被淘汰的产品彻底淘汰掉。

发表在 KVM/Ovirt, Life, Platform | 标签为 , , , | 留下评论

Share 一个反ssh爆破脚本的思路

近期遇到了一些手里有点资源的脚本小子,每天都在尝试爆破我的ssh密码:

我简单的统计了一下IP地址所在隶属的组织关系,目测大都是一些少有人维护的公有云主机,被日了之后成了某些脚本小子们手里的肉鸡,来源地大都是国外,不过也不保证是某些人买了国外的肉鸡。

之前有尝试过更改端口号,不过在写脚本的时候通用性不好,毕竟现在规模还太小了,没必要为此写一个cmdb,所以最终决定自行处理一下。

有人推荐使用fail2ban,考虑过,不过由于目前不需要考虑效率问题,而且量不是很大,所以决定先用一个简单的shell脚本来实现。

目前的想法比较简单,通过刚刚截图中的日志,我们可以清晰的看到因为密码错误登录失败的IP地址,那么通过对这些IP地址进行拉取并统计,即可获取每个IP地址尝试错误密码的次数。

所以,我们可以每隔一段时间对这个日志文件进行一次分析,从分析对结果中拉取尝试使用密码登录但是失败了的IP地址的尝试次数,如果超过指定次数,则拉入/etc/hosts.deny。

之后,修改/etc/logrotate.d/syslog, 限定日志切割的周期,比如一周。

这样,之后再有来试机器ssh密码的情况,就可以送他去小黑屋关禁闭了。

咦?你说为啥不添加到iptables里,用防火墙服务来阻断?

那我问你,你见过每时每刻都在进行且无人审批的网络变更么?说白了,自动化运维的前提是有人能进行global级别的handle,而且需要对每一个change进行approval。真的想完全自动化、抛弃manual approval,需要有大量对实验样本才能实现,这个思想叫做AIOPS,几年前的GOPS大会上一直有人在畅想并push这个概念。但是追其本质,其只能在一定程度上尽可能减少ops的工作量、降低运维团队的人员成本,但是不能替代掉整个ops团队和能handle该项目的人员。

发表在 Linux, OS | 标签为 , , , , , | 留下评论

sudo 与重定向符号共用时出现permission denied的处理方案

由于之前在云厂商工作的关系,对于一次性批量操作不是很喜欢使用 ansible或者saltstack操作,而是爱用效率比较高的pssh。

当然,pssh所带来的弊端更多的会局限在sudo上,尤其是带密码的私钥和在使用重定向符号的时候报permission denied的情况,这次我们只share一下关于使用重定向符号return permission denied的解决方案。

# ssh [email protected] -x 'sudo echo " */5 *  *  *  *  user      /bin/bash /opt/auto/testing" >> /etc/crontab'
 bash: /etc/crontab: Permission denied

其实最简单的办法就是使用bash -c “” 将要sudo的命令包起来(注意,需要对引号进行转义):

ssh [email protected] -x 'sudo sh -c "echo \" */5 *  *  *  *  user      /bin/bash /opt/auto/testing\" >> /etc/crontab"'

看,单点添加成功了,把语句改成pssh即可。

发表在 AutomaticOPS, Linux, OS, SSH/PSSH | 标签为 , , , , | 留下评论

为kubectl增加插件

先下载配置文件和相应的tar包,并对tar包解压,释放出可执行文件:

wget https://storage.googleapis.com/krew/v0.2.1/krew.tar.gz
wget https://storage.googleapis.com/krew/v0.2.1/krew.yaml
tar -zxvf krew.tar.gz
# wget https://storage.googleapis.com/krew/v0.2.1/krew.tar.gz

--2020-01-13 08:34:35--  https://storage.googleapis.com/krew/v0.2.1/krew.tar.gz

Resolving storage.googleapis.com (storage.googleapis.com)… 172.217.164.112, 2607:f8b0:4005:807::2010

Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.164.112|:443… connected.

HTTP request sent, awaiting response… 200 OK

Length: 14375157 (14M) [application/x-tar]

Saving to: ‘krew.tar.gz’

100%[=====================================================>] 14,375,157  42.9MB/s   in 0.3s
2020-01-13 08:34:36 (42.9 MB/s) - ‘krew.tar.gz’ saved [14375157/14375157]
# wget https://storage.googleapis.com/krew/v0.2.1/krew.yaml

--2020-01-13 08:34:36--  https://storage.googleapis.com/krew/v0.2.1/krew.yaml

Resolving storage.googleapis.com (storage.googleapis.com)… 172.217.164.112, 2607:f8b0:4005:807::2010

Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.164.112|:443… connected.

HTTP request sent, awaiting response… 200 OK

Length: 2442 (2.4K) [application/octet-stream]

Saving to: ‘krew.yaml’

100%[=====================================================>] 2,442       --.-K/s   in 0s
2020-01-13 08:34:36 (37.2 MB/s) - ‘krew.yaml’ saved [2442/2442]
# tar -zxvf krew.tar.gz
./krew-darwin_amd64
./krew-linux_amd64
./krew-linux_arm
./krew-windows_amd64.exe
# ls
krew-darwin_amd64  krew-linux_arm  krew-windows_amd64.exe
krew-linux_amd64   krew.tar.gz     krew.yaml
./krew-linux_amd64 install --manifest=krew.yaml --archive=krew.tar.gz

Installing plugin: krew

CAVEATS:

\

 |  krew is now installed! To start using kubectl plugins, you need to add

 |  krew's installation directory to your PATH:

 |

 |    * macOS/Linux:

 |      - Add the following to your ~/.bashrc or ~/.zshrc:

 |          export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

 |      - Restart your shell.

 |

 |    * Windows: Add %USERPROFILE%.krew\bin to your PATH environment variable

 |

 |  Run "kubectl krew" to list krew commands and get help.

 |  You can find documentation at https://github.com/GoogleContainerTools/krew.

/

Installed plugin: krew

修改 ~/.bash_profile

vim .bash_profile
增加一行:
PATH=$PATH:$HOME/bin:$HOME/.krew/bin
保存后执行:
source .bash_profile

示例,安装一个tree插件:

# kubectl krew install tree
Updated the local copy of plugin index.
 Installing plugin: tree
 CAVEATS:
 \
  |  * For resources that are not in default namespace, currently you must
  |    specify -n/--namespace explicitly (the current namespace setting is not
  |    yet used).
 /
 Installed plugin: tree

[[email protected] ~]# kubectl tree deployment zzzz -n yyyy
 NAMESPACE   NAME                                READY  REASON  AGE
 yyyy  Deployment/zzzz                  -              4d14h
 yyyy  └─ReplicaSet/zzzz-58dc7468d7   -              4d14h
 yyyy    └─Pod/zzzz-58dc7468d7-nzkbh  True           3h45m
发表在 Kubernetes, Platform | 标签为 , , , , | 留下评论

pssh使用带有密码的私钥登陆在使用-A参数之后报错

pssh使用带有密码的私钥登陆在使用-A参数之后报“tderr: Enter passphrase for key ‘****”

解决方法:
修改
vim /lib/python2.7/site-packages/psshlib/askpass_client.py

OS X为: 
vim /usr/local/Cellar/pssh/2.3.1/lib/python2.7/site-packages/psshlib/askpass_client.py

将第67行的:

if not prompt.strip().lower().endswith('password:'):

改为

if not ( prompt.strip().lower().endswith('password:') or 'enter passphrase for key' in prompt.strip().lower()):

发表在 AutomaticOPS, Linux, SSH/PSSH | 一条评论

Hyper-V虚拟机安装

Install Hyper-V in windows 2008 R2 Enterprise Server Manager-add roles

Select Hyper-V

PS.Installation need reboot

Create virtual machineHyper-V manager

Action-New-Virtual Machine

Name of virtual machine

Memory

Network

Hard Disk

Install options

Summary

Tips: release mouse press”ctrl+alt+ ←” 补充以下 J, 下面Hyper-V成功安装 VM能正常运行是需要前提条件的 ,也就是你的硬件要支持虚拟化,需要在 BIOS中启用对虚拟化的支持。具体如下 :

  1. BIOS(RBSU) 中enable No-Execute, 如下图:
  2. BIOS 中启用Processor的 Virtualization,例如Intel Virtualization Technology 或者AMD  Virtualization(AMD-V),参考下图 (针对Intel processor) :

若上述没有启用会提示如下错误或者无法正常运行的提示信息 : the installer reports that the server does not contain the required hardware support或者The message will indicate that the virtual machine could not be started because the hypervisor is not running.或者cannot start the virtual machine

发表在 OS, Windows | 标签为 , | 留下评论

Windows server 空间不足

  1. WinSxS下为一些常用的动态链接库,不建议删除
  2. 使用 cleanmgr.exe进行磁盘空间清理。
  3. 使用如下方式将windows update相关的目录重定向到其他分区
net stop wuauserv
net stop bits
if exist C:\Windows\SoftwareDistribution rmdir /S /Q C:\Windows\SoftwareDistribution
rmdir /S /Q D:\SoftwareDistribution
if not exist D:\SoftwareDistribution mkdir D:\NewUpdateFolder
CD /D C:\Windows
mklink /J SoftwareDistribution D:\NewUpdateFolder
net start wuauserv
net start bits
发表在 OS, Windows | 标签为 , | 留下评论