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

一.准备工作:
[root@localhost ~]# cat <<END>>/etc/hosts 192.168.10.20 ansible 192.168.10.30
host1 192.168.10.40 host2 END [root@localhost ~]# vim /etc/hostname ansible :wq
[root@localhost ~]# reboot
二.安装Ansible:
需要自己配置yum源
链接:https://pan.baidu.com/s/1FtZxpXk1AzZ_WcGVJFGE5w
<https://pan.baidu.com/s/1FtZxpXk1AzZ_WcGVJFGE5w>
提取码:0sf2
Ansible的yum安装包,将其解压到"/yum"目录下
[root@ansible ~]# mkdir /yum/ [root@ansible ~]# cd /yum [root@ansible yum]# ls
ansible-2.3.1.0-1.el7.noarch.rpm ansible-2.3.1.0-3.el7.noarch.rpm
apr-1.4.8-3.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm ...省略其余部分
[root@ansible yum]# rm -rf /etc/yum.repos.d/* [root@ansible yum]# vim
/etc/yum.repos.d/centos.repo #配置yum源 [local] name=local baseurl=file:///yum/
enabled=1 gpgcheck=0 :wq [root@ansible yum]# createrepo /yum/ #生成repodate文件
[root@ansible yum]# 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”


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"
##查看触发器执行结果

完!

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信