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-docansible-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
完!