技术交流 | 运用Ansible作为您的自动化核心
Posted 盘古天地集团
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术交流 | 运用Ansible作为您的自动化核心相关的知识,希望对你有一定的参考价值。
服务器系统是各式各样应用程序的基础,现代的应用程序应该是经过版本控制,测试和自动化等DevOps流程迭代生产出来的。 因此,寻找可以解决我们自动化需求的配置管理工具是非常关键的一步。自动化配置管理也能够抽象为一种新的云服务类型AaaS(Automation as a Service)。
配置管理工具并不是什么新鲜事物,它们已经存在一段时间了,但是它们的复杂性总是使应用它们成为一个困难的过程。 你会发现当你要完成一个简单或稍微复杂一点的任务时,用Puppet,Chef并不比自己写一段Shell脚本更简单和快捷。云星数据的RightCloud CMP(www.rightcloud.com.cn)混合云管理平台工程团队在架构和实现AaaS服务过程中,遵循了如下的选择标准:
- 稳定运行
- 安全可靠
- 可以轻松版本控制
- 不需要额外环境依赖
- 开箱即用、插件扩展
通过前期的验证对比,自动化工具栈中大量优秀的解决方案都是基于代理架构进行设计开发的重量级产品或框架,Puppet功能强大但过于复杂,Chef的架构并不完全符合我们的使用场景,两者原生架构都是基于代理Agent。直到Ansible的出现,Ansible是用Python语言开发的自动化配置管理框架。
Ansible的技术优势:
简单:使用YAML语法编写playbooks。 YAML是一种人类可读的数据表示语言。 这是非常简单的。 没有经过Ansible培训的用户也能够轻松阅读和理解Ansible手册,甚至可以理解如何配置系统。
无代理:以Push-based模式工作。许多早期的配置管理系统是基于Agent架构pull-based模式,在这种模式下节点Agent周期性的与中心服务器交换任务信息。虚拟化环境下Agent模式架构则会消耗更多的主机资源(因为每个被管理的VM节点都需要安装代理)。Agentless模式下远程主机节点没有任何守护Daemon进程,不消耗内存/CPU计算资源。
标准化:通过已有的连接传输机制来远程管理你的服务器系统。对于Linux和Unix服务器主机,在非受限环境下使用标准的SSH或OpenSSH,在一些受限环境中可以选择paramiko(python第三方库)来远程管理;对于Windows主机的远程管理则通过PowerShell来实现。
可扩展:模块是由python编写的小程序,它包括内置的参数机制,通过上面的传输机制放到远程目标机器的临时目录下,通过python解释器运行,之后将其删除。模块执行结果返回的数据格式为JSON,这些返回数据能够在Ansible Master控制机上集中处理。
Ansible的应用场景:
通常你会与其它配置管理工具(如Puppet,Chef,SaltStack等)来对比。Ansible不仅限于配置管理。它也可以用于许多不同的场景:
资源提供:应用系统需要服务器承载。如果你通过PXE (Preboot eXecution Environment) 启动一台物理服务器、通过模板在虚拟化环境下创建虚拟机、通过云环境的镜像生成云主机, Ansible都能够自动化全部流程。
配置管理:通过记录和更新硬件和软件的详细配置信息,确保IT环境的一致性。 这些信息通常包括哪些版本的软件包需要安装、哪些服务器主机的系统服务需要运行、开放哪些端口等。
应用部署:开发团队能够通过定义Playbook,处理应用安装部署的任务项,例如:复制war包到服务器指定目录下、添加config.xml文件到/etc/myapp目录下、执行java-jar命令等。
安全合规:通过执行特定安全检查的Playbook任务,可以将扫描和修复范围的安全策略完全自动化到日常检查中。
资源编排:单个独立配置并不能提供完整的环境需求,需要定义多个配置、部署之间如何交互,并确保不同的部分可以作为一个整体进行管理。Ansible通过动态变量注册、事件驱动机制实现对多个Playbook的整合,组成可以服用的角色Role。
Ansible架构解析:
· API:命令行工具CLI和Python API编程接口。
· Modules:模块代码在被管理的远程服务器行执行。模块能够控制系统资源, 例如服务、软件包以及文件或执行系统命令,有超过450个以上的Ansible模块提供格式各样的IT环境管理日常任务的支持。
- Notification 模块集中的 email 模块实现邮件的发送功能;
- Database 模块集中的mssql_db 模块提供远程主机上mysql数据库实例的创建、删除、导入数据的功能;
- Cloud 模块集ec2模块实现在AWS不同Region下云主机的创建、终止、启动、停止的功能;
· Plugins:允许执行任务时插入扩展,这些扩展通过一小python代码实现。Ansible默认带了一些很有用的Plugin插件,能够轻松开发自己的定制化Plugin。
- Cache plugins 用于保存收集到的管理目标的相关facts数据,避免每次执行耗时的facts收集任务重复执行;
- Callback plugins 允许你挂在回调函数,响应Ansible的相关事件,多用于显示执行结果和日志收集;
· Playbook:采用YAML语法格式描述模块任务的组合、变量注册/引用、逻辑判别的纯文本文件。通过它不能能够简单申明配置信息,更能够将任何可以手工顺序执行的任务集中编排到一块完成更为复杂的IT运维场景需求。
企业级Ansible自动化服务需求:
· 可视化Inventory管理;
· 实时监控Ansible Playbook的各项Task的执行状况;
· 内置的定时任务调度机制;
· 按项目组织维护Ansible Playbook,便于扩展重用;
· 与Git,SVN等版本控制管理工具的集成,参与DevOps相关流程阶段;
· 基于用户角色的访问控制、Playbook执行审计;
· 中心服务器水平伸缩,支持大量被管理节点;
· Dashboard,全面展示自动化任务配置状况、执行计划、执行状态的汇总情况;
让我们看看Ansible如何使用独特的无代理架构,实现应用服务的部署以及更为复杂的IT流程编排。
场景示例:
作为一个开发者,运维管理员越来越多地发现通过云基础设施(IaaS)申请的服务器主机需要安装Docker容器引擎来以容器化的方式跑应用、中间件环境以及数据库。那么通过Ansible是如何使这件日常任务变得非常容易的呢?接下来我们一步一步分解自动化流程的步骤和整个Docker引擎安装过程中用到的关键Ansible模块。
1. 创建工作目录
通过下面两条Shell命令,创建工作目录,并切换到该目录下
#mkdir ansible_docker
#cd ansible_docker
2. 准备inventory
这一步就是告诉Ansible Master需要在哪些目标主机上执行任务。编辑如下格式的纯文本文件,例如:可以命名为hosts
node1 ansible_ssh_host=192.168.33.201 ansible_ssh_user=root
node2 ansible_ssh_host=192.168.33.202 ansible_ssh_user=root
[docker_nodes]
node1
node2
注意:其中[docker]这个格式代表分组(Group),在后面的Playbook中通过引用来关联角色(Role)。这样我们就能轻松定义哪个角色的任务项在哪个分组的目标主机上执行的关联关系了。
3.配置全局变量
这一步的目的是定义,ansible playbook运行时可以访问的全局变量,变量定义格式为典型的key:value格式,变量之间可以通过{{key}}的方式引用。该全局变量有固定的目录结构和默认的文件命名。
执行下面的命令在工作目录下创建目录和编辑配置文件。
#mkdir group_vars
#cd group_vars
#vi all
我们选择了通过二进制文件的模式来安装docker,所以我们在全局变量文件all中做了如下变量定义:
1.# 目标主机上存放二进制文件执行的目录
2.BIN_DIR: /root/local/bin
3.# ansible master主机上存放下载的第三方软件包,预生成的CA证书,配置文件等目录
4.DATA_DIR: /opt/data
5.### docker配置
6.DOCKER_URL:"https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz"
7.DOCKER_DIR: "{{DATA_DIR}}/docker"
4.配置Ansible Role的目录结构
通过Role的方式来结构化Ansible Playbook的执行,需要对应的目录结构。首先需要创建一个名叫roles的顶级目录,然后创建一个名叫docker的目录,这个目录名称就代表角色名。
#mkdir roles
#cd roles
#mkdir docker
之后在角色目录下分别建立2个目录:tasks、templates。tasks目录下面存放yml格式的playbook文件,templates目录下存放jinja2格式的安装docker引擎需要的配置文件模板。
#cd docker
#mkdir task
#mkdir templates
5. 编写安装Docker引擎的Playbook
想想如果不是用偷懒的方法试用linux的包管理其程序yum,apt的方式来安装Docker,二进制文件方式如何安装呢?本质上通过yum,apt方式来安装docker也是通过二进制文件、文本配置文件的方式来完成的。
下面就来看看ansible的playbook通过内置核心模块实现安装任务的自动化。
5.1 编辑 ansible_docker/roles/node/tasks/main.yml
1.---
2.- name: 创建{{BIN_DIR}}目录
3. file:
4. dest={{BIN_DIR}}
5. state=directory mode=0740
6.
7.- name: 关闭firewalld服务
8. systemd:
9. name=firewalld
10. state=stopped
11. enabled=no
12.
13.- name: 修改iptables FORWARD chain的默认策略设置
14. iptables:
15. chain=FORWARD
16. policy=ACCEPT
17.
18.- name: 保存iptables规则配置
19. command: iptables-save
20.
21.- name: 复制docker二进制执行文件
22. copy:
23. src={{DOCKER_DIR}}/{{item}}
24. dest={{BIN_DIR}}/{{item}}
25. mode=0540
26. with_items:
27. - docker
28. - dockerd
29. - docker-init
30. - docker-proxy
31. - docker-runc
32. - docker-containerd
33. - docker-containerd-ctr
34. - docker-containerd-shim
35.
36.- name: 复制docker completion文件
37. copy:
38. src={{DOCKER_DIR}}/completion/bash/{{item}}
39. dest=/etc/bash_completion.d/{{item}}
40. mode=0440
41. with_items:
42. - docker
43.
44.- name: 创建/etc/docker目录
45. file:
46. dest=/etc/docker
47. state=directory
48.
49.- name: 创建docker-daemon.json.j2文件
50. template:
51. src=docker-daemon.json.j2
52. dest=/etc/docker/daemon.json
53.
54.- name: 创建docker.service文件
55. template:
56. src=docker.service.j2
57. dest=/etc/systemd/system/docker.service
58.
59.- name: 重新加载systemd
60. command: systemctl daemon-reload
61.
62.- name: 启动docker
63. service:
64. name=docker
65. state=restarted
66. enabled=yes
注意:playbook中的几个值得特别说明下的模块任务:
- name:复制docker二进制执行文件 这个task使用了copy模块,从ansible master主机的src属性指定的目录复制文件到目标主机dest属性指定的目录下,同时通过mode属性来指定目标主机下这些复制过去文件的权限。这些文件你通过DOCKER_URL: "https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz"下载到ansible master上解压缩后就全部有了。
- name:创建docker-daemon.json.j2文件 这个task使用了template模块,该模块会将docker-daemon.json.j2这个jnjia2的模板文件通过变量替换后复制到目标服务器主机由dest属性指定的路径下
- name:创建docker.service文件 这个task使用了template模块,该模块会将docker.service.j2这个jnjia2的模板文件通过变量替换后复制到目标服务器主机由dest属性指定的路径下。该文件为Systemd格式的服务定义文件。
6. 准备主入口Playbook
上面第5步,我们完成了Ansbile Role的开发编写,该Role定义了安装Docker需要自动化执行的模块任务。在运行之前还需要写一个入口Playbook,这个yaml文件放在项目的根目录下,内容非常简单,就是关联Inventory里面定义的Group和Role。
#vi install.yml
--- - hosts: docker_nodes gather_facts: False remote_user: root become: yes become_method: sudo roles: - docker
7.运行自动安装Docker
通过一条简单的Ansible CLI命令就可以启动整个自动化安装流程,在Ansible Master主机上进入项目工作目录ansible_docker
#ansible-playbook -i hosts install.yml
注意:有2点是成功执行的前提:1. 目标服务器主机与Ansible Master主机之间需要用root帐号做ssh免密码;2. 在Ansible Master主机上需要提前下载docker-17.04.0-ce.tgz,解压存放到/opt/data/docker目录下(由{{DATA_DIR}}, {{DOCKER_DIR}}两个全局白变量定义)
以上是关于技术交流 | 运用Ansible作为您的自动化核心的主要内容,如果未能解决你的问题,请参考以下文章
心领神会--自动化运维之Ansible的核心概念,安装配置Ansible并学会使用其常见模块。