本文共 7089 字,大约阅读时间需要 23 分钟。
我们先来了解一下近年来大多数公司遇到的运维方面的问题:
1、硬件选型多样化 2、系统多版本并存 3、目录结构混乱 4、运维人员水平参差不齐 5、历史遗留问题多 6、同一软件出现多个版本 7、无法批量化操作 8、工作效率低,故障率高 9、项目上线操作繁琐 然而理想状态是这样的: 1、只有少数类型的硬件,便于管理 2、系统版本统一 3、目录结构规范 4、运维工程师水平层次高 5、无历史包袱 6、同一软件只有单一版本 7、同一类操作可自动化批量执行 8、工作效率高,无大量重复机械化操作 9、开发自己上线,运维比较轻松 理想很丰满,现实很骨感啊!!!!!!然而,我们还是要面对现实的,现实中我们要做些什么来更接近与理想呢? 1、添加监控,收集系统指标 2、对日志进行归档以及管理 3、数据备份于恢复 4、对计划任务进行管理 5、对软件包进行部署和管理 6、对脚本进行批量执行 7、对文件进行批量复制和移动 8、设置文件或者目录对应的权限 9、关闭和启动服务 10、对代码程序进行上下线 但是,要全部完成以上工作也是很难得呀!所以我们还是回到现实来吧!O(∩_∩)O哈哈~~~随着公司的发展,现在就需要更多的服务器去支撑,然而出现了一个摆在眼前的问题——要增加那么多台服务,难道要我们one-by-one的去增加和配置?其实这样也是OK的,但是呢,这是一个灰常笨的操作,然而有没有一个快速、方便、简单地做法呢?当然是有的啦!要不然真的要死啦!那么这个简单的方法是什么呢?他就是——ansible,一个自动化的运维工具。接下来我们就来简单地认识一下他呗?这样我们就可以稍稍达到理想状态啦!
ansible是新出现的自动化运维工具,基于Python开发,集 合了众多运维工具(puppet、chef、func、fabric)的优 点,实现了批量系统配置、批量程序部署、批量运行命令等 功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本 身没有批量部署的能力。真正具有批量部署的是ansible所 运行的模块,ansible只是提供一种框架。ansible不需要在 远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。ansible目前已经已经被红帽官方收购,是 自动化运维工具中大家认可度最高的,并且上手容易,学习 简单。是每位运维工程师必须掌握的技能之一。 补充一下其他的常用的自动化运维工具:工具 | 用途 | |
---|---|---|
安装系统 | Pxe/cobbler | 安装系统 |
虚拟化系统 | Kvm/xen/vmware | 虚拟机 |
应用部署 | Puppet/ansible/saltstack | 中大型规模 |
命令执行 | Ansible/fabric/func/shell | 中小型 |
1.部署简单,只需要在主控端部署ansible 环境,被控端无需做任何操作。
2.默认使用ssh协议对设备进行管理。 3.有大量常规运维操作模块,可实现绝大部分操作。 4.配置简单、功能强大、扩展性强。 5.支持API及自定义模块,可通过Python轻松扩展。 6.通过playbooks来定义强大的配置、状态管理。 7.提供了一个操作性强的web管理界面和RESET API接口——AWX平台。Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad- hoc和playbook:
1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组 3、加载自己对应的模块文件,如command 4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器 5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件 6、给文件+x执行 7、执行并返回结果 8、删除临时py文件,sleep 0退出1使用yum安装
yum install epel-release -yyum install ansible –y
2 使用pip(python的包管理模块)安装
pip install ansible如果没pip,需先安装pip.yum可直接安装:yum install python-pippip install ansible
ansible命令集
[root@node3 tmp]#ansible webtest -m command -a 'chdir=/tmp/ touch 1205'
creates # 一个文件名,当这个文件存在,则该命令不执行,可以 用来做判断
[root@node3 tmp]#ansible webtest -m command -a 'creates=/tmp/1205 ls'172.17.254.224 | SUCCESS | rc=0 >>skipped, since /tmp/1205 exists172.17.253.210 | SUCCESS | rc=0 >>skipped, since /tmp/1205 exists
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。 removes # 一个文件名,这个文件不存在,则该命令不执行,与 creates相反的判断[root@node3 tmp]#ansible webtest -m command -a 'removes=/tmp/1205 ls'
2、Shell
shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能, 例如管道等 :[root@ansiable ~]# ansible webtest -m shell - a ‘cat /etc/passwd |grep “root”’
3、Copy:复制文件到远程主机,可以改权限等
(1)复制文件 -a “src= dest= ” (2)给定内容生成文件 -a "content= dest= "[root@ansiable ~]# ansible webtest -m copy - a ‘content=“hello\nworld” dest=/tmp/test.ansible mode=666’
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项: yes|no content:用于替代“src”,可以直接设定指定文件的值 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目 录,那么该路径也必须是个目录 directory_mode:递归设定目录的权限,默认为系统默认权限 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如 果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes others:所有的file模块里的选项都可以在这里使用 src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果 路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则 只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全 部复制,类似于rsync。 4、file设置文件属性 创建目录:-a “path= state=directory” 创建链接文件:-a “path= src= state=link” 删除文件:-a “path= state=absent” force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立 的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软 链,有两个选项:yes|no group:定义文件/目录的属组 mode:定义文件/目录的权限 owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径 recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用 于state=link的情况 dest:被链接到的路径,只应用于state=link的情况 state: directory:如果目录不存在,就创建目录 file:即使文件不存在,也不会被创建 link:创建软链接 hard:创建硬链接 touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在, 则更新其最后修改时间 absent:删除目录、文件或者取消链接文件 还有其他几种常见命令的使用,这里就不在一一介绍,大家有兴趣的可以看一下ansible官网。1.playbook
playbook是ansible用于配置,部署,和管理被控节点的剧本。 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状 态。 playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点 必须要完成。 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在 Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及 组织计算机处理各种各样的事情。playbook的核心元素:cd /etc/ansiblevim nginx.yml- hosts: webtest remote_user: root tasks: - name: install nginx yum: name=nginx state=present - name: copy nginx.conf copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes notify: reload - name: start service service: name=nginx state=started tags: startmysql handlers: - name: reload service: name=nginx state=reloaded
其中主要由一下三个部分组成:
hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts, hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的 /etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的 时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。 remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也 可以使用sudo,但是用户必须要有执行相应task的权限。 tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。 tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必 须的,同时也要给予模块相应的参数。2.roles 对于以上所有的方式有个弊端就是无法实现复用假设在同时 部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个 yml文件,很难实现灵活的调用。 roles 用于层次性、结构化地组织playbook。roles 能够根 据层次型结构自动装载变量文件、tasks以及handlers等。要使用 roles只需要在playbook中使用include指令即可。简单来讲, roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置于单独的目录中,并可以便捷 地include它们的一种机制。角色一般用于基于主机构建服务的场 景中,但也可以是用于构建守护进程等场景中。 files/:存储由copy或script等模块调用的文件; tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml 进行“包含”调用; handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由 main.yml进行“包含”调用; vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由 main.yml进行“包含”调用; templates/:存储由template模块调用的模板文本; meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的 文件需要由main.yml进行“包含”调用; default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;以上就是本人对ansible工具的简单理解,如果有什么不正确的地方,欢迎大家指出。
转载于:https://blog.51cto.com/jieruma/2047681