您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
   
 
     
   
 订阅
  捐助
Ansible自动化运维
 
作者: Linux_白菜
172 次浏览     评价:  
 2020-1-16
 
编辑推荐:
本文主要包含Ansible特点,Ansible原理介绍,Ansible使用中的不同角色,实验环境,希望对您的学习有所帮助。
本文来自于csdn,由火龙果软件Delores编辑、推荐。

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源

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+ZtlGQWZ805oSWy9WHhi
DYHHquOYOs7OG6D61X2I 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配置文件

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语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项,通过“:”来分割键和值,整个未见以“—”开始,以“…”结束。

所有的“-横杠”和“:冒号”后面都有空格,而且要注意缩进和对齐。

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

 
   
172 次浏览     评价: 订阅 捐助
相关文章

DevOps转型融入到企业文化
DevOps 能力模型、演进及案例剖析
基于 DevOps 理念的私有 PaaS 平台实践
微软开发团队的DevOps实践启示
相关文档

DevOps驱动应用运维变革与创新
运维管理规划
如何实现企业应用部署自动化
运维自动化实践之路
相关课程

自动化运维工具(基于DevOps)
互联网运维与DevOps
MySQL性能优化及运维培训
IT系统运维管理