系统化运维工具ansible

  1. 云栖社区>
  2. 博客>
  3. 正文

系统化运维工具ansible

技术小牛人 2017-11-23 13:50:00 浏览705
展开阅读全文

一.ansible简介

  1. 什么是ansible?

   nsible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

 2. ansible特点

  1. 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

  2. 默认使用SSH协议对设备进行管理;

  3. 有大量常规运维操作模块,可实现日常绝大部分操作。

  4. 配置简单、功能强大、扩展性强;

  5. 支持API及自定义模块,可通过Python轻松扩展;

  6. 通过Playbooks来定制强大的配置、状态管理;

  7. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

  8. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。


3.架构图

图片.png

Ansible:Ansible核心程序

HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。

Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。

CoreModules核心模块,主要操作是通过调用核心模块来完成管理任务。

CustomModules自定义模块,完成核心模块无法完成的功能,支持多种语言。

ConnectionPlugins连接插件,Ansible和Host通信使用


二.ansible常用模块

1、主机连通性测试:

#ansible all -m ping执行效果如下:

图片.png

command:在远程主机执行命令;不支持|管道命令

[root@desperadochn ~]# ansible all -m command -a ‘ifconfig’
图片.png

2、Command

命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<,>|;,&”‘ 工作(需要使用(shell)模块实现这些功能)

action: command

chdir # 在执行命令之前,先切换到该目录

creates # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断

executable # 切换shell来执行命令,需要使用命令的绝对路径

free_form # 要执行的Linux指令,一般使用Ansible-a参数代替。

removes # 一个文件名,这个文件不存在,则该命令不执行,

creates相反的判断

3shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能,

例如管道等 :

图片.png

4copy:复制文件到远程主机,可以改权限等

相关选项如下:

backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

content:用于替代“src”,可以直接设定指定文件的值

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync

用法:

(1)     复制文件 -a “src= dest= ”

图片.png

     (2) 给定内容生成文件-a "content= dest= "

[root@ansiable ~]# ansible webservers -m copy -a ‘content=“hello\nworld” dest=/tmp/test.ansible mode=666’

图片.png

5file 设置文件属性:

创建目录:-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的情况


directory:如果目录不存在,就创建目录

file:即使文件不存在,也不会被创建

link:创建软链接

hard:创建硬链接

touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

absent:删除目录、文件或者取消链接文件

图片.png


6fetch从远程某主机获取文件到本地:

dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile

Src:在远程拉取的文件,并且必须是一个file,不能是目录

root@ansiable ~]# ansible webservers -m fetch -a 'src=/var/log/messages dest=/root' 

图片.png

7cron 管理cron计划任务:

“”设置管理节点生成定时任务

action: cron backup= # 如果设置,创建一个crontab备份 yes|no

cron_file= #如果指定使用这个文件cron.d,而不是单个用户

crontab

day= #日应该运行的工作( 1-31, *, */2, )

hour= # 小时 ( 0-23, *, */2, )

minute= #分钟( 0-59, *, */2, )

month= # ( 1-12, *, /2, )

weekday #  ( 0-6 for Sunday-Saturday,, )

job= #指明运行的命令是什么

name= #定时任务描述

reboot # 任务在重启时运行,不建议使用,建议使用special_time

special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly

(每周),daily(每天),hourly(每小时)

state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务

user # 以哪个用户的身份执行

nsible mysql_test -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate asia.pool.ntp.org &>/dev/null" '

每隔5分钟同步一下时钟服务器


9service: 服务程序管理

arguments #命令行提供额外的参数

enabled #设置开机启动。

name= #服务名称

runlevel #开机启动的级别,一般不用指定。

sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。

state #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置

启动nginx服务并设置范围自启动:

[root@ansiable ~]# ansible webservers -m service -a 'name=nginx state=started enabled=true' 启动服务

图片.png

10user模块管理

用户模块,管理用户帐号action: user

comment # 用户的描述信息

createhome # 是否创建家目录

force # 在使用state=absent行为与userdel force一致.

group # 指定基本组

groups # 指定附加组,如果指定为(groups=)表示删除所有组

home # 指定用户家目录

move_home # 如果设置为home=试图将用户主目录移动到指定的目录

name # 指定用户名

non_unique # 该选项允许改变非唯一的用户ID

password # 指定用户密码

remove # 在使用state=absent行为是与userdel remove一致

shell # 指定默认shell

state # 设置帐号状态,不指定为创建,指定值为absent表示删除

system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户

uid # 指定用户的uid

update_password # 更新用户密码

ansible web -m user -a 'name=tom comment="tom is tom" uid=1066 group=tom groups=wheel

shell=/bin/zshell home=/home/tomhome'

11group

用户组模块,添加或删除组

action: group

gid # 设置组的GID

name= # 管理组的名称

state # 指定组状态,默认为创建,设置值为absent为删除

system # 设置值为yes,表示为创建系统组

创建名为tom的组

[root@Ansible ~]#ansible web -m group -a 'name=tom state=present'

图片.png

12script在指定节点运行服务端的脚本

在本地写一个脚本,在其他机器上运行

[root@Ansible ~]#vim test.sh

#/bin/bash

touch /tmp/test.sh.log #创建/tmp/test.sh.log

echo “hello” >> /tmp/test.sh.log #date命令结果输出到/tmp/test.sh.log

web组中所有主机执行/root/test.sh脚本

[root@Ansible ~]#ansible web -m script -a ‘/root/test.sh’

[root@Ansible ~]#cat /tmp/test.sh.log hello

[root@node1 ~]#cat /tmp/test.sh.log hello

查看172.16.251.163主机下的/tmp/test.sh.log

[root@Ansible ~]#ansible 172.16.251.163 -m shell -a ‘cat /tmp/test.sh.log’

13setup模块

facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。

facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):

ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主机内存信息

图片.png

#ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口为eth0-2的网卡信息

图片.png

Ansible playbook简介

playbookansible用于配置,部署,和管理被控节点的剧本。

通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。

也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

Ansible playbook使用场景

执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

Ansible playbook格式

文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。

在同一行中,#之后的内容表示注释,类似于shellpythonruby

YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。

同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理

playhostsvariablesrolestasks等对象的表示方法都是键值中间以”:”分隔表示,:”后面还要增加一个空格。

mysql.yml中,主要由三个部分组成。

hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hostshosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。

remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。

tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。

tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

 

使用ansible-playbook运行playbook文件,得到如下输出信息,输出内容为JSON格式。并且由不同颜色组成,便于识别。一般而言

绿色代表执行成功,系统保持原样

×××代表系统代表系统状态发生改变

红色代表执行失败,显示错误输出。

执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果


Playbook的核心元素:

Hosts:主机

Tasks:任务列表

Variables 变量

Templates:包含了模板语法的文本文件;

Handlers:由特定条件触发的任务;


Playbooks配置文件的基础组件:

Hosts:运行指定任务的目标主机;

remoute_user: 在远程主机上执行任务的用户;

sudo_user

tasks:任务列表

模块,模块参数;

格式:

(1) action: module arguments

(2) module: arguments

注意:shellcommand模块后面直接跟命令,而非key=value类的参数列表;

(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers

(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

handlers任务,在特定条件下触发;接收到其它任务的通知时被触发;

tasks

 name: TASK_NAME

module: arguments

notify: HANDLER_NAME

handlers:

 name: HANDLER_NAME

module: arguments

 

variables

(1) facts:可直接调用;

注意:可使用setup模块直接获取目标主机的facters

(2) 用户自定义变量:

(a) ansible-playbook命令的命令行中的

-e VARS, --extra-vars=VARS

(b) playbook中定义变量的方法:

vars:

- var1: value1

- - var2: value2

(3) 通过roles传递变量;

(4) Host Inventory

(a) 用户自定义变量

(i) 向不同的主机传递不同的变量;

IP/HOSTNAME varaiable=value var2=value2

(ii) 向组中的主机传递相同的变量;

[groupname:vars]

variable=value

[web]

172.17.251.188

172.17.250.209

[web:vars]

rpmname=samba

运行playbook的方式:

(1) 测试

ansible-playbook --check 只检测可能会发生的改变,但不真正执行操作;

ansible-playbook --list-hosts 列出运行任务的主机;

(2) 直接运行




实例1:远程安装smba并启动服务

1.vim /etc/ansible/hosts

图片.png

2.vim /etc/ansible/web.yuml

图片.png

3.执行

图片.png
图片.png

4.查看远程主机,服务已启动。

图片.png

还可以把一个任务打标签,启动的时候可以直接调用标签

vim web.yml

图片.png

调用标签启动服务:ansible-playbook web.yml -t

图片.png



本文转自    honeyorange   51CTO博客,原文链接:http://blog.51cto.com/13172732/2049031

网友评论

登录后评论
0/500
评论
技术小牛人
+ 关注