系统化运维工具ansible

简介:

一.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
相关文章
|
19天前
|
机器学习/深度学习 运维 监控
智能监控系统在运维中的应用与优势
传统的运维管理方式在面对日益复杂的IT系统时显得力不从心,智能监控系统的出现为运维工作带来了新的机遇。本文将探讨智能监控系统在运维中的应用与优势,介绍其工作原理以及如何有效地利用智能监控系统提升运维效率和质量。
33 2
|
26天前
|
运维 监控 安全
现代化运维管理系统的关键特征与实践指南
在当今数字化时代,现代化运维管理系统正日益成为企业提升效率、降低成本的关键工具。本文将深入探讨现代化运维管理系统的关键特征,以及实践指南,帮助企业更好地应对技术挑战,提升运维效率。
|
28天前
|
人工智能 运维 监控
现代化运维管理系统的关键性作用与挑战
随着信息技术的快速发展,现代化运维管理系统在企业中扮演着越来越重要的角色。本文将探讨现代化运维管理系统的关键作用和面临的挑战,帮助读者深入了解该领域的发展趋势。
|
28天前
|
存储 运维 安全
构建高效自动化运维体系:Ansible与Docker的完美结合
【2月更文挑战第31天】 随着云计算和微服务架构的兴起,自动化运维成为保障系统稳定性和提升部署效率的关键手段。本文将详细探讨如何通过Ansible和Docker的结合来构建一个高效、可靠且易于管理的自动化运维体系。首先,介绍自动化运维的必要性及其在现代IT基础设施中的作用;然后,分别阐述Ansible和Docker的技术特点及优势;最后,提供一个基于Ansible和Docker结合使用的实践案例,以及实施过程中遇到的挑战和解决方案。
|
29天前
|
人工智能 运维 监控
现代化运维系统的关键技术与挑战
随着信息技术的快速发展,现代化运维系统成为企业管理的重要组成部分。本文将探讨现代化运维系统中的关键技术和面临的挑战,从自动化运维、容器化技术到监控与安全性等方面展开讨论,帮助读者更好地理解和应对运维领域的挑战。
|
30天前
|
运维 Prometheus 监控
构建高效自动化运维系统的关键策略
【2月更文挑战第30天】随着云计算和微服务架构的兴起,现代IT运维环境变得愈加复杂多变。为保持业务连续性、提高响应速度并降低成本,企业亟需构建一个高效的自动化运维系统。本文将深入探讨自动化运维系统构建过程中的关键策略,包括工具和技术选型、流程优化、监控与告警体系搭建以及持续集成/持续部署(CI/CD)实践,旨在为读者提供一个清晰的构建蓝图和实用的实施建议。
|
30天前
|
运维 安全 网络安全
构建高效自动化运维体系:Ansible与Docker的完美融合
【2月更文挑战第30天】在当今快速迭代和持续部署的软件发展环境中,自动化运维成为确保效率和稳定性的关键。本文将探讨如何通过结合Ansible和Docker技术,构建一个高效的自动化运维体系。我们将分析Ansible的配置管理功能和Docker容器化的优势,并展示它们如何协同工作以简化部署流程,增强应用的可移植性,并提供一致性的系统环境。此外,文章还将介绍一些最佳实践,帮助读者在真实环境中实现这一整合方案。
|
29天前
|
人工智能 运维 监控
构建高性能微服务架构:现代后端开发的挑战与策略构建高效自动化运维系统的关键策略
【2月更文挑战第30天】 随着企业应用的复杂性增加,传统的单体应用架构已经难以满足快速迭代和高可用性的需求。微服务架构作为解决方案,以其服务的细粒度、独立性和弹性而受到青睐。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、常用的技术栈选择以及性能优化的最佳实践。我们将分析微服务在处理分布式事务、数据一致性以及服务发现等方面的挑战,并提出相应的解决策略。通过实例分析和案例研究,我们的目标是为后端开发人员提供一套实用的指南,帮助他们构建出既能快速响应市场变化,又能保持高效率和稳定性的微服务系统。 【2月更文挑战第30天】随着信息技术的飞速发展,企业对于信息系统的稳定性和效率要求
|
3月前
|
弹性计算 运维 安全
ECS系统如何高效运维|开发者分享会
今天分享的内容来自阿里云弹性计算技术专家郑大禹的“ECS系统高效运维实践”。全文围绕ECS运维的痛点和挑战、如何实现高效运维以及典型案例分享这3个主题内容进行讲解。
111421 4