Ansible特点:
基于Python开发,非常容易进行二次开发。
Ansible丰富的内置模块,基本可以满足一切需求
管理模式非常简单,一条命令可以影响上千台机器。
无客户端模式,底层通过SSH通信
Ansible原理介绍:
Ansible没有客户端,也不需要在被管理主机添加代理程序,通过SSH完成底层通信,而SSH在Linux中默认已经存在,在Windows中需要powershell,ansible要求管理端必须是Linux操作系统,在管理节点通过应用模块将指令发送到被管理主机上,并在执行完毕后自动删除临时文件。
Ansible使用中的不同角色,可以分为以下三大部分:
使用者:使用Ansible实现自动化运维控制端;
Ansible工具集:ansible可以实现的功能;
作用对象:Ansible可以影响的主机。
实验环境:
一台Ansible:192.168.3.1
被控端host1:192.168.3.2
被控端host2:192.168.3.3
一.准备工作:
可以访问公网
二.安装Ansible:
[root@ansible ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@ansible ~]# yum -y install ansible
验证安装结果:
[root@ansible yum]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
三.创建SSH交互免密登录:
Ansible通过ssh对设备进行管理,而ssh包含两种认证方式:一是通过密码认证,二是通过密钥对认证,前者是必须和系统交互,而后者是免交互登陆。如希望通过ansible自动管理设备,应该配置为免交互式登录被管理设备。
[root@ansible ~]# ssh-keygen -t rsa #生成密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IXw+ZtlGQWZ805oSWy9WHhiDYHHquOYOs7OG6D61X2I root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| +=*.o+ |
| . . =+.=.+ |
| o + .= B . |
| * =o = o |
| . S oo . |
| . + o |
| ...+Eo. |
|....+*o |
|oo..+=o |
+----[SHA256]-----+
[root@ansible ~]# ssh-copy-id root@192.168.3.2 #将自己的密钥上传到被远程节点服务器
[root@ansible ~]# ssh 192.168.3.2
[root@host1 ~]# exit
[root@ansible ~]# ssh-copy-id root@192.168.3.3
[root@ansible ~]# ssh 192.168.3.3
[root@host2 ~]# exit
四.配置Ansible:
Ansible通过将设备列表以分组的方式添加到/etc/ansible/hosts文件来实现对设备进行管理,所以在正式管理之前,首先要编写hosts文件,hosts文件中,以[ ]包含的部分代表组名,列表支持主机名和IP地址,默认情况下,通过访问22号端口来管理设备,若目标主机上使用了非默认的ssh端口,还可以在主机名称之后使用冒号加端口号表明,以行为单位分割配置。另外,hosts文件还支持通配符。
[root@ansible ~]# vim /etc/ansible/hosts
[web]
192.168.3.2
192.168.3.3
[ftp]
ftp.benet.com:222 ##通过222端口进行管理
[mail]
zs1.accp.com
zs[2:5].accp.com ##[2:5]表示2~5之间的所有数字,即表示zs2.accp.com,zs3.accp.com...
可以将同一个主机同时归属不同的组中
配置完成后可以真多hosts定义的组进行远程操作,也可以针对组中的某一个或多个主机进行操作。
五.进行指定化批量操控:
Ansible 返回的值非常友好,一般会用三种颜色来表示执行结果:
*绿色:表示执行成功并且没有对目标机器做修改
*红色:表示执行过程有异常
*黄色:表示命令执行后有状态变化
1、对web组中的192.168.3.2主机操作,通过-limit参数限定主机的变更。
[root@ansible ~]# ansible web -m command -a “systemctl status httpd” --limit “192.168.3.2”
此处没有开启httpd服务,所有会标红报错,如果出先这个说明已经可以进行远程批量操控
2、只对192.168.3.2主机操作,通过IP限定主机的变更。
[root@ansible ~]# ansible 192.168.3.2 -m command -a “systemctl status httpd”
此处为绿,则表示该重启http服务操作执行成功
3、只对192.168.3.0网段的主机操作,通过通配符限定主机的变更。
[root@ansible ~]# ansible 192.168.3.* -m command -a “systemctl status httpd”
此处标明对两台3网段的服务器成功进行了重启操作
4、根据组,批量化进行变更。
[root@ansible ~]# ansible web -m command -a “systemctl status httpd”
此处亦为操作成功进行
六.Ansible的命令:
1.ansible
Ansible是生产环境中使用非常频繁的命令之一,主要在以下场景使用:
非固化需求:非固定操作
临时一次性操作
二次开发接口调用
ansible命令详解:ansible [options]
-v ##打印详细信息
-i 文件位置 ##指定hosts文件的存放位置
-f 进程数量 ##指定fork出的进程数量值
-m 模块名称 ##指定模块名称,默认模块名称为command
-a 模块的参数或命令 ##指定module模块的参数或者命令
-k 密码 ##手动指定SSH的密码
-sudo 基于sudo用户指定
-u 用户名 ##指定执行用户
-C 测试指定过程 ##测试,不改变真实内容,相当于预演
-T 指定命令超时时间单位为秒 ##超时时间,默认是10s
–version ##查看ansible的版本信息
eg:
a:检查所有主机是否存活:
[root@ansible ~]# ansible all -f 5 -m ping
b:列出web组中所有的列表:
[root@ansible ~]# ansible web --list
c:批量显示web组中磁盘的空间:
[root@ansible ~]# ansible web -m command -a “df -hT”
d.查看硬件信息
[root@ansible ~]# ansible 192.168.3.2 -m setup [root@ansible ~]#
ansible 192.168.3.2 -m setup -a “filter=ansible_ens34”
2.ansible-doc
ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对背个模块都有详细的用法说明及应用案例介绍
[root@ansible ~]# ansible-doc ping
3.ansible-playbook
ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source,用来执行系列任务,其工作机制是:通过读取预先编写好的playbook文件实现集中处理任务,ansible-playbook命令后跟yml合适的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下:
[root@ansible ~]# ansible-playbook playbook.yml
#playbook.yml文件需要实现写好,建议执行时使用绝对路径,
#后面将会用到
4.ansible-console
ansible-console是ansible为用户提供的一套交互式工具,类似于Windows中的cmd以及Linux中的shell。用户可以再ansible-console虚拟出来的终端商像shell一样使用ansible内置的各种命令,这为习惯于使用shell交互方式的用户提供了良好的使用体验,在终端输入ansible-console命令后,显示如下:
[root@localhost ~]# ansible-console
#操作与shell类似,支持tab键,快捷键Ctrl+C退出虚拟终端
七.Ansible模块:
1.command模块:
Command模块在远程主机上执行命令,不支持管道,重定向等shell的特性,常用的参数如下。
chdir:在远程主机上执行命令前要提前进入目录
creates:在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务。
removes:在命令运行时语出一个文件,如果文件不存在,则不会执行移除任务
executeble:指明运行命令的shell程序
在所有主机上执行“ls ./”命令式,运行前切换到/home目录
[root@ansible ~]# ansible all -m command -a “chdir=/home ls ./”
2.shell模块:
Shell模块在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令。和command模块的区别就是它支持shell特性,如:管道、重定向等。
[root@ansible ~]# ansible web -m shell -a “echo “hello” >> /tmp/hello.txt”
[root@ansible ~]# ansible web -m shell -a “cat /tmp/hello.txt”
3.copy模块:
copy模块用于复制指定主机文件到远程主机指定位置,常见参数如下。
src ##源文件位置
content ##手动编写源文件内容
dest ##目标主机上的目标文件位置
mode ##设置文件权限
owner ##设置文件属主
group ##设置文件属组
force ##强制覆盖文件
[root@ansible ~]# cat <<END>>/root/ansible.txt
> I am ansible
> END
[root@ansible ~]# ansible web -m copy -a “src=/root/ansible.txt dest=/tmp/ mode=777 owner=nobody group=root”
[root@ansible ~]# ansible web -m shell -a “cat /tmp/ansible.txt”
4.hostname模块:
Hostname模块用于管理远程主机上的主机名,常用参数如下:
#name:指明主机名
[root@ansible ~]# ansible web -m hostname -a “name=Apache”
[root@ansible ~]# ansible web -m shell -a “cat /etc/hostname”
5.yum模块
用来指定yum安装服务,常见参数如下:
name ##软件包名称
state=present|latest|absent ##软件包状态,present:表示安装程序包,latest:表示安装最新版本的程序包,absent:表示卸载程序包
update_cache ##安装软件包前更新缓存
enablerepo ##指定yum源名称
conf_file ##指定yum安装时所加载的yum配置文件
[root@ansible ~]# ansible web -m yum -a “name=httpd state=present”
6.service模块
用来管理远程主机上的服务的模块,常见参数如下:
name: ##被管理的服务名称
state=started|stopped|restarted|reloaded: ##动作:启动,关闭,重启,重载
enabled=yes|no ##是否设置开机启动
runlevel: ##如果设定了enabled开机启动,则要定义在哪些运行目标下自动运行
[root@ansible ~]# ansible web -m service -a “name=httpd state=started enabled=yes”
或
[root@ansible ~]# ansible web -m shell -a “systemctl start httpd”
数据量太多,就展示到这儿
7.user模块
以下是user模块参数:
name ##用户名
home ##家目录位置
shell ##指定登陆shell
uid ##指定用户uid
state ##状态,present为新建、absent为删除
force ##强制删除
[root@ansible ~]# ansible web -m user -a “name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment=“testuser””
#此为创建一个user1的用户,uid为501,属组为root…
[root@ansible ~]# ansible web -m shell -a “tail -1 /etc/passwd”
#查看/etc/passwd确认该用户是否创建
[root@ansible ~]# ansible web -m user -a “name=user1 remove=yes state=absent”
#删除用户及家目录
[root@ansible ~]# ansible web -m shell -a “tail -1 /etc/passwd”
#查看是否删除用户user1
八.playbook配置文件:
Playbook配置文件使用yaml语法,具有简洁明了、结构清晰等特点。Playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表;
YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项,通过“:”来分割键和值,整个未见以“—”开始,以“…”结束。
#先进行分组
[root@ansible ~]# vim /etc/ansible/hosts ##修改/etc/ansible/hosts文件
[web1]
192.168.3.2
[web2]
192.168.3.3
:wq
[root@ansible ~]# vim /etc/ansible/a.yml ##创建a.yml文件
--- ##脚本开始
- hosts: web1 ##针对web1组内主机进行操作
remote_user: root ##远端执行用户身份为root
tasks: ##任务列表
- name: adduser ##任务名称
user: name=user2 state=present ##调用user模块创建用户
tags: ##创建tag标签
- aaa ##tag标签为aaa
- name: addgroup ##任务名称
group: name=root system=yes ##执行group模块创建组
tags: ##创建tag标签
- bbb ##标签名称bbb
- hosts: web2 ##针对web2组内主机进行操作
remote_user: root ##远端执行用户身份为root
tasks: ##任务列表
- name: copy file to web ##任务名称
copy: src=/etc/passwd dest=/home ##调用copy模块复制文件
tags: ##创建tag标签
- ccc ##tag标签为ccc
... ##结束
所有的“-横杠”和“:冒号”后面都有空格,而且要注意缩进和对齐。
Playbook的核心元素:
hosts:任务的目标主机,多个主机用冒号分割,一般会调用/etc/ansible/hosts中的分组信息
remote_user:远程主机上,运行此任务的身份默认为root
tasks:任务,定义的具体任务,由模块定义的操作列表。
handlers:触发器,类似tasks,只是在特定条件下才会触发的任务。
roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合
Playbook文件定义的任务需要听过ansible-plyabook命令进行调用执行,
命令语法:
[root@localhost ~]# ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml
[option]部分功能解析
–syntax-check:检测yml文件的语法
-C:预测试,不会改变目标主机任何设置
–list-hosts:列出yml文件影响的主机列表
–list-tasks:列出yml文件的任务列表
-t TAGS:表示只执行指定标签的任务
–skip-tags=SKIP_ATGS:表示移除了指定标签的任务,执行其他任务。
–start-at-tasks=START-AT:从指定的任务开始往下指定。
eg:
[root@ansible ~]# ansible-playbook --syntax /etc/ansible/a.yml ##yml文件语法检查
playbook: /etc/ansible/a.yml ##没有报错
[root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml ##预测试
[root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml ##列出影响了那些主机
[root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml ##显示任务列表
[root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml ##显示任务标签
[root@ansible ~]# ansible-playbook /etc/ansible/a.yml ##执行任务
[root@ansible ~]# ansible web1 -m shell -a "tail -1 /etc/passwd"
[root@ansible ~]# ansible web2 -m shell -a "ls -l /home/passwd"
2.触发器
需要出发才能执行的任务,当之前定义在tasks中的任务执行完成后,若希望在此基础上出发其他的任务,这是需要定义handlers。
Handlers是ansible提供的条件机制之一,handlers和task相似,,但是它只在被task通知的时候才会触发执行。
Handlers只会在所有任务执行完后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行
eg:
[root@ansible ~]# ansible web1 -m shell -a "netstat -anpt | grep httpd" ##httpd正在监听80端口
[root@ansible ~]# vim /etc/ansible/httpd.yml ##创建httpd.yml文件
--- ##脚本开始
- hosts: web1 ##
remote_user: root ##
tasks: ##
- name: change port ##
command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf ##修改端口
notify: ##配置触发条件
- restart httpd server ##完成任务后调用改名字的触发器
handlers: ##
- name: restart httpd server ##指定触发器的名字
service: name=httpd state=restarted ##触发任务为重启httpd服务
... ##结束
[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/httpd.yml ##检查脚本
[root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml ##执行脚本
[root@ansible ~]# ansible web1 -m shell -a "netstat -anpt | grep httpd" ##查看触发器执行结果
Playbook语法详情:
https://www.cnblogs.com/hwlong/p/9301008.html
完!