精华内容
下载资源
问答
  • 腾讯DevOps自动化运维平台织云.ppt
  • 一种云计算时代的DevOps自动化运维平台.pdf
  • 腾讯DevOps自动化运维平台“织云”技术实践-梁定安.pdf
  • 腾讯DevOps自动化运维平台“织云”技术实践-梁定安.zip
  • 自动化测试体系不完善、缺少自助式的持续交付平台、系统间耦合度高服务...11月23日,京东云开发者社区和英特尔联合举办的「京东云DevOps自动化运维技术实践」沙龙在上海落地,为开发者们分享京东云在DevOps上的经验...

    Alt

    自动化测试体系不完善、缺少自助式的持续交付平台、系统间耦合度高服务拆分难度大、成熟的DevOps工程师稀缺,缺少敏捷文化……这些都是DevOps
    在落地过程中,或多或少会碰到的问题,DevOps发展任重道远,不断学习前人经验完善自身是很好的选择。

    11月23日,京东云开发者社区和英特尔联合举办的「京东云DevOps自动化运维技术实践」沙龙在上海落地,为开发者们分享京东云在DevOps上的经验。

    Alt

    DevOps 自动化运维技术实践

    01京东云持续交付演化之路

    Alt
    京东云工具产品研发部副总监 井亮亮

    在行业内,每年DevOps现状调查报告里,都会去衡量DevOps对于一个组织的生产活动的影响,定义出“高效的组织?”,会从4个方面去衡量,分别是:部署频率、软件交付周期、变更失败率、平均修复时长。持续交付目标是提升交付效率和确保交付质量,但交付是线上变更,那么有变更就意味着会有风险,那么,如何降低软件交付的失败率,控制风险,就变成了企业持续交付考核的一个重要目标。

    “我统计了一下,京东云在今年的线上软件变更失败率控制在在 0.46%,但,我们仍然有4成的故障是由变更操作引起的,实施持续交付,对于确保整个软件交付质量来说是至关重要的。”井亮亮说。

    很多公司在内部实施交付都曾或多或少产生过这样问题:开发说"我想更快的开发,但构建系统却频繁出问题!”,测试说“我需要更快测试,但没有环境!”、运维说“我有太多环境需要管理!”……京东云也不例外,那么持续交付如何解决跨团队合作的一些问题呢?yy京东云持续交付之路

    2013 年之前是”HumanOps“,通过脚本手工上线,无法做到自动化;

    2014 年到 2016 年是 Jone(京东持续交付平台) 时期,在 Jone1.0 交付采用Rsysnc的方式进行,上线过程经常会线上排队;16年启动了2.0的迭代,Jone采用了ansible作为发布的工具。

    2017 年京东云推出京东云翼,云翼是一整套的DevOps平台,不仅包含持续交付,还包含了智能监控、智能运维、门神等能力。

    如何在企业内部实施持续交付

    • 统一的部署规范
    • 灵活的部署流水线
    • 企业文化策略协助

    在部署规范上,部署规范的统一,是企业实施持续交付的基础,在京东云内部会要求如下:

    1. 我们有统一的控制系统去操作线上,减少操作的渠道,减少风险,因为我们的控制系统可做到秒级回滚
    2. 会提供统一的基础镜像,这样不会因为操作系统不一致的问题造成的风险,服务都是用统一的账户去启动
    3. 会统一部署路径和日志路径,利于排查问题,以及查询日志
    4. 线上服务的启停命令,都是我们提供的统一的模板,防止不同人员自己编写导致的健壮性不够的故障
    5. 禁止手工,所有的构建都必须走系统去把控质量
    6. 系统会控制没有上预发的app是不允许上线的
    7. 另外会控制避免上线导致全流量丢失的上线操作

    部署流水线可以帮助解决如何在企业内部推动各个团队用你的标准规范和平台,流水线是搭台子,各个业务可以在上面进行唱戏。

    在做好规范和部署流水线的前提下,企业内部的落地推动,需要企业文化的支撑,持续交付不仅仅工具的支持,仍然需要文化的支撑。

    云翼 DevOps 平台的设计及落地

    • 首先第一步要构建了 CMDB 的建设,cmdb的建设,关键是cmdb模型的建设,并要确保 CMDB 数据的准确性。
    • 利用容器技术提升持续交付的能力,容器要做扩缩容,可提高运维的效率,极大节约了资源的成本。
    • 复杂业务场景,需支持编排部署,如一次几十个应用的发布,这时就需要编排能力的建设,编排主要分为3步:模版编写、设置策略、一健发布。

    02数据驱动企业级监控系统设计与落地
    Alt
    京东云工具产品研发部总监 颜志杰

    为了实现缩短 MTTR 的目标,监控系统应该具有这些能力:

    1. 数据采集能力,获取可观测的数据
    2. 数据能够方便加工,比如把相关的数据汇聚起来,得到我们需要关注的数据
    3. 对这些关注的数据,做异常检测,及时产生告警
    4. 收到告警后,通过 Dashbord 查图定位,专家诊断推荐平台,加速定位
    5. 定位问题后,通过预案平台进行快速止损
    6. 整个监控系统需要做到高可用,监控就是为了发现异常,如果由于异常导致自身不可用,肯定是减分的

    从数据角度去理解监控系统设计

    典型监控系统从功能模块分为采集、计算、存储、告警、算法、业务端等。从数据视角去理解,监控系统就是一个数据处理系统,便于我们简化系统设计以及更好理解监控系统。那么从数据视角分析监控系统,还需要优先考虑以下这几个部分:

    • 数据模型先行,不同模型代表着不同的数据描述及处理能力,进而会对监控产品的形态产生影响
    • 监控采集就是数据标准化的过程
    • 监控数据存储具有读写正交、meta 的灵活查询、最新时间热点查询需求,京东云采用列式存储 + 倒排 +Gorilla 的方案选型
    • 聚合计算就是对数据进行范围圈定,进行算子处理
    • 报警通路做好“质检员”工作,同时完成通知用户这件事情

    京东云的监控标准设计

    监控需要覆盖基础 - 存活 - 性能 - 业务四个层面,从而保证采集数据的全面,进而避免监控遗漏。那么如何按照监控标准去指导监控产品的落地呢?看京东云如何从发现问题、定位问题和解决问题三个方面来减少 MTTR:

    1. 在发现问题阶段,分别面向管理者和运维人员设置监控系统的打分机制及推荐系统,给予管理者一个直观的总分和每个维度的细分得分,使得管理人员对整体监控有个量化的指标,另一方面,对于运维人员,则提供配置推荐、一键启用,可以快速地根据标准去完善监控,达到监控变‘全’。
    2. 在定位问题阶段京东云推进了变更可视化项目,将上线、配置更改、第三方的变更事件,都接入到变更事件中,用户可以根据时间去查询时间段的变更,跟报警做关联,京东云也会根据一些相关性的算法推荐,将变更推荐给用户,加速问题定位过程。
    3. 处理问题阶段京东云可提供预案平台,对预案进行标准化分类,指导用户管理预案。

    京东云落地实践:以监控告警收敛项目为例

    在监控告警上,运维人员往往在提升告警手段上做了很多工作,比如说通过发邮件的形式到短信、电话的形式等,京东云每月短信发送量上百万、电话告警每月上千条,但是运维人员并没有感受到有这么多问题,这就说明告警关注度是下降的,所以告警收敛势在必行,目标就是让告警关注度提升,那如何落地呢?

    这就需要首先数据量化,先统计各个渠道的告警总数,然后分两步走,对于产品线负责人,需要让产品线的负责人知道自己部门的情况,另一路出分析数据,拆解产品线发送多的原因,给运维同学提供数据指导,分析各种有可能导致发送告警多的原因,如:一条短信平均接收人、哪些告警规则发送较多等。

    基于这些统计数据,监控团队去成立告警收敛项目:在面对接收人过多的情况(一个短信原来需要 10 几个人接收),京东云推出值班表计划,在产品设计上保证告警规则设置的合理性,对于一些大规模触发情况,比如网络故障,京东云默认会按照规则、应用进行合并,同时为了在合并之后让用户能看的更清楚,京东云也推出了移动端程序。

    03质量服务在京东云的实践
    Alt
    京东云平台质量部总监 丁超

    “质量是一份事业,向做质量的同学致敬”

    在京东云,质量部门关注什么?

    京东云的形态包含公有云、专有云、混合云、多云形态,基于京东云产品的特性,质量服务应关注如下 4 个维度的内容:

    1. 标准化流程建设,及配套的 check 服务。
      流程覆盖从需求、设计、编码、测试、发布、监控到工单。
      以解决需求不明确、设计后期频繁变更、代码分支混乱、测试无准入准出标准、发布无标准、线上运行时数据无观测等问题。
      丁超建议人工先把事情做起来,先有再深入,再自动化。
    2. 垂直方向上业务能力和场景的建设。
      质量部门更关注产品的能力验证、能力评测。
      以解决测试目标及内容不明确、无准入标准、准出标准、业务场景的模拟(用户是怎样使用产品的)、产品能力及局限性、对标评测等问题。
    3. 横向视角上的平台能力建设。
      质量部门需要需要解决的问题是:
      持续集成、效率问题、性能及安全评测能力、资源及环境快速获取能力。
    4. 作为云厂,或者作为企业,如何从云获得专业服务的能力。

    需要解决的问题包括:

    • 针对客户场景的质量解决方案;
    • 让客户无需分神质量专业性的建设;
    • 保证使用门槛低,效果好。

    衡量质量的指标,一是看服务可用性 SLA,二是考核线上的故障数,三是要给用户交付功能清单,四是有性能测试指标 QPS,五是数据持久性,六是安全性,七是兼容性,根据以上指标,通过4个维度的质量建设,最终需要给用户交付极致的体验。

    质量模型落地之从单点突破到持续交付

    传统企业中的 CMM 标准,其对质量控制是非常细致的,如果既想实现互联网快速迭代,又想要传统企业中丰富的过程控制,该如何做呢?京东云用了现代和传统结合的方法,即持续交付的思想加入打点服务:1. 需求和设计上,采用“模板+人工”的方式,保证事情的发生和效果。2. 编码环节,提供 JDCCheck 服务, 代码仓管理、静态代码检查、安全检查、UT、代码评审等方面。提供打点服务,该环节通过,才可以进入测试环节。

    在测试环节,京东云提供 JDCCase 测试管理平台,包含 Case 库、测试计划、测试执行、测试报告等,覆盖了测试任务的各个方面,保证了测试的准入和准出。同时与 DevOps 团队合作,发布 PipeLine 服务,保证测试规范,主要保证以下效果:

    • 整体流程清晰
    • 子服务做成 plugin,随需调用卡点
    • 用户使用成本低,无感知接入
    • 通过数据度量做改进,关注过程数据,和线上效果

    丁超提到:“研发自测不足、推 UT 难、缺乏敏捷教练、流程落地难、人力不足、唯快不破(关注快,忽略质量),都使得持续交付在互联网的落地更难。所以,非常提倡“通用打点” 的方式,求同存异,统一流程和平台,又给团队最大的自由。在过程和结果上进行考核。”

    京东云混沌工程实践

    Netflix《混沌工程》书中说到:在接受“系统越复杂,越脆弱”的事实之后,让系统在每一次失败中获益,然后不断进化,这是混沌工程的核心思想。即通过模拟故障,来验证系统的可用性。

    对于京东云来说,做混沌工程困难重重,机器规模大,地域范围广,涉及产品多,上下游依赖复杂,涉及人员多,而且担心线上出故障影响客户。但是从平台层面看问题,需要有人整体把控系统情况,保证故障的及时恢复,混沌工程又是必须要做的事情。

    既然不能在线演练,京东云另辟蹊径,最终选择在隔离区重新搭建一套仿真环境。模拟多Region、多AZ。并在AZ1实现了与线上的 1:1 建设。同时,为保证该环境与线上版本的一致性,把该仿真环境作为“预发环境”使用,放在发布流程中,作为上线前的系统集成环境。只有通过该预发的集成,验证变更内容对云整体无影响,才可以继续后续的灰度流程。这样,还同时解决了日常运维问题。1、混沌工程第一次演练丁超介绍道:“第一次演练大约在 1 年半前,命名为“AZ故障”。目标是:测量 AZ1整体断电时,云服务全部恢复的时间(即全部迁移到 AZ2 恢复可用的耗时)。再重启AZ1,测量AZ1、AZ2同时恢复流量负载的耗时。之后,针对AZ2 重复如上的步骤。结果光AZ1断电的场景,就用了数个小时,这其中包括故障定位、执行预案、恢复验证等。非常直接客观地表明,在问题发现和定位、预案有效性、系统级验证方面,都亟待改进。不难得出结论:破坏性演练,是推动服务治理、架构升级的有效助力!“2、混沌工程改进及发展第一次演练之后,京东云开始了不断的迭代改进,包括:

    • 依赖治理:服务的 RING 级别梳理。将服务按照依赖顺序、部署顺序进行梳理,同一 RING 上的服务,不能有相互依赖。不同 RING
      上的服务,有明确的监控项(KEY)状态呈现,有助于问题的逐层定位。
    • 预案自动化:将所有预案收录到监控系统,实现自动化。触发方式定义为:检测到问题直接触发,和预警后人工确认触发。并对每个预案的生效时间进行严格的耗时检查,不断精进。
    • 数据面要求对用户无损(即用户无感知),控制面可适当放宽。
    • 服务治理:引入微服务架构和调用链治理。
    • 触发及验证自动化:将故障的触发和云功能的验证,进行平台化。现已实现无成本的触发、秒级验证,这使破坏性演练可日常常态触发,不必大动干戈。

    “时至一年半后的今天,我们已经从单场景故障恢复时间数个小时,降低到了分钟内,大部分故障场景用户无感知。微服务化、3AZ 建设等云的高可用性改造也在持续进行中。对于未来,京东云更有信心!”丁超老师对混沌工程的迭代有更强的信心。

    Alt
    BoCloud博云 售前总监 刘欣雨

    多云管理平台的建设

    开篇,刘欣雨分析了中国云市场现状提出:中国云市场规模在逐年增加,增幅领跑全球,呈现特点是越来越多用户愿意同时采用公有云和私有云这种多云管理模式。随着国内更多云服务商的参与,为云市场提供更好、更完善服务,我们相信中国的云市场规模将会更加庞大,那么多云管理的需求也将会越来越强烈,范围越来越广,这为多云管理服务商提供更大的市场机会。

    博云多云平台总体建设思路围绕“七化”:管理统一化、资产精细化、业务流程化、服务自助化、运营计量化、响应自动化,管理智能化。刘欣雨主要分享了一体化运维管理方案,其中包含的多云管理方案、自动化运维和金融行业实践等内容。

    关于其一体化运维管理方案,刘欣雨说:“一体化运维包含五个方面,统一纳管,统一运维,统一运营,统一服务门户和统一监控管理,实现异构资源集中纳管,统一资源按需分配;支持自动化运维,支持通过服务编排实现不同运维场景的自动化服务;提供统一服务门户,实现自助自主服务门户,让业务人员自助获取自己所需要的服务,我们的平台可以自动执行,为用户提供资源,同时提供集中监控管理,实现资源、应用和服务一站式管理”。

    同时刘欣雨也提到,对自动化运维场景的支持主要体现资源自动化、应用自动化、网络自动化和业务场景自动化。包括资源交付、系统安装,应用上下线、应用变更、补丁管理、网络配置管理和业务场景管理(如灾备切换和跑批业务自动化处理)。刘欣雨提到云管平台还需要开放的集成模式,要匹配多服务管理方式,提供开放接口,方便对接客户现有系统(如多厂商云平台、ITSM、CMDB、监控等),这个也是对云管平台的要求。

    最后刘欣雨分享了博云在某大型股份制银行多云管理平台项目建设内容,多云管理平台帮助该股份制银行实现了资源统一化、服务标准化、运维自动化和服务智能化的IT管理目标,提高了资源利用率,减轻了运维人员工作量,提升了运维工作效率,保障了运维工作质量,增强了IT服务体验,节约了IT建设和运营成本。

    关注【京东云开发者社区】,后台回复【PPT1123】查看活动PPT

    点击“阅读”,进入京东云开发者中心查看沙龙视频

    欢迎点击“京东云”了解更多精彩

    Alt

    Alt

    展开全文
  • DevOps 自动化运维工具Chef

    千次阅读 2019-01-03 23:13:19
    最近在学习Chef, Chef 就是现在比较热门的自动化运维工具之一,其他的工具还有Ansible, Puppet, SaltStack. 为什么选择Chef,是因为Chef对Window的支持非常的好。 Chef的官方网站,https://www.chef.io/. 其当前...

    最近在学习Chef, Chef 就是现在比较热门的自动化运维工具之一,其他的工具还有Ansible, Puppet, SaltStack.  为什么选择Chef,是因为Chef对Window的支持非常的好。

    Chef的官方网站,https://www.chef.io/. 其当前最新的版本信息如下,

     

    • Chef Server版本是chef-server-core_12.8.0
    • Chef client的版本chef-client-12.13.37
    • chef 管理台的版本是chef-manage_2.4.3 
    • chef dev kit的最新版本是0.17.17

     

    根据百度百科的定义,Chef是IT自动化平台,可让客户创建、部署、变更和管理基础设施运行时环境和应用。Chef是平台无关的,可以部署到云端、本地或作为虚机(VM)。Chef也被称为部署自动化工具和DevOps使能者,它是一款可以为不同规模企业提供许多集成选项的产品。

     

    Chef是IT自动化平台,可让客户创建、部署、变更和管理基础设施运行时环境和应用。Chef是平台无关的,可以部署到云端、本地或作为虚机(VM)。Chef也被称为部署自动化工具和DevOps使能者,它是一款可以为不同规模企业提供许多集成选项的产品。

    客户用Chef来创建、管理和部署应用栈、裸服务器以及VM。Chef平台主要基于客户/服务器。受管理的系统运行Chef客户端,后者再利用HTTP RESTful API连接Chef服务器。Chef服务器包含有一个数据库,里面存储有“配方”,“配方”会被打包成独立的“食谱”,代表着运行在客户端的独立组件—比方说JavaWebSphere以及MySQL等,还会保留着所有受管理机器的详细目录。

    这些配方是用来创建部署和集成应用所需的组件的可重用建构块的。配方会合并进上面提到过的食谱。一旦编写或从Chef社区下载后,cookbook和recipe就可以作为模板来构建应用栈。这让客户可以以一致和可重复的形式创建、管理和部署环境,并且加速了这些环境的部署速度。Chef被格式用来显著减少人工的服务开通准备工作,以及应用和数据中心资源的管理时间。

    Chef的架构如下图所示意,

    Chef的主要优缺点如下(http://blog.takipi.com/deployment-management-tools-chef-vs-puppet-vs-ansible-vs-saltstack-vs-fabric/)

    When to use it: Before considering Chef, make sure you’re familiar with Git, as it’s required for configuration, and Ruby, as you’ll have to be writing in it. Chef is good for development-focused teams and environments. It’s good for enterprises looking for a more mature solution for a heterogeneous environment.

    Price: Free open source version, standard and premium plans priced on a per node per month basis that can get down to $6/node/month or $6.75/node/month respectively at high volume.

    Pros:

    • Rich collection of modules and configuration recipes.
    • Code-driven approach gives you more control and flexibility over your configurations.
    • Being centered around Git gives it strong version control capabilities.
    • ‘Knife’ tool (which uses SSH for deploying agents from workstation) eases installation burdens.

    Cons:

    • Learning curve is steep if you’re not already familiar with Ruby and procedural coding.
    • It’s not a simple tool, which can lead to large code bases and complicated environments.
    • Doesn’t support push functionality.

    网上关于Chef的资料比较多,大家可以自己搜索。笔者就不在啰嗦。 因为最近笔者在尝试安装最新的版本,但是网络的资料大部分都是 Chef Server 11版本的资料,而Chef 12的安装和Chef 11的安装还是有区别的。具体安装请读者参考后续文章。

    欢迎关注技术公众号:架构师成长营

    展开全文
  • [1] DevOps 自动化运维工具Chef----入门

    千次阅读 2016-09-16 00:00:35
    最近在学习Chef, Chef 就是现在比较热门的自动化运维工具之一,其他的工具还有Ansible, Puppet, SaltStack. 为什么选择Chef,是因为Chef对Window的支持非常的好。 Chef的官方网站,https://www.chef.io/. 其当前...

    最近在学习Chef, Chef 就是现在比较热门的自动化运维工具之一,其他的工具还有Ansible, Puppet, SaltStack.  为什么选择Chef,是因为Chef对Window的支持非常的好。

    Chef的官方网站,https://www.chef.io/. 其当前最新的版本信息如下,

    • Chef Server版本是chef-server-core_12.8.0
    • Chef client的版本chef-client-12.13.37
    • chef 管理台的版本是chef-manage_2.4.3 
    • chef dev kit的最新版本是0.17.17

    根据百度百科的定义,Chef是IT自动化平台,可让客户创建、部署、变更和管理基础设施运行时环境和应用。Chef是平台无关的,可以部署到云端、本地或作为虚机(VM)。Chef也被称为部署自动化工具和DevOps使能者,它是一款可以为不同规模企业提供许多集成选项的产品。

    Chef是IT自动化平台,可让客户创建、部署、变更和管理基础设施运行时环境和应用。Chef是平台无关的,可以部署到云端、本地或作为虚机(VM)。Chef也被称为部署自动化工具和DevOps使能者,它是一款可以为不同规模企业提供许多集成选项的产品。
    客户用Chef来创建、管理和部署应用栈、裸服务器以及VM。Chef平台主要基于客户/服务器。受管理的系统运行Chef客户端,后者再利用HTTP RESTful API连接Chef服务器。Chef服务器包含有一个数据库,里面存储有“配方”,“配方”会被打包成独立的“食谱”,代表着运行在客户端的独立组件—比方说JavaWebSphere以及MySQL等,还会保留着所有受管理机器的详细目录。
    这些配方是用来创建部署和集成应用所需的组件的可重用建构块的。配方会合并进上面提到过的食谱。一旦编写或从Chef社区下载后,cookbook和recipe就可以作为模板来构建应用栈。这让客户可以以一致和可重复的形式创建、管理和部署环境,并且加速了这些环境的部署速度。Chef被格式用来显著减少人工的服务开通准备工作,以及应用和数据中心资源的管理时间。
    Chef的架构如下图所示意,

    Chef的主要优缺点如下(http://blog.takipi.com/deployment-management-tools-chef-vs-puppet-vs-ansible-vs-saltstack-vs-fabric/)

    When to use it: Before considering Chef, make sure you’re familiar with Git, as it’s required for configuration, and Ruby, as you’ll have to be writing in it. Chef is good for development-focused teams and environments. It’s good for enterprises looking for a more mature solution for a heterogeneous environment.

    Price: Free open source version, standard and premium plans priced on a per node per month basis that can get down to $6/node/month or $6.75/node/month respectively at high volume.

    Pros:

    • Rich collection of modules and configuration recipes.
    • Code-driven approach gives you more control and flexibility over your configurations.
    • Being centered around Git gives it strong version control capabilities.
    • ‘Knife’ tool (which uses SSH for deploying agents from workstation) eases installation burdens.

    Cons:

    • Learning curve is steep if you’re not already familiar with Ruby and procedural coding.
    • It’s not a simple tool, which can lead to large code bases and complicated environments.
    • Doesn’t support push functionality.
    网上关于Chef的资料比较多,大家可以自己搜索。笔者就不在啰嗦。 因为最近笔者在尝试安装最新的版本,但是网络的资料大部分都是 Chef Server 11版本的资料,而Chef 12的安装和Chef 11的安装还是有区别的。具体安装请读者参考后续文章。



    展开全文
  • 文章目录项目实战:CMCD自动化资产扫描和自动化运维1、项目介绍2、项目技术分析运维自动化难点和痛点项目技术难点整体工程设计3、项目环境搭建项目环境要求项目环境的搭建项目目录的配置 项目实战:CMCD自动化资产...

    项目实战:CMDB自动化资产扫描和自动化运维

    1、项目介绍

    本项目基于Linux系统搭建系统集群,使用Ansible实现Linux集群下的批量部署和自动化管理,实现Web形式的自动化运维系统,集中批量控制服务器,最终实现能支撑1000台实例的环境提供管理和自动化任务,提高运维工程师的工作效率和质量。项目基于HTTP实现自动化任务接受和响应接口设计,基于MySQL用作的关系型数据存取,基于Redis的任务锁机制和消息队列, 基于MongoDB的事件日志记录, 最终实现邮件通知功能、敏感数据加密功能、日志事件记录功能。

    主要目标是实现自动化资产扫描, 扫描指定网段的服务器资产信息,后续功能会进一步完善。

    2、项目技术分析

    在这里插入图片描述

    运维自动化难点和痛点

    • 开发人员: 没有系统管理、网络管理等相关运维工作经验,项目设计往往是大打折扣的。
    • 运维人员: 不具备开发能力、没有项目的开发经验或能力
    • 做好一个优秀的运维开发人员DevOPS = 运维能力 + 开发能力

    项目技术难点

    • 基本技能
      • DevOPS构建之路
      • Python基础语法
      • Django框架
    • 自动化资产扫描发现
      • 资产扫描的作用
      • nmap的作用
      • telnetlib端口扫描
      • pexpect登录探测
      • paramiko登录探测
      • Docker容器扫描
      • KVM虚拟机扫描
      • snmp网络设备扫描
      • SDK调用扫描ESXI资产信息
    • Ansible自动化任务
      • Ansible的安装与配置
      • Python与Ansible的操作
      • Ansible adhoc
      • Ansible playbook
      • 核心类调用
      • API 接口的封装
      • 方法的改写
      • Redis消息存储
      • Mongo事件日志

    整体工程设计

    • 资产的自动化扫描发现
      用Python程序扫描发现企业内部的所有资产(服务器资产),当资产出现变动时能自动及时的发现并完成资产变更(eg: 服务器IP变更、机器集体报废)。
    • Ansible的自动化任务执行
      用Ansible的ad-hoc和playbook实现批量主机的自动化任务。

    3、项目环境搭建

    项目环境要求

    • Python解释器:3.x
    • Django框架:2.x
    • IDE编辑器工具Pycharm:不限制
    • 自动化运维工具Ansible:2.x
    • 关系型数据库MySQL/Mariadb:5.5.x
    • Git工具与Git代码仓库:不限制

    项目环境的搭建

    项目目录的配置

    • 创建Django项目devops
      在这里插入图片描述

    如果有云服务器时执行下面的操作,没有云服务器的操作在这个之后进行说明

    • 连接并配置远程服务器
      [tools]>[Deployment]
      在这里插入图片描述

      • 配置本地目录和远程服务器目录的映射(Mapping)

      在这里插入图片描述
      上述操作完成,修改本地文件,远程服务器文件也同时被修改。

    远程服务器虚拟环境的配置

    • 连接远程服务器命令行bash
      在这里插入图片描述
    • 创建虚拟环境并激活虚拟环境
    cd /data/www/devops
    virtualenv
    -p /usr/bin/python3 env
    source env/bin/active
    pip install Django==2.2
    
    • 出现的报错及处理方式
    # sqlite版本问题
    django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
    

    解决方式:不使用sqlite存储数据,使用mysql

    # CMDB/settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'devopsProject',
            'USER': 'devops',
            'PASSWORD': '',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }
    
    • 远程服务器解释器和目录映射的配置

    在这里插入图片描述

    • 在远程服务器上测试Django项目是否运行成功
    python manage.py runserver
    

    如果没有云服务器直接进行虚拟环境的创建
    执行下面命令:

    witch python3  # /usr/bin/python3
    virtualenv -p /usr/bin/python3 env     #创建虚拟环境
    source env/bin/active		#切换到虚拟环境
    pip install Django==2.2 
    

    MySQL数据库配置

    (远程)用户登录配置

    • 管理数据库服务
    [root@foundation0 ~]# systemctl start mariadb
    [root@foundation0 ~]# systemctl enable mariadb
    
    • 用户授权
    [root@foundation0 ~]# mysql -uroot -pServer version: 5.5.52-MariaDB MariaDB Server
    
    # 创建数据库
    MariaDB [(none)]> create database if not exists devopsProject default charset
    utf8;
    Query OK, 1 row affected (0.01 sec)
    # 新建用户
    MariaDB [(none)]> create user devops@'%' identified by 'westos';
    Query OK, 0 rows affected (0.03 sec)
    # 用户授权
    MariaDB [(none)]> grant all on devopsProject.* to devops@'%';
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> Bye
    
    • 测试用户授权是否成功
    [root@foundation0 ~]# mysql -udevops -pwestos -hIP
    Server version: 5.5.52-MariaDB MariaDB Server
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | devopsProject    
    |
    +--------------------+
    2 rows in set (0.01 sec)
    

    Django数据库配置

    # CMDB/settings.py
    ALLOWED_HOSTS = ['*']
    #
    配置数据库: 使用mysql数据库,而不是默认的sqlite数据库。
    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 'devopsProject',
           'USER': 'devops',
           'PASSWORD': 'devops',
           'HOST': '47.92.255.98',
           'PORT': '3306',
     
    }
    }
    # 语言和时区的设置
    LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'
    
    • 生成数据库表
    python manage.py makemigrations  # 生成迁移脚本
    python manage.py migrate
    # 写入数据库, 创建关于用户和用户组等数据表信息
    python manage.py createsuperuser # 创建超级用户
    # 启动项目, 访问网址http://IP:8000/admin
    python manage.py runserver 0.0.0.0:8000
    
    • 测试数据表是否创建?数据信息是否写入?
      连接mariadb数据库
      在这里插入图片描述

    配置数据库信息
    在这里插入图片描述
    如果是本地数据库,Host填写127.0.0.1即可

    访问数据库表和数据内容
    在这里插入图片描述

    数据库报错处理

    运行项目时,出现报错如下,是因为缺少mysqlclient安装包.
    在这里插入图片描述
    解决方法:

    pip install mysqlclient

    安装失败,报错如下是缺少开发包的缘故。
    在这里插入图片描述

    解决方法

    yum install mariab-devel -y
    yum install python-devel -y
    

    4、第一个DevOPS工程

    项目功能

    记录HTTP访问的IP及用户UA信息

    • 运维模块: 了解运维的工作、Linux系统的基本操作、数据库基本管理操作、网络知识等。
    • 开发模块: 本项目的重点, 掌握Python基础知识、常见数据类型、Django框架的技术模块、DevOPS项目构建模块等。

    项目开发步骤

    • 创建Django工程
    • 创建Django APP应用
    $ python manage.py startapp scanhosts
    
    • 文件配置settings
    # settings.py
    # 1). 将新建的APP加入到项目中
    INSTALLED_APPS = [
    ......省略部分
       'django.contrib.staticfiles',
       'scanhosts',
    ]
    # 2). 配置数据库: 使用mysql数据库,而不是默认的sqlite数据库。
    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 'devopsProject',
    # 数据库名称       'USER': 'devops', # 用户名
           'PASSWORD': 'westos', # 用户密码
           'HOST': '127.0.0.1', # 数据库服务器所在主机名
           'PORT': '3306', # 数据库端口
     
    }
    }
    # 3). 语言和时区的设置(根据自己项目的需求, 选择修改)
    # LANGUAGE_CODE = 'en-us'
    # TIME_ZONE = 'UTC'
    LANGUAGE_CODE = 'zh-hans' # 语言选择中文
    TIME_ZONE = 'Asia/Shanghai' # 时区选择亚洲/上海
    
    • 数据库模型建模models
      在这里插入图片描述

    安装数据库开发软件

    $ yum install mariadb-devel -y
    

    安装数据库连接模块(必须先安装mariadb-devel, 否则会报错)

    $ pip install mysqlclient
    

    编辑数据库模型文件:

    # models.py  
    """
    - 一个类对应一个数据库表;
    - 类的一个属性对应数据库表的一个表头;
      - max_length: 字符串最大长度, 对应数据库的varchar类型
      - default: 指定默认值
      - verbose_name: 指定Django后台显示的列头信息
      - auto_now: 每次修改记录时自动更新为当前时间
    - Meta类的设置
    - verbose_name: 指定Django后台显示的表名称单数
    - verbose_name_plural: 指定Django后台显示的表名称复数
    - db_table: 指定数据库表的名称, 默认是APP名称_类名称.
    """
    class UserIPInfo(models.Model):
       ip = models.CharField(max_length=150, default='', verbose_name='IP地址')
       time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
       class Meta:
           verbose_name = '用户访问地址信息表'
           verbose_name_plural = verbose_name       db_table = 'user_IP_info'
    class BrowseInfo(models.Model):
       # null=True: 是针对数据库而言,True表示数据库的该字段可以为空。
       user_agent = models.CharField(max_length=100, default='',
                                     verbose_name='用户浏览器信息', null=True)
       disk_id = models.CharField(max_length=256, default='', verbose_name='唯
    一设备ID')
       """
      ForeignKey是一种关联字段,将两张表进行关联的方式
      on_delete: 是否级联删除, Django1.x默认级联删除, Django2.x必须手动指定
      on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
          CASCADE:此值设置,是级联删除。
          PROTECT:此值设置,是会报完整性错误。
          SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
          SET_DEFAULT:此值设置,会把设置为外键的默认值。
          SET():此值设置,会调用外面的值,可以是一个函数。
     
    """
       user_ip = models.ForeignKey('UserIPInfo', on_delete=models.DO_NOTHING)
       class Meta:
           verbose_name = '用户浏览器信息表'
           verbose_name_plural = verbose_name
           db_table = 'browse_info'
    

    根据ORM(对象关系映射)将面向对象形式的模型进行迁移, 生成中间代码

    $ python manage.py
    makemigrations
    # 代码执行效果, 生成迁移文件,所在位置: scanhosts/migrations
    Migrations for 'scanhosts':
    scanhosts/migrations/0001_initial.py
       - Create model UserIPInfo
    

    将生成的迁移文件转成SQL语句并执行SQL语句, 创建对应的数据库及数据库表

    $ python manage.py migrate
    
    • Django后台管理界面
      创建后台管理的超级用户
    $ python manage.py
    createsuperuser
    Username (leave blank to use 'kiosk'): admin
    Email address: admin@qq.com
    Password:
    Bypass password validation and create user anyway? [y/N]: y
    Superuser created successfully.
    

    启动Django项目,默认开启的端口是8000

    $ python manage.py runserver
    Django version 2.2.5, using settings 'first_devops.settings'
    Starting development server at http://127.0.0.1:8000/
    

    访问项目后台管理界面, 输入超级用户名称和密码即可进入后台界面.
    在这里插入图片描述

    • 项目工程设计
      当用户发起HTTP请求时, Django的采集接口将HTTP请求的头部信息headers里面的IP和UA信息采集, 并存储到数据库中。 当用户想要访问采集数据时, 从数据库中读取,以界面的方式展示给用户。
      在这里插入图片描述
    • 项目开发

    项目开发(一) 信息采集接口的实现

    • url设计
      配置URL, 当用户访问http://127.0.0.1:8000/sendinfos这个网址时, 将用户请求交给user_info视图函数处理。
    # first_devops/urls.py
    urlpatterns = [
       path('admin/', admin.site.urls),
       url(r'^sendinfos/$', user_infos),
    ]
    
    • 视图函数的实现
    # scanhosts/views.py
    def user_info(request):
       # request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP
    地址和用户Agent(通常是浏览器的名称和版本号)
       ip = request.META.get('REMOTE_ADDR')
       user_agent = request.META.get('HTTP_USER_AGENT')
       # 使用filter()方法对数据进行过滤, 返回的是列表, 列表元素是符合条件的对象。
       user_obj = UserIPInfo.objects.filter(ip=ip)
       # 如果没有找到,则新建UserIPInfo对象,并获取对象编号(为了和BrowseInfo表关联)
       if not user_obj:
           res = UserIPInfo.objects.create(ip=ip)
           user_ip_id = res.id
       else:
           user_ip_id = user_obj[0].id
       # 新建BrowseInfo对象
       BrowseInfo.objects.create(user_agent=user_agent, user_ip_id=user_ip_id)
       # 字典封装返回的数据信息
       result = {
           'STATUS': 'success',
           'INFO': 'User Info',
           'IP': ip,
           'User-Agent': user_agent
     
    }
       # 以json的方式封装返回, 下面的两种方式任选一种.
       # return
    HttpResponse(json.dumps(result),
    content_type='application/json')
       return JsonResponse(result)
    
    • 浏览器访问效果图
      在这里插入图片描述
      浏览器访问结束后, 访问MySQL数据库, 看是否将数据信息采集成功并通过ORM的方式写入数据库中。
    [root@foundation0 ~]# mysql -udevops -p
    Welcome to the MariaDB monitor.
    Commands end with ; or \g.
    MariaDB [(none)]> use devopsProject;
    MariaDB [devopsProject]> select * from user_IP_info;
    MariaDB [devopsProject]> select * from browse_info;
    

    项目开发(二)信息获取接口的实现

    • url设计
      配置URL, 当用户访问http://127.0.0.1:8000/getinfos这个网址时, 将用户请求交给user_history视图函数处理。
    # first_devops/urls.py
    urlpatterns = [
       path('admin/', admin.site.urls),
       url(r'^sendinfos/$', user_info),
       url(r'^getinfos/$', user_history),
    ]
    
    • 视图函数的实现
    # scanhosts/views.py
    def user_history(request):
       # 获取UserIPInfo表的所有对象信息;
       ip_lists = UserIPInfo.objects.all()
       infos = {}
       # 获取每个IP访问网站浏览器的信息, 格式如下:
       """
     
    infos = {
          '127.0.0.1' : ['UA-1', 'ua-2'],
          '172.25.254.1' : ['UA-1', 'ua-2'],
      }
      """
       for item in ip_lists:
           infos[item.ip] = [b_obj.user_agent for b_obj in
    BrowseInfo.objects.filter(user_ip_id=item.id)]
       result = {
           'STATUS': 'success',
           'INFO': infos
     
    }
       return JsonResponse(result)
    

    Django项目日志管理

    在编写程序过程中,很难免的会出现一些问题,程序并非按照我们预想的那样运行,这个时候我们通常会对程序进行调试,来看看到底是哪边出了问题。而程序日志是来帮助我们记录程序运行过程的帮手,善用日志的程序员也就能很快找出自己程序的问题所在从而快速解决问题。

    在服务器级别的组件中都有对应的日志文件,例如MySQL、Redis、nginx、uWSGI都会在运行过程中将一些信息写到日志文件中。

    Django使用python的内置模块logging来管理自己的日志, 包含四大组件: 日志记录器Loggers、日志处理器Handlers、日志过滤器Filters和日志格式化工具Formatters。
    在这里插入图片描述
    Django项目日志管理详情查看官方文档:https://docs.djangoproject.com/en/2.2/topics/logging/

    • 配置日志的相关信息
    # first_devops/settings.py
    # 日志管理的配置
    LOGGING = {
       'version': 1,
       # disable_existing_loggers是否禁用已经存在的logger实例。默认值是True.
       'disable_existing_loggers': False,
       # formatters: 定义输出的日志格式。
       'formatters': {
           'verbose': {
               # 格式化属性查看资料:
    https://docs.python.org/3/library/logging.html#logrecord-attributes
               'format': '{levelname} {asctime} {module} : {lineno} {message}',
               # 变量的风格
               'style': '{',
               # 日期显示格式
               'datefmt': '%Y-%m-%d %H:%M:%S',
         
     
    },
    },
       # handlers定义处理器。
       'handlers': {
           'file': {
               # 日志处理级别
               'level': 'INFO',
               # 日志处理类, 详细的请查看网站:
    https://docs.python.org/3/library/logging.handlers.html
               'class': 'logging.FileHandler',
               # 日志处理后输出格式
               'formatter': 'verbose',
               # 记录日志的文件名, 存储在当前项目目录下的devops.log文件
               'filename': os.path.join(BASE_DIR, 'devops.log')
         
     
    },
    },   # loggers定义logger实例。
       'loggers': {
           'django': {
               # 对应的handles对象列表
               'handlers': ['file'],
               # logger实例输出的日志级别
               'level': 'INFO',
               # 日志是否向上级传递。True 向上级传,False 不向上级传。
               'propagate': True,
         
     
    },
    }
    }
    
    • 写入日志
      修改视图函数的逻辑内容, 在合适的位置添加日志输出, 便于程序的测试与排错。
      在这里插入图片描述
    • 重新访问网页, 查看devops.log文件测试日志是否成功写入
      在这里插入图片描述

    Django项目邮件告警管理

    在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现。Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统。通常用于发送自定义消息或者通知告警等信息(当然
    也可以通过短信接口或者微信接口, 便于维护人员快速响应)。

    在这里插入图片描述

    • 服务器端开启smtp协议支持(此处以QQ邮件服务器为例服务器)
      在这里插入图片描述
    • 客户端配置settings文件
    # first_devops/settings.py
    # 邮件配置
    EMAIL_HOST = 'smtp.qq.com'
    EMAIL_HOST_USER = 'QQ邮箱'
    EMAIL_HOST_PASSWORD = '登录授权码(注意: 不是登录密码)'
    EMAIL_PORT = 465
    EMAIL_SUBJECT_PREFIX = 'Python开发社区'
    EMAIL_USE_SSL = True
    
    • 在Django的交互式环境测试邮件是否发送成功
    $ python manage.py
    shell
    >>> from django.core.mail import send_mail
    >>> help(send_mail)
    >>> send_mail(subject="Django邮件发送测试代码", message='邮件发送测试成功',
    from_email='发送人的邮箱地址', recipient_list=['接收人的邮箱地址1', '接收人的邮箱地址2'])
    1
    
    • 查看邮箱是否收到测试邮件

    发送邮件在很多业务场景都会适用, 为了方便操作, 将邮件发送的内容封装成一个工具, 减少开发过程中的重复操作, 提高效率。 操作如下:

    • 将项目常用的功能封装到utils模块中, 创建的项目结构,如下:
      在这里插入图片描述
    • 编写封装类SendMail的类
    # first_devops/scanhosts/utils/tools.py
    import logging
    from django.core.mail import send_mail
    from datetime import datetime
    from first_devops import settings
    class SendMail(object):
       """发送邮件的封装类"""
       def __init__(self, subject, message, recipient_list, ):
           # 给每个邮件的标题加上当前时间, 时间格式为年月日_小时分钟秒_传入的邮件标题
           subject_time = datetime.now().strftime('%Y%m%d_%H%M%S_')
           self.recipient_list = recipient_list
           self.subject = subject_time + subject
           self.message = message
       def send(self):
           try:
               send_mail(
                   subject=self.subject,
                   message=self.message,
                   from_email=settings.EMAIL_HOST_USER,
                   recipient_list=self.recipient_list,
                   fail_silently=False
             
    )
               return True
           except Exception as e:
               logging.error(str(e))
               return False
    
    • 在Django自带的交互式环境shell‘中进行测试
    $ python manage.py
    shell
    >>> from scanhosts.utils.tools import SendMail
    >>> mail = SendMail('Django 测试标题', '邮件正文内容', ['976131979@qq.com'])
    >>> mail.send()
    True
    

    5、第二个DevOPS工程

    在这里插入图片描述

    • 使用Pycharm编辑器工具创建devops项目。

    Django工程多配置文件

    在这里插入图片描述

    • base.py文件: 基本的配置文件,将原先seetings.py文件的内容拷贝进来.(参考第一个devops项目)
      • 配置数据库
      • 配置时区和语言
    • development.py文件: 开发环境的配置文件
    from .base import  *
    DEBUG = True
    
    • production.py文件: 生产环境的配置文件
    from .base import  *
    # 开发环境一定要关闭调试模式
    DEBUG = False
    # 允许所有主机访问
    ALLOWED_HOSTS = ['*']
    
    • 修改manage.py文件, 默认寻找的设置文件是当前项目中的settings文件, 如果是开发环境, 修改如下:
    def main():
       os.environ.setdefault('DJANGO_SETTINGS_MODULE',
    'devops.settings.development')
    # ......此处省略代码
    if __name__ == '__main__':
       main()
    

    如果项目将来需要上线, 修改启动项目访问的配置文件为生产环境的配置文件即可, 如下:

    def main():
       os.environ.setdefault('DJANGO_SETTINGS_MODULE',
    'devops.settings.production')
    # ......此处省略代码
    if __name__ == '__main__':
       main()
    
    • 启动项目
    $ python manage.py runserver
    Django version 2.2.5, using settings 'devops.settings.development'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    

    Django工程应用与模块加载

    为了方便在一个大的Django项目中,管理实现不同的业务功能, 我们会在项目中创建多个APP实现功能。为了更加方便管理APP, 项目结构更加清晰。可以专门创建apps目录存储项目应用, 专门创建extra_apps存储项目第三方APP, 项目结构如下所示:
    在这里插入图片描述
    但项目运行时, 不会自动寻找apps和extra_apps子目录中创建的APP, 需要手动在配置文件中配置,修改devops/settings/base.py文件, 添加内容如下:

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 将apps目录和extra_apps添加到python的搜索模块的路径集中
    sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
    sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
    

    添加成功后, 进入Django工程的交互式环境, 查看sys.path变量的值, 判断是否添加成功?

    $ python manage.py	shell
    In [1]: import sys                                                              
                                 
    In [2]: sys.path                                                                
                                     
    Out[2]:
    ['/home/kiosk/PycharmProjects/devops/devops/extra_apps',
    '/home/kiosk/PycharmProjects/devops/devops/apps',
    '/home/kiosk/PycharmProjects/devops',
    # .......此处为了美观, 省略部分路径........
    ]
    

    资产管理

    为什么优先实现资产管理?

    • 资产管理是运维的基本工作;
      在这里插入图片描述
    • 资产管理是DevOPS系统的基础;
      资产管理是自动化运维平台构建的基础。
      在这里插入图片描述

    资产管理探测流程

    在这里插入图片描述

    主机存活探测协议

    • ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
    • 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
      在这里插入图片描述

    主机存活探测模块和工具

    Nmap探测工具

    Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。是一款用于网络发现和安全审计的网络安全工具。

    • 主机发现 - 识别网络上的主机。例如,列出响应TCP和/或ICMP请求或打开特定端口的主机。
    # 使用-sP开关(Arp ping)执行PING命令,与windows / linux ping命令类似。
    $ ping -c1 -w1 172.25.254.197
    # 探测主机IP是否存活,
    &>/dev/null并将所有的输入重定向到垃圾箱
    # && 如果前面的指令执行成功, 做什么操作(echo ok)
    # || 如果前面的指令执行失败, 做什么操作(echo fail)
    $ ping -c1 -w1 172.25.254.250   &>/dev/null && echo ok || echo fail
    # 使用nmap命令, 如果报错-bash: nmap: command not found, 则yum 安装nmap安装包
    $ nmap -n -sP 172.25.254.197
    $ nmap -n -sP 172.25.254.0/24
    
    • 端口扫描 - 枚举目标主机上的开放端口。
    # Nmap默认端口的扫描范围1-10000
    $ nmap -n -p 172.25.254.197
    # 具体指定要扫描的端口为50-80
    $ nmap -n -p50-80 172.25.254.197
    # 具体指定要扫描的端口为22和80
    $ nmap -n -p22,80 172.25.254.197
    
    • 版本检测 - 询问远程设备上的网络服务以确定应用程序名称和版本号。
    • OS检测 - 确定网络设备的操作系统和硬件特性。
    # -O是检测操作系统交换机
    $ nmap -O 172.25.254.197
    
    • 可与脚本进行脚本交互 - 使用Nmap脚本引擎(NSE)和Lua编程语言。

    查看172.25.254.197这台 主机是否开启?
    在这里插入图片描述查看172.25.254.0/24局域网内存活的主机信息及存活主机个数。
    在这里插入图片描述

    Nmap的Python操作接口:python-nmap

    python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也持nmap脚本输出。

    # 安装nmap的第三方模块
    $ pip install python-nmap
    

    具体的代码调用如下:

    import nmap
    # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
    nm = nmap.PortScanner()
    # 以指定方式扫描指定主机或网段的指定端口
    result = nm.scan(hosts='172.25.254.0/24', arguments='-n -sP')
    print("扫描结果: ", result)
    # 返回的扫描具体的nmap命令行
    print("nmap命令行: ", nm.command_line())
    # 返回nmap扫描的主机清单,格式为列表类型
    print("主机清单: ", nm.all_hosts())
    # 查看指定主机信息
    print('172.25.254.197的主机信息: ', nm['172.25.254.197'])
    

    代码执行效果如下图所示:

    扫描结果:  
    {'nmap': {'command_line': 'nmap -oX - -n -sP 172.25.254.0/24', 'scaninfo': {},
    'scanstats': {'timestr': 'Wed Dec 25 16:14:47 2019', 'elapsed': '6.06',
    'uphosts': '2', 'downhosts': '254', 'totalhosts': '256'}}, 'scan':
    {'172.25.254.197': {'hostnames': [{'name': '', 'type': ''}], 'addresses':
    {'ipv4': '172.25.254.197'}, 'vendor': {}, 'status': {'state': 'up', 'reason':
    'syn-ack'}}, '172.25.254.250': {'hostnames': [{'name': '', 'type': ''}],
    'addresses': {'ipv4': '172.25.254.250'}, 'vendor': {}, 'status': {'state': 'up',
    'reason': 'syn-ack'}}}}
    nmap命令行:
    主机清单:
    nmap -oX - -n -sP 172.25.254.0/24
    ['172.25.254.197', '172.25.254.250']
    172.25.254.197的主机信息:  
    {'hostnames': [{'name': '', 'type': ''}], 'addresses': {'ipv4':
    '172.25.254.197'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'syn-ack'}}
    

    SSH端口存活扫描

    • 使用telnet命令探测主机列表是否属于Linux服务器。
      在这里插入图片描述
    • telnet命令探测
    $ telnet 172.25.254.34 22
    

    在这里插入图片描述

    • telnetlib模块探测
      telnetlib模块提供的Telnet类实现了Telnet协议。
    # 实例化对象
    tn = telnetlib.Telnet(host='172.25.254.34', port=22)
    # read_until读取直到遇到了换行符或超时秒数。默认返回bytes类型,通过decode方法解码为字符串。
    result = tn.read_until(b'\n', timeout=5).decode('utf-8')
    # 通过正则匹配且忽略大小写, 寻找是否ssh服务开启。
    searchObj = re.search('ssh', result, re.I)
    # 如果能匹配到内容, 说明ssh服务开启, 是Linux服务器.
    if searchObj:
        print("ssh服务是开启的,且是Linux操作系统")
    else:
        print('ssh服务未开启或者不是Linux服务器')
    

    扫描探测小结

    在这里插入图片描述

    主机登录探测

    什么是主机登录探测?

    用一系列的验证方式循环进行SSH登录, 得到争取的登录方式。

    主机SSH登录验证方式

    SSH常用来远程登录到远程机器,有两种常用的方法

    • 第一种便是账号密码登录。
    • 第二种就是公钥私钥无密码登录。(如何实现无密码登录?)

    Python的SSH登录模块pexpect

    Pexpect 用来实现与 ssh、ftp 、telnet 等程序的自动交互。是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python模块。

    pexpect的核心类和函数。

    • 直接进程运行run()函数, 返回结果和状态。
    import pexpect
    cmd_result, exitstatus = pexpect.run('hostname', withexitstatus=True)
    print("命令执行结果: ", cmd_result.decode('utf-8'))
    print("命令执行的状态码: ", exitstatus)
    

    执行结果如下:

    命令执行结果:foundation0.ilt.example.com
    命令执行的状态码:  0
    
    • pexpect指令执行的两种方式—无交互和交互式
    import pexpect
    
    # 1.通过pexpect执行指令(无交互)
    # 执行命令并返回命令执行结果和状态码(0代表成功,其他-执行失败)
    (command_output, exitstatus) = pexpect.run('hostname', withexitstatus=1)
    command_output = command_output.decode('utf-8')
    if exitstatus == 0:
        print("命令执行成功:", command_output)
    else:
        print("命令执行失败:", command_output)
    
    def login_ssh_password(user, host, password, port=22):
        # 2. 通过pexpect执行指令(有交互)
        command = 'ssh -p22 root@172.25.254.34'
        # command = 'ssh -p%s %s@%s' %(port, user, host)
        # spawn开启一个子进程处理交互式操作
        ssh = pexpect.spawn(command=command, timeout=3)
        # 匹配交互信息,返回的是匹配到的信息的索引
        match_index = ssh.expect(['Are you sure you want to continue connecting (yes/no)? ', 'password:'])
        print(match_index)
        # 如果索引为0代表第一次连接,如果索引为1代表非第一次连接
        if match_index == 0:
            print("第一次连接")
            ssh.sendline('yes')
            ssh.expect(['password:'])
            ssh.sendline(password)
        elif match_index == 1:
            print('非第一次连接')
            ssh.sendline(password)
    
        login_index = ssh.expect(['Last login: ', pexpect.EOF, pexpect.TIMEOUT])
        print(login_index)
        if login_index == 0:
            print("用户登录成功")
            # 进入元成服务器的命令行
            ssh.interact()
        elif login_index == 1:
            print("登录失败:Logout")
        elif login_index == 2:
            print('登录超时')
    
    if __name__ == '__main__':
        login_ssh_password(user='root',host='172.25.254.34', password='Asimov',port=22)
    
    pexpect模块的缺陷:
    • 依赖终端命令的方式
    • 不同的ssh登陆环境兼容性差

    Python的SSH登录模块paramiko

    • 什么是paramiko?
      **paramiko是一个用于做远程控制的模块,**使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
    • 安装paramiko
    # 使用豆瓣的镜像源, 安装paramiko模块并指定安装版本为2.6.0.
    $ pip install -i https://pypi.douban.com/simple paramiko==2.6.0
    
    • paramiko核心组件

    paramiko包含两个核心组件:SSHClient和SFTPClient(sftp=ssh file transfer protocol)。

    • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。

    • SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

    • 项目代码:基于paramiko实现ssh客户端密钥远程登录
      测试之前生成公钥和私钥进行测试:

    # 生成公钥和私钥, 默认存储在 ~/.ssh/目录下. id_rsa私钥, id_rsa.pub公钥
    ssh-keygen
    # 希望我的主机可以无密码连接其他主机(需要将公钥分发给其他主机)
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip
    # 测试无密码连接是否成功
    ssh user@ip
    ssh -i 私钥位置 user@ip
    
    import paramiko
    
    def login_ssh_password(hostname, port, username, password, command):
        # 实例化SSH客户端对象
        with paramiko.SSHClient() as client:
        #自动添加当前主机到远程服务器的known_hosts,远程连接不再询问yes/no
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 通过用户名和密码连接远程服务器
            client.connect(
                hostname=hostname,
                port=port,
                username=username,
                password=password,
            )
            # 连接成功后执行的命令
            stdin,stdout,stderr = client.exec_command(command)
            # 获取命令执行的正确输出
            # return stdin, stdout,stderr
            return stdout.read().decode('utf-8')
    
    def login_ssh_key(hostname, port, username, keyfile, command):
        # 实例化SSH客户端对象
        with paramiko.SSHClient() as client:
            # 配置私人密钥文件位置
            private = paramiko.RSAKey.from_private_key_file(keyfile)
            #自动添加当前主机到远程服务器的known_hosts,远程连接不再询问yes/no
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 通过用户名和密码连接远程服务器
            client.connect(
                hostname=hostname,
                port=port,
                username=username,
                password=private,
            )
            # 连接成功后执行的命令
            stdin,stdout,stderr = client.exec_command(command)
            # 获取命令执行的正确输出
            # return stdin, stdout,stderr
            return stdout.read().decode('utf-8')
    
    if __name__ == '__main__':
        # stdout = login_ssh_password(hostname='172.25.254.34',port=22,username='root',password='Asimov',command='uname')
        # print(stdout)
        stdout = login_ssh_key(hostname='172.25.254.34',port=22,username='root',keyfile='/home/kiosk/.ssh/id_rsa',command='uname')
        print(stdout)
    
    • SFTPClient实战代码: 上传和下载文件
      SFTPCLient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态。
    from_transport(cls,t)
    客户端通道
    put(localpath, remotepath, callback=None, confirm=True)   将本地文件上传到服务
    器 参数confirm:
    是否调用stat()方法检查文件状态,返
    回ls -l的结果
    get(remotepath, localpath, callback=None)
    从服务器下载文件到本
    地
    mkdir() 在服务器上创建目录
    remove() 在服务器上删除目录
    rename() 在服务器上重命名目录
    stat() 查看服务器文件状态
    listdir() 列出服务器目录下的文件
    

    具体的实例代码如下:

    import paramiko
    # 获取Transport实例
    with
    paramiko.Transport(('172.25.254.197', 22)) as tran:
      # 连接SSH服务端,使用password
      tran.connect(username="root", password='westos')
      # # 或使用
      # # 配置私人密钥文件位置
      # private = paramiko.RSAKey.from_private_key_file('./id_rsa')
      # # 连接SSH服务端,使用pkey指定私钥
      # tran.connect(username="root", pkey=private)
      # 获取SFTP实例
      sftp = paramiko.SFTPClient.from_transport(tran)
      # 设置上传的本地/远程文件路径
      localpath = "/etc/passwd"  remotepath = "/mnt/passwd"
      # 执行上传动作
      sftp.put(localpath, remotepath)
      # # 执行下载动作
      # sftp.get(remotepath, localpath)
    

    系统信息获取

    • 通过系统获取哪些信息
    命令作用举例
    主机名通过名称识别资产的作用、位置等信息Nginx01、KVM、aliyun01
    MAC地址记录网卡的信息,可以作为主机的唯一标识6e:40:08:f9:84:00
    SN物理服务器、网络设备有唯一的资产标识J156R12
    系统版本查看服务器系统和具体的版本Redhat7.0、Centos7.0、Ubuntu12.04
    服务器机型查看主机或者服务器类型Dell R610、HP、DL580
    • 为什么要获取这些信息

      • 有利于识别资产设备
      • 是资产的基本信息, 是自动化平台的基础(实现自动化任务执行、定时任务、自动化报表、监控等相关功能)
      • 此处只能实现主机类型信息的探测, 而不是Docker容器的探测
    • 获取信息的Linux命令介绍

      • 获取主机名的命令(选择通用方式): hostname、uname -a、cat /etc/sysconfig/network(主要针对Centos)
      • 获取系统版本: cat /etc/issue(可能为空)、cat /etc/redhat-release、uname、lsb_release
      • 获取MAC地址: cat /sys/class/net/ [^vtlsb] */address、ifconfig ens33
      • 获取服务器硬件机型: dmidecode -s system-manufacturer、dmidecode -s system-product-name

    Django数据库模型设计

    # apps/scanhost/models.py
    class Server(models.Model):
       """服务器设备"""
       sub_asset_type_choice = (
          (0, 'PC服务器'),
          (1, '刀片机'),
          (2, '小型机'),
     
    )   created_by_choice = (
          ('auto', '自动添加'),
          ('manual', '手工录入'),
     
    )
       sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice,
    default=0, verbose_name="服务器类型")
       created_by = models.CharField(choices=created_by_choice, max_length=32,
    default='auto', verbose_name="添加方式")
       hosted_on = models.ForeignKey('self', related_name='hosted_on_server',
                                     blank=True, null=True, verbose_name="宿主机",
    on_delete=models.CASCADE)  # 虚拟机专用字段
       IP = models.CharField('IP地址', max_length=30, default='')
       MAC
    = models.CharField('Mac地址', max_length=200, default='')
       model = models.CharField(max_length=128, null=True, blank=True,
    verbose_name='服务器型号')
       hostname = models.CharField(max_length=128, null=True, blank=True,
    verbose_name="主机名")
       os_type = models.CharField('操作系统类型', max_length=64, blank=True,
    null=True)
       os_distribution = models.CharField('发行商', max_length=64, blank=True,
    null=True)
       os_release = models.CharField('操作系统版本', max_length=64, blank=True,
    null=True)
       def __str__(self):
           return '%s-%s' % (self.id, self.hostname)
       class Meta:
           verbose_name = '服务器'
           verbose_name_plural = "服务器"
    
    • models.py文件做了修改一定要生成迁移脚本并写入数据库中
    python manage.py makemigrations
    python manage.py migrate
    # 创建超级用户用于后台登录
    python manage.py createsuperuser
    

    配置文件配置

    # devops\settings\base.py
    scanhosts = [
        # '127.0.0.1',
        '172.25.254.0/24',]
        # '47.92.255.98']
    commands = {
        'hostname': 'hostname',
        'os_type': 'uname',
        'os_distribution': 'dmidecode  -s  system-manufacturer',
        'os_release': 'cat /etc/redhat-release',
        'MAC': 'cat /sys/class/net/`[^vtlsb]`*/address',
    }
    

    视图函数

    import re
    import telnetlib
    
    import nmap
    import paramiko
    from django.http import HttpResponse
    from django.shortcuts import render
    
    # Create your views here.
    from CMDB.settings import base
    from apps.scanhost.models import Server
    
    
    def get_active_hosts(hosts):
        """根据提供的网段或者IP返回存活的主机IP"""
        # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
        nm = nmap.PortScanner()
        # 以指定方式扫描指定主机或网段的指定端口
        result = nm.scan(hosts=hosts, arguments='-n ')
        return nm.all_hosts()
    
    
    def is_ssh_up(host, port=22, timeout=5):
        # 实例化对象
        tn = telnetlib.Telnet(host=host, port=port)
        # read_until读取直到遇到了换行符或超时秒数。默认返回bytes类型,通过decode方法解码为字符串。
        result = tn.read_until(b'\n', timeout=timeout).decode('utf-8')
        # print(result)     #SSH-2.0-OpenSSH_7.4
        # 通过正则匹配且忽略大小写, 寻找是否ssh服务开启。
        searchObj = re.search('ssh', result, re.I)
        # 如果能匹配到内容, 说明ssh服务开启, 是Linux服务器.
        if searchObj:
            return True
        else:
            return False
    
    
    def login_ssh_key(hostname, port, username, keyfile, command):
        # 实例化SSH客户端对象
        with paramiko.SSHClient() as client:
            # 配置私人密钥文件位置
            private = paramiko.RSAKey.from_private_key_file(keyfile)
            # 自动添加当前主机到远程服务器的known_hosts,远程连接不再询问yes/no
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 通过用户名和密码连接远程服务器
            client.connect(
                hostname=hostname,
                port=port,
                username=username,
                password=private,
            )
            # 连接成功后执行的命令
            stdin, stdout, stderr = client.exec_command(command)
            # 获取命令执行的正确输出
            # return stdin, stdout,stderr
            return stdout.read().decode('utf-8')
    
    
    def scanhost(request):
        # 访问所有要扫描的网段/IP
        for host in base.scanhosts:
            print("正在扫描%s......" % (host))
            # 获取所有可以ping通的主机IP
            active_hosts = get_active_hosts(hosts=host)
            # 一次遍历判断ssh服务是否开启
            for active_host in active_hosts:
                if is_ssh_up(active_host):
                    server = Server()
                    # 设置IP地址
                    server.IP = active_host
                    # 执行指令
                    for attr, command in base.commands.items():
                        # attr ='hostname' , command = 'hostname'
                        # 存储主机名、操作系统.....指令执行的结果
                        result = login_ssh_key(active_host, 22, 'root', '/home/kiosk/.ssh/id_rsa', command)
                        setattr(server, attr, result)
                    server.save()
            return HttpResponse('扫描成功')
    

    路由配置

    # devops/urls.py
    urlpatterns = [
       path('admin/', admin.site.urls),
       path('scan/', scanhost)
    ]
    

    后台Admin管理

    # apps/scanhost/admin.py
    # 可以在admin后台管理服务器信息
    admin.site.register(Server)
    

    测试

    运行项目python manage.py runserver 0.0.0.0:8000

    展开全文
  • 书名DevOps自动化运维实践作者余洪春出版社机械工业出版社ISBN9787111610021DevOps自动化运维实践内容简介编辑语音本书的内容是对实际工作经验的总结,涉及大量的DevOps自动化运维知识点和专业术语,全书共分8...
  • 前面和大家分享了如何在Ubuntu的系统上安装Chef Client,这篇文章给大家分享一下如何在Window平台上通过WorkStation(安装在Ubuntu的系统上)来在Window系统上面自动安装Chef Client,笔者用Window 7 64bit的平台为...
  • 有的时候,我们需要window平台上执行一些knife子命令,比如,knife status --run-list 查看运行的run list的状态,knife search '*:*' -i 搜索所有的子节点 这个时候如果运行的话,就会出现下面的错误提示,Cannot ...
  • 现在云计算和DevOps的发展趋势,我觉得一个成熟的自动化运维平台应该包括以下的特性 现在云计算和DevOps的发展趋势,我觉得一个成熟的自动化运维平台应该包括以下的特性:   一、支持混合...
  • CODO是一个云管理平台,可为用户提供多混合云,自动化的操作和维护以及完整的开源。 基于Vue iview的开发,CODO前端为用户提供了友好的界面并增强了用户体验。 CODO后端基于Python Tornado,并且具有轻巧,简洁和...
  • devops-自动化运维工具

    2021-02-07 10:16:00
    宝塔面板 https://www.bt.cn/bbs/thread-19376-1-1.html 小皮面板 https://www.xp.cn/linux.html#install-show APPNode (强烈推荐) https://www.appnode.com/install urlos (适合云部署) ... ...
  • devops 自动化运维平台--一站式满足需求 功能点(按顺序实现): CMDB webssh √ 用户管理 √ 日志审计 √ 远程命令/脚本 文件分发 √ 环境部署 代码发布管理 数据库管理 DNS管理 √ 权限细分 接口管理 定时任务管理...
  • 个人自动化运维指南 如果中间内容对你有所帮助,可以帮我在 上点个 star ^v^ 目录 一、Let's Encrypt 证书自动颁发脚本 二、工具 三、Docker知识 一次构建多平台docker镜像 RedHat 开源企业镜像项目 Quay Docker ...
  • DevOps 发展融合运维可视

    千次阅读 2016-05-10 15:03:13
    DevOps,是开发(Development)和运维(Operations)的组合,代表一种文化、运动或实践,旨在促进软件交付和基础设施变更软件开发人员(Dev)和 IT 运维技术人员(Ops)之间的合作和沟通。它的目的是构建一种文化和...
  • DevOps运维平台构建

    2021-03-15 15:13:35
    如今很多人认为devops将彻底取代传统运维,我不这么认为,在我看来devops只是很大程度上的代替了传统运维的手工操作,运维人员只需写好自动化运维脚本,利用自动化工具(zabbix,elk,ansible等)就可以实现自动发布...
  • 自动化运维平台分析

    2020-10-26 11:44:22
    在项目上线完成后,业务系统或平台自然就转入了运维管控期,而...而今天要谈自动化运维平台,里面一个重点就是基于我们面对的运维场景,如何将运维操作或任务进行细粒度分解,然后再对运维操作进行组合和编排。 为...
  • 蓝鲸自动化运维平台

    千次阅读 2021-03-11 14:55:19
    蓝鲸自动化运维平台 1.蓝鲸简介 官网:https://bk.tencent.com/docs/ 腾讯蓝鲸智云,简称蓝鲸,是腾讯互动娱乐事业群(Interactive Entertainment Group,简称 IEG)自研自用的一套用于构建企业研发运营一体化体系的...
  • 使用flask从零构建自动化运维平台

    万次阅读 2018-11-16 14:58:08
    文章目录使用flask从零构建自动化运维平台安装开发ide开发思路使用到的flask拓展设计一个最常用的helloworld接口添加验证1. 使用ORM创建一个用户表2.设计用户登录接口3. 用户注册完成需要登录4. token的生成与验证5....
  • 2、 高级版——通过专业的自动化运维软件和平台(如CI平台) CI :Continuous Integration,持续集成 将整个开发过程尽量全部自动化完成。 3、关于辅助开发工具的选择——文本编辑器 UItraediter——UE:首选 ...
  • 杨文兵-从0到1腾讯自动化运维平台的设计与实践.pdf
  • 初期我们在建设和运营自动化运维平台时,只有系统运维人员做一些资产、配置或服务管理使用,但是随着平台功能的不断丰富,尤其是引入了多种角色的使用者后,如产品人员、研发或测试人员,我们就遇到了怎么给用户提供...
  • Adminset基于DevOps理念开发,以整合全部运维场景为己任。Adminset是一个真正的基于运维思维而开发的全自动化运维平台
  • 一、Devops简介 从手工编译、上传服务器文件、执行命令、...Devops一词来自于Development 和 Operations 的组合,从字面意思理解,就是让软件开发人员和运维人员更好的沟通合作,通过自动化流程让软件开发、测试...
  • 详解自动化运维平台的构建过程

    千次阅读 2016-12-22 13:45:45
    业务部署最开始是手工的,我们逐渐觉得应该有一个平台来满足我们的工作,所以我们打造了一个运维平台。本文将围绕平台里有关自动化的东西做一个介绍,当然我们是一个小团队,不足的地方请大家指正。传统运维带来的坑...
  • Adminset是一个真正的基于运维思维而开发的全自动化运维平台。 v0.50新功能 全新用户权限系统 基于用户角色的部署权限关联 基于用户权限的功能按钮自动显示隐藏 基于用户的WEBSSH授权 django安全更新 开发环境 ...
  • 官方网站: ... 企业自动化运维体验平台 : http://devops.linuxgc.com 用户名:test 密码:12345678 企业CMDB平台: http://cmdb.linuxgc.com 用户名:admin 密码:admin123qwe 阶段一:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,004
精华内容 6,401
关键字:

devops自动化运维平台