知识扩充
机器管理
机器管理的工具选择的考量可以包含以下三个方面:
- 是否简单,是否需要每台机器都部署Agent(客户端)
- 语言的选择(Puppet/Chef vs Ansible/SaltStack)开源技术,不看官网不足以熟练,不懂源码不足以精通:Puppet、Chef基于Ruby开发的,Ansible、SaltStack基于Python开发的。
- 速度的选择(Ansible vs SaltStack)Ansible基于SSH协议传输数据,SaltStack使用信息队列ZeroMQ传输数据,大规模并发的能力对于及时台-200台规模的兄弟来说,Ansible的性能也可以接受,如果一次操作上千台用salt好一些。
| 工具 | 语言 | 架构 | 协议 |
|---|---|---|---|
| Puppet | Ruby | C/S | HTTP |
| Chef | Ruby | C/S | HTTP |
| Ansible | Python | 无Client | SSH |
| Saltstack | Python | C/S(可无Client) | SSH/ZMQ/RAET |
一般创业公司选择Ansible 能解决大部分问题,其简单,不需要安装额外的客户端,可以从命令行来运行,不需要使用配置文件,至于比较复杂的任务,Ansible配置通过名为Playbook 的配置文件中的 YAML语法来加以处理,Playbook还可以用模板来扩展其功能。
自动化运维三剑客:
- saltstack
- pubbet
- ansible
一 Ansible概述
1.1 Ansible是什么
Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。
Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多 个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操住。
Ansible是基于模块工作的,它只是提供了一-种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块,比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。
1.2 Ansible的四个组件:
- Inventory 主机清单(主机组)
- Modules 模块
- Plugins 插件
- Playbooks 剧本(相当于脚本)
1.3 Ansible的特性
特性一:
Ansible其中一个比较鲜明的特性Agentless,即无Agent的存在(无代理端,即无客户端),它就像普通命令一样, 并非c/s软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play(一个play就是一个Linux操作),再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除。
特性二:
Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。
比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx是非幂等的。
Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
二 Ansible 环境安装部署
实验环境:
| 角色 | IP | 安装工具 |
|---|---|---|
| 管理端 | 192.168.85.50 | ansible |
| 被管理端 | 192.168.85.60 | 无需安装 |
| 被管理端 | 192.168.85.70 | 无需安装 |
1、管理端安装ansible
如果中途安装报错,就多安装几次,可能与网络有关系。
2、配置主机清单,修改/etc/ansible/hosts文件。
3、ansible默认使用ssh连接,所以管理前要设置免密登录。
三 ansible常用的命令行模块
ansible管理命令:
ansible <组名> -m <模块> -a <参数列表>
ansible <主机IP> -m <模块> -a <参数列表>
ansible <主机名> -a <参数列表> #不加-m指定模块默认使用command
#选项解释
-m: 指定模块
-a: 指定命令
查看ansible的模块:
ansible-doc -l #列出所有已安装的模块,按q退出
ansible-doc -l | wc -l #统计总共有多少模块
3387
ansible-doc -s 模块 #查看指定模块的描述信息和操作动作
3.1 command模块
在远程主机执行命令,不支持管道、重定向等shell的特性。
常用的参数:
chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
3.1.1 常用参数示例
(1)chdir
在远程主机上运行命令前提前进入目录。
(2)creates
判断指定文件是否存在,如果存在,不执行后面的操作。
(3)removes
判断指定文件是否存在,如果存在,执行后面的操作
3.2 shell模块
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令。支持管道符号和重动向等功能。
示例1:
shell模块支持管道符号。
示例2:
shell模块支持重定向功能。
3.3 cron模块
在远程主机定义任务计划。其中有两种状态(state) :
- present 表示添加(可以省略)
- absent 表示移除。
示例1:
每天晚上12:30备份系统日志
ansible webservers -m cron -a 'minute=30 hour=0 job="/usr/bin/co -f /var/log/messages /root/backuper/messages-$(date +%Y/%m/%d)" name="backup syslog"'
示例2:
星期一到星期五 上午9点到下午5点期间 每隔半小时执行一次同步时间任务
ansible all -m cron -a 'minute=*/30 hour="9-17" weekday="1-5" job="/usr/sbin/ntpdate ntp.aliyum.com" name="ntp job" '
删除系统备份任务
3.4 user模块
管理用户的模块。
ansible-doc -s user #查看user模块包含的操作动作
常用参数:
| 参数 | 说明 |
|---|---|
| name | 用户名,必选参数。 |
| state=present 或 absent | 创建账号或者删除账号,present表示 创建,absent 表示删除。 |
| system=yes 或 no | 是否为系统账号。(默认为系统账号) |
| uid | 用户uid。 |
| group | 用户基本组。 |
| groups | 用户附加组。 |
| shell | 默认使用的登录shell |
| move_home=yes 或 no | 如果设置的家目录已经存在,是否将已经存在的家目录进行移动。 |
| password | 用户的密码,建议使用加密后的字符串。 |
| comment | 用户的注释信息。 |
| remove=yes 或 no | 表示当state=absent时,是否删除用户的家目录。即删除用户时,是否同时删除家目录。yes表示删除用户的家目录。 |
示例1:
添加用户
示例2:
删除用户并删除家目录
示例3:
创建用户并指定UID号并添加密码
3.5 group模块
管理用户组的模块。
注意:字符串类型的值建议加双引号,防止有空格。数字和布尔值不要加双引号
3.6 copy模块
用于将本地文件复制到远程主机。
ansible-doc -s copy #查看copy模块包含的操作动作
常用参数:
| 参数 | 说明 |
|---|---|
| src | 指出源文件的路径(位于控制节点,即管理端),可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录。 |
| dest | 指出复制文件的目标及位置,使用绝对路径,如果源是目录则目标也要是目录,如果目标文件已经存在会覆盖原有的内容。 |
| mode | 指出复制时,目标文件的权限。 |
| owner | 指出复制时,目标文件的属主。 |
| group | 指出复制时,目标文件的属组。 |
| content | 指出复制到目标主机上的内容,不能与src一起使用。 |
示例1:
把本地的hosts文件复制到远程主机
示例2:
示例3:
3.7 file模块
为远程主机创建/删除文件或目录,设置文件属性。
主要参数如下:
| 参数 | 说明 |
|---|---|
| path | 指定远程服务器的路径,也可以写成"dest","name" |
| state | 状态,可以将值设定为directory表示创建目录,设定为touch表示创建文件,设定为link表示创建软链接,设定为hard表示创建硬连接,设定为absent表示删除目录文件或链接 |
| mode | 文件复制到远程并设定权限,默认file=644,directory=755 |
| owner | 文件复制到远程并设定属主,默认为root |
| group | 文件复制到远程并设定属组,默认为root |
| recurese | 递归修改 |
| src | 指的是目标主机上的源文件。与copy模块不同。 |
示例1:修改文件的属主、属组、权限等
示例2:创建和删除文件、目录
示例3:创建软链接文件
3.8 hostname模块
用于管理远程主机上的主机名。
3.9 ping模块
测试远程主机的连通性。
3.10 yum模块
在远程主机上安装与卸载软件包, 需要被管理端配置好yum源。
主要的参数如下:
| 参数 | 说明 |
|---|---|
| name | 指定安装软件包名或软件包URL |
| state | 指定yum对应的方法,present(默认)、installed表示安装、latest表示安装最新版本软件包;absent、removed表示卸载。支持多程序一起安装,用逗号隔开。 |
| enablerepo | 允许从哪些仓库获取软件 |
| disablerepo | 禁止从哪些仓库获取软件 |
| exclude | 排除某些软件包,例如kernel |
| download_only | 仅下载软件包,不安装 |
| disable_gpg_check | 不进行gpg检测 |
| update_cache | 可以在安装包的同时更新yum缓存 |
示例1:安装httpd
示例:卸载httpd
3.11 service/systemd 模块
用于管理远程主机上的服务的运行状态。
主要参数如下:
| 参数 | 说明 |
|---|---|
| name | 指定需要控制的服务名称 |
| state | 指定服务状态,其值可以为stopped、started、reloaded、restarted、status |
| enabled | 指定服务是否为开机启动,yes为启动,no为不启动 |
| daemon_reload | yes:重启systemd服务,让unit文件生效 |
示例:
3.12 script 模块
实现远程批量运行本地的shell脚本。
注意:script模块不具有幂等性。所以建议用剧本来执行。
注意:script模块不具有幂等性。
3.13 setup 模块
facts组件是用来收集被管理节点信息的,使用setup 模块可以获取这些信息。
总结
Ansible是什么?
- 自动化运维工具
- 可以实现批量管理多台(成百上千)主机,应用级别的跨主机编排工具
Ansible 特点:
- 无agent的存在,不需要在被控制节点上安装客户端应用
- 通过SSH协议与被控制节点通讯的
- 基于模块工作的,通过模块可以实现在被控制节点上执行命令操作
- 很多模块具备幂等性,实现:如果多次操作的状态没有发生改变,是不会重复执行的
你用过哪些ansible模块
执行命令模块:
command shell copy user scrip
yum service group ping setup hostname cron
命令
ansible 组名 -m 模块名 -a '模块参数'
-m file -a 'path=文件路径 mode =755 owner= state=file|directory|touch|link src= '
-m copy -a 'src= dest= mode= owner= group'