自动化运维—Ansible工具的使用
Posted 丁CCCCC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维—Ansible工具的使用相关的知识,希望对你有一定的参考价值。
Ansible
一、概述
1.1 特点
- Ansible 是一个基于 Python 开发的配置管理和应用部署工具,融合了众多老牌运维工具的优点, Pubbet 和 saltstack 能实现的功能,Ansible 基本上都可以实现
- Ansible 能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用 Ansible 只需在固定的一台 Ansible 控制节点上去完成所有主机的操作
- Ansible 是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是 Ansible 的模块
- Agentless,即无 Agent 的存在,它就像普通命令一样, 并非C/S软件,也只需在某个作为控制节点的主机上安装一次 Ansible 即可,通常它基于 ssh 连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务
- 使用者在使用时,在服务器终端输入命令或者playbooks.会通过预定好的规则将playbook拆解为play.再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SsH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除
- Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幕等性(idempotence)…所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行systemctl stop xxx命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx是非幂等的。
- Ansible的很多模块在执行时都会先判断日标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
1.2 优点
- 轻量级,更新时,只需要在操作机上进行一次更新即可
- 采用 SSH 协议
- 不需要去客户端安装 agent
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
- 使用 python 编写的,维护更简单
- 支持 sudo 普通用户命令
- 去中心化管理
二、服务搭建
管理者(ansible):192.168.253.11
被管理者:192.168.253.22
被管理者:192.168.253.33
2.1 准备工作
安装ansible(管理端)
yum -y install epel-release #需要先行安装epel源
yum -y install ansible
- tree /etc/ansible/
- ansible的目录结构
2.2 ansible端设置
配置主机清单
- cd /etc/ansible/
- vim hosts
生成密钥对
- ssh-keygen -t rsa
sshpass -p '123456' ssh-copy-id root@192.168.253.22
sshpass -p '123456' ssh-copy-id root@192.168.253.33
三、ansible 命令行模块
命令格式:ansible <组名> -m <模块> -a <参数列表>
- ansible-doc -l
- 查看已安装的模块,q退出
- 查看已安装的模块,q退出
3.1 command 模块
概述
在远程主机执行命令,不支持管道、重定向等shell部分的特性
-s表示列出指定模块的描述信息和操作动作
ansible-doc -s command
命令使用
#all表示全部,选定全部主机执行date命令
ansible all -m command -a 'date'
#也可以选择IP来执行
ansible 192.168.253.22 -m command -a 'date'
#组名同样可以
ansible webservers -m command -a 'date'
#不选择-m默认运行的就是command这个模块
ansible all -a 'ls /'
常用参数
- chdir
- 在远程主机上运行命令前提前进入目录
- creates
- 在命令运行时创建一个文件,如果文件存在,则不会创建任务
- removes
- 在命令运行时移除一个文件, 如果文件不存在,则不会执行移除任务
- executeble
- 指明运行命令的shell程序
ansible all -m command -a "chdir=/opt ls ./"
查看所有主机的opt目录
3.2 shell 模块
概述
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个shell运行命令(这个支持管道符合功能)
- ansible-doc -s shell
- 列出模块的信息和操作动作
命令
查看webservers远程主机的ip
ansible webservers -m shell -a 'ifconfig ens33 | awk "/init/print $2"'
3.3 cron 模块
概述
在远程主机定义任务计划,有两种状态(state):present表示添加、absent表示移除
- ansible-doc -s cron
常用参数命令
- minute/hour/day/mouth/weekday
- 分/时/日/月/周
- job
- 任务计划执行的命令
- name
- 任务计划的名称
#在webservers主机内设置计划任务,时间为每分钟,内容是输出“haha”,任务名是test01
ansible webservers -m cron -a 'minute="*/1" job="/usr/bin/echo haha" name="test01"'
#移除这个计划任务
ansible webservers -m cron -a 'name=test01 state=absent'
#可以远程查看计划任务内已经移除
ansible webservers -a 'crontab -l'
PS:如果任务没有取名字,删除的时候直接使用 name=None 就行
3.4 user 模块
概述
用户管理的模块
- ansible-doc -s user
常用参数命令
参数 | 定义 |
---|---|
name | 用户名:必选参数 |
state=present l absent | 创建账号或者删除账号,present 表示创建,absent 表示删除 |
system=yes I no | 是否为系统账号 |
uid | 用户uid |
group | 用户基本组 |
shell | 默认使用的shell |
move_home=yse l no | 如果设置的家日录已经存在,是否将已经存在的家目录进行移动 |
password | 用户的密码,建议使用加密后的字符串 |
comment | 用户的注释信息 |
remove=yes I no | 当state=absent时,是否删除用户的家目录 |
#在web主机创建用户cc200
ansible webservers -m user -a 'name="cc200"'
#使用命令查看是否创建成功
ansible webservers -m command -a 'cat /etc/passwd'
#删除该用户
ansible webservers -m user -a 'name="cc200" state=absent'
3.5 group 模块
概述
用户组管理的模块
请求的是 groupadd、groupdel、groupmod模块
- ansible-doc -s group
命令
#创建mysql组
ansible webservers -m group -a 'name=mysql gid=1234 system=yes'
#查看是否创建
ansible webservers -a 'cat /etc/group'
#创建test01用户,添加到mysql组内
ansible webservers -m user -a 'name=test01 uid=111 system=yes group=mysql'
#查看是否创建
ansible webservers -a 'cat /etc/passwd'
#查看是否在组内
ansible webservers -a 'id test01'
3.6 copy 模块
概述
用于复制指定主机内的文件到远程主机里
- ansible-doc -s copy
常用参数命令
参数 | 定义 |
---|---|
dest | 指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容 |
src | 指出源文件的路径。可以使用相对路径或绝对路径。支持直接指定目录。如果源是日录则日标也要是日录 |
mode | 指出复制时,目标文件的权限 |
owner | 指出复制时,目标文件的属主 |
group | 指出复制时,日标文件的属组 |
content | 指出复制到目标主机上的内容,不能与src一起使用 |
#复制本机文件到远程主机
ansible webservers -m copy -a 'src=/etc/fstab dest=/opt/123.txt owner=root mode=640'
#查看是否成功
ansible webservers -a 'ls -l /opt'
#远程添加文件内容进去
ansible webservers -m copy -a 'content="webservers" dest=/opt/123.txt'
#查看
ansible webservers -a 'cat /opt/123.txt'
3.7 file 模块
概述
设置文件属性
- ansible-doc -s file
命令
#修改123.txt文件的属主属组权限
nsible webservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/123.txt'
#创建新文件111.txt
ansible webservers -m file -a 'path=/opt/111.txt state=touch'
#删除111.txt
ansible webservers -m file -a 'path=/opt/111.txt state=absent'
3.8 hostname 模块
概述
用于管理远程主机的主机名
命令
#更改webservers远程主机的名字
ansible webservers -m hostname -a 'name=webservers'
3.9 ping 模块
概述
检测远程主机是否在线
命令
#测试所有主机
ansible all -m ping
#指定测试
ansible webservers -m ping
3.10 yum 模块
概述
在远程主机上安装卸载软件包
- ansible-doc -s yum
命令
#安装
ansible webservers -m yum -a 'name=httpd'
#卸载
ansible webservers -m yum -a 'name=httpd state=absent'
3.11 service/systemd 模块
概述
用于管理远程主机的管理服务的运行状态
- ansible-doc -s service
常用参数命令
项目 | Value |
---|---|
name | 被管理的服务名称 |
state=started I stopped I restarted | 动作包含启动关闭或者重启 |
enabled=yes | no | 表示是否设置该服务开机自启 |
runlevel | 如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动 |
#开启服务
ansible webservers -m service -a 'enabled=true name=httpd state=started'
#查看服务状态
ansible webservers -a 'systemctl status httpd'
3.12 script 模块
概述
可以实现远程批量运行本主机的shell脚本
- ansible-doc -s script
命令
本地创建脚本
- vim test.sh
#!/bin/bash
echo "haha" > /opt/cc.txt
- chmod +x test.sh
远程使用
#在webservers主机运行
ansible webservers -m script -a 'test.sh'
#查看
ansible webservers -a 'cat /opt/cc.txt'
3.13 setup 模块
概述
facts 组件用来收集被管理节点信息
setup 模块可以获取这些信息
- ansible-doc -s setup
命令
#获取全部的facts信息
ansible webservers -m setup
#filter筛选需要的信息
ansible webservers -m setup -a 'filter=*ipv4'
以上是关于自动化运维—Ansible工具的使用的主要内容,如果未能解决你的问题,请参考以下文章