Ansible自动化运维详解

发布时间:2020-07-01 17:43:45 作者:wx5cc19525285e2
来源:网络 阅读:942

Ansible作为今年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。Ansible通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作简单,但提供的功能又非常丰富,在运维领域,几乎可以做任何事。
.
Ansible自2012年发布以来,很快在全球流行,其特点如下:

1、Ansible基于Python开发,运维工程师对其二次开发相对比较容易
2、Ansible丰富的内置模块,几乎可以满足一切要求
3、管理模式非常简单,一条命令可以影响上千台主机
4、无客户端模式,底层通过SSH通信

我们可以通过四种方式和Ansible交互,我这里只研究了其中两种方式,应付日常工作足够了。分别如下:

1、Ad-Hoc命令集:user直接通过Ad-Hoc命令集调用Ansible工具集来完成任务。
2、playbooks:user预先编写好ansible playbooks,通过执行playbooks中预先编排好的任务集,按序执行任务。

1、Ansible工作集:
.
Ansible工作集包含inventory、Modules、Plugins和API,其中,inventory(清单)用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;modules是各种执行模块,几乎所有的管理任务都是通过模块执行的;plugins提供了各种附加功能;API为编程人员提供一个接口,可以基于此做Ansible的二次开发。
.
Ansible可以通过单条命令或者配置文件来对多台主机进行控制及更改,下面将从安装及配置依次写出来。

2、playbook配置文件
.
playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入就显得效率非常低下了。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml。
.
Ansible的安装及配置
.
环境如下:
Ansible自动化运维详解
一、准备工作:
1、本地yum仓库:https://pan.baidu.com/s/1-ERCVm6QaUA4XQd_X5Kwow 提取码: exnp 版本为:Ansible 2.3.1.0
2、若本机联网,可指向互联网yum仓库
3、默认采用TCP 22进行与客户机进行通信,若有更改,需自行设置防火墙放行
二、安装Ansible:

[root@ansible /]# mount /dev/sr0 /media/                   # 挂载yum仓库
[root@ansible /]# rm -rf /etc/yum.repos.d/*               # 删除或移走yum目录中的其他配置文件
[root@ansible /]# vim /etc/yum.repos.d/a.repo 
[aaa]
baseurl=file:///media
gpgcheck=0
[root@ansible yum.repos.d]# yum clean all          #清除yum缓存
[root@ansibleyum.repos.d]# yum -y install ansible             #安装Ansible
[root@ansible yum.repos.d]# ansible --version              #可以查看到此信息,说明安装成功
ansible 2.3.1.0
  config file = /etc/ansible/ansible.cfg
           ...................

我这里采用了互联网yum仓库进行安装,即ansible 2.4.2.0。
.
安装已经完成,但是若要正常的使用Ansible,还需要解决一个问题,就是在控制多台主机时,若要每执行一次命令或脚本都要输入一次对端密码的话,显得就很鸡肋,所以还需要创建SSH免交互登录,如下:
.
以下操作都在Ansible服务器进行:

[root@ansible ~]# ssh-keygen -t rsa             #在Ansible服务器生成密钥对,执行后默认一直按回车即可
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):         #默认按回车
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:zhd2++KvByxFPE4ZKmDdmTHp6cjsuIEz5M26QrkBfes root@ansible
The key's randomart image is:                     #默认按回车
+---[RSA 2048]----+
|      o. .o*.o   |
|     . .. =o*    |
| .      ...= .   |
|. . .    .o o    |
| . o.. oSooo.    |
|  +o.+ o+.ooo.   |
| . += +oo ....   |
|  o E+....  ...  |
|   .o...   .o=o  |
+----[SHA256]-----+
#至此密钥对已经生成了,隐藏存在当前用户的宿主目录下。
[root@ansible ~]# ls -a | grep ssh        #查看
.ssh
[root@ansible ~]# cd .ssh
[root@ansible .ssh]# ls       #查看.ssh目录下的文件,有公钥和私钥
id_rsa  id_rsa.pub  known_hosts
[root@ansible ~]# ssh-copy-id root@192.168.1.20            #复制公钥到主机192.168.1.20
root@192.168.1.20's password:              #输入主机1.20的root用户密码
[root@ansible ~]# ssh-copy-id root@192.168.1.30            #复制公钥到主机192.168.1.30
root@192.168.1.30's password:                 #输入主机1.30的root用户密码
#在实际生产环境中,不会使用root身份,更改一下复制公钥时指定的用户即可。
[root@ansible ~]# ssh 192.168.1.20           #测试是否可以免密码登录
Last login: Tue Jul 23 08:11:39 2019 from 192.168.1.88
[root@server1 ~]# exit              #退出192.168.1.2的shell环境
[root@ansible ~]# ssh 192.168.1.30                #测试是否可以免密码登录
Last login: Tue Jul 23 08:43:16 2019 from 192.168.1.88
[root@server 2 ~]# exit           #退出192.168.1.3的shell环境

三、Ansible配置:
inventory是Ansible管理主机信息的配置文件,相当于系统的hosts文件功能,默认存放在/etc/ansible/hosts,在hosts文件中,通过分组来组织设备,Ansible通过inventory来定义主机和分组,若不使用默认的/etc/ansible/hosts,可以通过ansible -i 新的inventory路径 来指定inventory,我这里直接采用默认的路径。
.
1、以分组的方式添加需要管理的主机:
.
正是管理之前,首先要编写hosts文件,因为Ansible通过将设备列表以分组的方式添加hosts文件来实现对设备的管理。hosts文件中,[ ]包含的是组名,设备列表支持域名及IP地址,默认情况下,通过访问22端口(SSH)来管理设备,若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号标明,以行为分隔单位,也支持通配符。
.

[root@ansible ~]# vim /etc/ansible/hosts            #编辑清单文件,在文件末尾写入以下内容
                .....................             #省略部分内容   
[web]              #定义一个名为web的分组,下面是web组中的主机
192.168.1.20
192.168.1.30
[test01]            #定义一个名为test01的分组,下面是test01组中的主机
www.test.com:222         #若目标主机使用了非默认的SSH端口,可以在域名后面加端口号来指定
www[2:5].test.com       #[2:5]表示2~5之间的所有数字,如www2.test.com、www3.test.com .......的所有主机
192.168.1.4:66               #IP地址后面也可以指定非默认的端口号
#将需要管理的主机写入后,保存退出即可。注意,该文件中包含一个隐含的分组“all”,表示所有主机。

.
配置完成后,可以针对hosts定义的组进行远程操作,也可以针对组中所指定的某一个或者多个主机操作,如下:

[root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.20"
#查看web组中的192.168.1.20主机httpd服务的状态
192.168.1.20 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd. preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)non-zero return code
#也可以这样:
[root@ansible ~]# ansible 192.168.1.20 -m command -a "systemctl status httpd"
192.168.1.20 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd. preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)non-zero return code
[root@ansible ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
#查询192.168.1.0这个网段所有主机的httpd服务状态
192.168.1.20 | FAILED | rc=3 >>
     .................
192.168.1.30 | FAILED | rc=3 >>
     .................

四、Ansible命令:

[root@ansible ~]#ansible   #输入ansible后,连续按两下tab键,可以查看ansible所有相关命令
ansible               ansible-doc           ansible-playbook-2
ansible-2             ansible-doc-2         ansible-playbook-2.7
ansible-2.7           ansible-doc-2.7       ansible-pull
                ..........................

命令1、ansible:
.
ansible是生产环境中使用非常频繁的命令之一,主要应用在以下场景:
.

用法示例1(需要提前在/etc/ansible/hosts文件中定义web组):

[root@ansible ~]# ansible all -f 5 -m ping          <!--检查所有主机是否存活-->
192.168.1.30 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.20 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
<!--其中192.168.1.30和1.20是执行主机,SUCCESS表示命令执行成功,“=> {”表示返回的
结果。“changed”:false表示没有对主机做出更改,“ping”:“pong”表示执行了ping命令的
返回结果。命令中“all”关键字在前面提到过,代表了/etc/ansible/hosts文件中的所有主机,
不需要在hosts文件中定义,系统中默认存在的-->

用法示例2:

[root@ansible ~]# ansible web --list                        #列出web组所有的主机列表
  hosts (2): 
    192.168.1.20
    192.168.1.30
#以上表示web中包含两个主机,分别是1.20和1.30

用法示例3:

[root@ansible ~]# ansible web -m command -a "df -hT"        #显示web组中主机的磁盘使用情况
192.168.1.20 | SUCCESS | rc=0 >>
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  5.8G   45G   12% /
devtmpfs                devtmpfs  895M     0  895M    0% /dev
                          ............................            #省略部分

192.168.1.30 | SUCCESS | rc=0 >>
文件系统            类型      容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root xfs        17G  5.5G   12G   33% /
devtmpfs            devtmpfs  897M     0  897M    0% /dev
tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
                          ............................            #省略部分

ansible的返回结果非常友好,一般会用三种颜色来表示执行结果:红色、绿色和橘yellow(那个颜色被和谐了)。其中红色代表执行过程中有异常;橘yellow表示命令执行后目标有状态变化;绿色表示执行成功且没有对目标主机做修改。
命令2、ansible-doc:

ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍。

[root@ansible ~]# ansible-doc -l | wc -l                  #列出支持的模块
1378               #支持的模块有1378个
[root@ansible ~]# ansible-doc ping             #查询ping模块的说明信息
> PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

        A trivial test module, this module always returns `pong' on
        successful contact. It does not make sense in playbooks, but
        it is useful from /usr/bin/ansible' to verify the ability to
                             ................#省略部分内容

命令3、ansible-playbook:
.
ansible-playbook是日常应用中使用率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。其工作机制是:通过读取预先编写好的playbook文件实现集中处理任务。ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下(playbook.yml文件需要提前编写好,最好指定playbook.yml的绝对路径):

[root@ansible ~]# ansible-playbook playbook.yml

命令4、ansible-console:
.
ansible-console是ansible为我们提供的一款交互式工具,类似于Windows中的cmd及Linux中的shell。可以在ansible-console虚拟出来的终端上像shell一样使用ansible内置的各种命令,这为习惯于shell交互方式的用户提供了良好的使用体验,所有的操作与shell类似,而且支持tab键补全。具体操作如下:

[root@ansible ~]# ansible-console          #连接交互式工具
Vault password:         #ansible 2.4.2.0会提示输入一个密码,随便输入后按回车即可,不允许空值
Welcome to the ansible console.
Type help or ? to list commands.

root@all (2)[f:5]$ cd web         #切换到web组
root@web (2)[f:5]$ list     #列出组中主机
192.168.1.20
192.168.1.30
root@web (2)[f:5]$ ifconfig ens33         #查询每个主机的网卡信息
root@web (2)[f:5]$ exit           #退出ansible-console环境

五、Ansible中自带的模块介绍:

1、command模块:

command模块在远程主机执行命令,不支持管道,重定向等shell特性,其余和shell类似,常用参数如下:

[root@ansible ~]# ansible all -m command -a "chdir=/home ls ./"
#在所有主机上运行“ls ./”命令,运行前切换至/home目录下。

2、shell模块(相当于万能模块,可以执行大多数命令):
.
shell模块在远程主机执行命令,相当于调用远程主机的shell进程,然后在shell下打开一个子shell运行命令。和command模块的区别是它支持shell特性,如管道符、重定向等。
.

[root@ansible ~]# ansible web -m shell -a 'echo "hello world" >> /tmp/hello.txt'
#在web组的主机上编写一个txt文件
192.168.1.20 | SUCCESS | rc=0 >>

192.168.1.30 | SUCCESS | rc=0 >>

[root@ansible ~]# ansible web -m shell -a ' cat /tmp/hello.txt'        #查看编写的文件
192.168.1.30 | SUCCESS | rc=0 >>
hello world

192.168.1.20 | SUCCESS | rc=0 >>
hello world

3、copy模块:

copy模块用于复制指定主机文件到远程主机的位置,常见参数如下:

[root@ansible ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=nobody group=root"
#将本机的/etc/hosts文件复制到web组中的主机,并指定权限为777,属主为nobody,属组为root。

4、hostname模块:

hostname模块用于管理主机名,常用参数如下:

name:指明主机名。

[root@ansible ~]# ansible 192.168.1.20 -m hostname -a "name=web1"
#将主机192.168.1.20的主机名改为web1
192.168.1.20 | SUCCESS => {
    ansible_facts: {
        ansible_domain: , 
        ansible_fqdn: web1, 
        ansible_hostname web1 
        ansible_nodename: web1
    }, 
    changed: true
    name: web1
}
[root@server1 ~]# hostname       #在192.168.1.20主机上查看
web1
[root@server1 ~]# cat /etc/hostname                  #在192.168.1.20主机上查看
web1
#更改主机名后需重启才可使新的主机名生效。

5、yum模块:

yum模块基于yum机制,对远程主机管理程序包,常用参数如下:

[root@ansible ~]# ansible web -m yum -a "name=httpd state=present"       
                        <!--
在web组中的主机上安装httpd服务,需要注意的是,管理端只是发送yum指令到被
管理端,被管理端要存在可用的yum仓库才可以成功安装。
         -->

6、Service模块:

Service模块用来管理远程主机上的服务的模块,常见参数如下:

[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes"
#启动httpd服务,并设置为开机自启动。

7、user模块:

user模块用于管理远程主机上的用户账号,常见参数如下:

[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="test user"'
#创建一个名为user1的用户
[root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent"
#删除刚才创建的user1用户

8、group模块:

group模块用于管理组,用于新建或删除组,常用参数如下:

[root@ansible ~]#  ansible web -m group -a 'name=test gid=300 state=present system=yes'
#创建gid为300,组名为test的系统组。
[root@ansible ~]#  ansible web -m group -a 'name=test gid=300 state=absent system=yes'
#删除刚刚创建的组。

9、mount模块:

mount模块用于挂载文件系统,常用参数如下:

[root@an..~]# ansible web -m mount -a 'name=/warrent src=/dev/cdrom fstype=iso9660 state=mounted'
#挂载iso镜像到/warrent目录下,并设置开机自动挂载。
[root@ansible ~]#  ansible web -m mount -a 'name=/warrent state=absent'
#卸载ISO镜像,并删除挂载点,删除开机自动挂载。
[root@an..~]# ansible web -m mount -a "path=/mnt/data src=/dev/sdb1 fstype=xfs ots=wr state=mounted"
#注:mount已经使用path代替了原来的name参数,但是name参数还是可以使用的。

10、cron模块:

cron模块用来管理计划任务,常用参数如下:

[root@ansible ~]# ansible web -m cron -a 'name=test user=root minute=*/2 job="echo test >> /tmp/warrent.txt" state=present'
#添加一个计划任务测试一下
[root@ansible ~]# ansible web -m shell -a "crontab -l"                #查看创建的任务计划
192.168.1.20 | SUCCESS | rc=0 >>
#Ansible: test
*/2 * * * * echo test >> /tmp/warrent.txt

192.168.1.30 | SUCCESS | rc=0 >>
#Ansible: test
*/2 * * * * echo test >> /tmp/warrent.txt

11、 script模块:

功能:在远程主机上执行主控端的脚本,相当于scp+shell组合。

用法如下:

[root@ansible ~]#ansible web -m script -a "/home/test.sh"

关于playbook配置文件的使用请参考:https://blog.51cto.com/14227204/2442514

推荐阅读:
  1. ansible自动化运维工具介绍
  2. Ansible自动化运维的安装及常用模块详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ansible ansi

上一篇:MySQL 主从复制与读写分离详解

下一篇:springmvc中的注解方式有几种

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》