(一)前言:node
Ansible是今年来愈来愈火的一款开源运维自动化工具,经过Ansible能够实现运维自动化,提升运维工程师的工做效率,减小人为失误。Ansible经过自己集成的很是丰富的模块能够实现各类管理任务,其自带模块超过上千个。更为重要的是,它操做简单,但提供的功能又很是丰富,在运维领域,几乎能够作任何事。python
Ansible自2012年发布以来,很快在全球流行,其特色以下:web
- Ansible基于Python开发,运维工程师对其二次开发相对比较容易;
- Ansible丰富的内置模块,几乎能够知足一切要求;
- 管理模式很是简单,一条命令能够影响上千台主机;
- 无客户端模式,底层经过SSH通讯;
咱们能够经过四种方式和Ansible交互,我这里只研究了其中两种方式,应付平常工做足够了。分别以下:shell
一、Ansible工做集:
Ansible工做集包含inventory、Modules、Plugins和API,其中,inventory(清单)用来管理设备列表,能够经过分组实现,对组的调用直接影响组内的全部主机;modules是各类执行模块,几乎全部的管理任务都是经过模块执行的;plugins提供了各类附加功能;API为编程人员提供一个接口,能够基于此作Ansible的二次开发。apache
Ansible能够经过单条命令或者配置文件来对多台主机进行控制及更改,下面将从安装及配置依次写出来。编程
二、playbook配置文件
playbook配置文件使用YAML语法,具备简洁明了、结构清晰等特色。playbook配置文件相似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然能够完成各类任务,可是当配置一些复杂任务时,逐条输入就显得效率很是低下了。更有效的方案是在playbook配置文件中放置全部的任务代码,利用ansible-playbook命令执行该文件,能够实现自动化运维。YAML文件的扩展名一般为.yaml或.yml。vim
(二)Ansible的安装及配置centos
经过一个简单的环境把Ansible的配置及安装写下来,环境以下:
最终效果:能够经过Ansible server来控制server 1和server 2。缓存
1、部署前工做:服务器
一、若采用本地yum仓库安装,请下载我提供的本地yum仓库,提取码:buqy ,我提供的是Ansible 2.3.1.0版本。
二、若本机可上网,也能够直接将yum仓库指向互联网,能够安装Ansible 2.4.x.x版本。
三、默认采用TCP 22进行与客户机进行通讯,如有更改,需自行设置防火墙,我这里为了方便,直接关闭了防火墙。
2、安装Ansible(二选一便可):
一、采用互联网yum仓库的安装方式:
[root@ansible ~]# yum clean all #清除yum缓存 [root@ansible ~]# yum -y install ansible #安装Ansible [root@ansible ~]# ansible --version #能够查看到此信息,说明安装成功 ansible 2.4.2.0 config file = /etc/ansible/ansible.cfg .............................
二、采用我提供的本地yum仓库安装方式:
[root@ansible yum.repos.d]# mount /dev/cdrom /media #挂载我提供的ISO文件 mount: /dev/sr0 写保护,将以只读方式挂载 [root@ansible yum.repos.d]# cat /etc/yum.repos.d/a.repo #删除或移动原有yum配置文件,并编写本地yum文件: [fd] 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.2 #复制公钥到主机192.168.1.2 root@192.168.1.2's password: #输入主机1.2的root用户密码 [root@ansible ~]# ssh-copy-id root@192.168.1.3 #复制公钥到主机192.168.1.3 root@192.168.1.3's password: #输入主机1.3的root用户密码 #在实际生产环境中,不会使用root身份,更改一下复制公钥时指定的用户便可。 [root@ansible ~]# ssh 192.168.1.2 #测试是否能够免密码登陆 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.3 #测试是否能够免密码登陆 Last login: Tue Jul 23 08:43:16 2019 from 192.168.1.88 [root@server 2 ~]# exit #退出192.168.1.3的shell环境
3、Ansible配置:
inventory是Ansible管理主机信息的配置文件,至关于系统的hosts文件功能,默认存放在/etc/ansible/hosts,在hosts文件中,经过分组来组织设备,Ansible经过inventory来定义主机和分组,若不使用默认的/etc/ansible/hosts,能够经过ansible -i 新的inventory路径
来指定inventory,我这里直接采用默认的路径。
一、以分组的方式添加须要管理的主机:
正是管理以前,首先要编写hosts文件,由于Ansible经过将设备列表以分组的方式添加hosts文件来实现对设备的管理。hosts文件中,[ ]包含的是组名,设备列表支持域名及IP地址,默认状况下,经过访问22端口(SSH)来管理设备,若目标主机使用了非默认的SSH端口,还能够在主机名称以后使用冒号加端口号标明,以行为分隔单位,也支持通配符。
[root@ansible ~]# vim /etc/ansible/hosts #编辑清单文件,在文件末尾写入如下内容 ..................... #省略部份内容 [web] #定义一个名为web的分组,下面是web组中的主机 192.168.1.2 192.168.1.3 [test01] #定义一个名为test01的分组,下面是test01组中的主机 www.warrent.com:222 #若目标主机使用了非默认的SSH端口,能够在域名后面加端口号来指定 ljz[2:5].test.com #[2:5]表示2~5之间的全部数字,如ljz2.test.com、ljz3.test.com .......的全部主机 192.168.1.4:66 #IP地址后面也能够指定非默认的端口号 #将须要管理的主机写入后,保存退出便可。注意,该文件中包含一个隐含的分组“all”,表示全部主机。
配置完成后,能够针对hosts定义的组进行远程操做,也能够针对组中所指定的某一个或者多个主机操做,以下:
[root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.2" #查看web组中的192.168.1.2主机httpd服务的状态 192.168.1.2 | 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.2 -m command -a "systemctl status httpd" 192.168.1.2 | 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.2 | FAILED | rc=3 >> ................. 192.168.1.3 | FAILED | rc=3 >> .................
4、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 ..........................
命令一、ansible:
ansible是生产环境中使用很是频繁的命令之一,主要应用在如下场景:
ansible可用的选项以下:
- -v:输出详细的执行过程信息,能够获得执行过程全部的信息。
- -i PATH:指定inventory信息,默认为/etc/ansible/hosts。
- -f:并发线程数,默认为5个线程。
- --private-key=PRIVATE_KEY_FILE:指定密钥文件。
- -m:指定执行使用的模块。
- -M:指定模块的存放路径,默认为/usr/share/ansible,也能够经过ANSIBLE_LIBRARY来设定默认路径。
- -a:指定模块参数。
- -u:指定远程主机以哪一个用户运行命令。
- -l:限制运行主机,等同于“--limit”。
- --list-hosts:列出符合条件的主机列表,不执行任何命令。
用法示例1(须要提早在/etc/ansible/hosts文件中定义web组):
[root@ansible ~]# ansible all -f 5 -m ping <!--检查全部主机是否存活--> 192.168.1.3 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.1.2 | SUCCESS => { "changed": false, "ping": "pong" } <!--其中192.168.1.3和1.2是执行主机,SUCCESS表示命令执行成功,“=> {”表示返回的 结果。“changed”:false表示没有对主机作出更改,“ping”:“pong”表示执行了ping命令的 返回结果。命令中“all”关键字在前面提到过,表明了/etc/ansible/hosts文件中的全部主机, 不须要在hosts文件中定义,系统中默认存在的-->
用法示例2:
[root@ansible ~]# ansible web --list #列出web组全部的主机列表 hosts (2): 192.168.1.2 192.168.1.3 #以上表示web中包含两个主机,分别是1.2和1.3
用法示例3:
[root@ansible ~]# ansible web -m command -a "df -hT" #显示web组中主机的磁盘使用状况 192.168.1.2 | SUCCESS | rc=0 >> 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 50G 5.8G 45G 12% / devtmpfs devtmpfs 895M 0 895M 0% /dev ............................ #省略部分 192.168.1.3 | 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表示命令执行后目标有状态变化;绿色表示执行成功且没有对目标主机作修改。
命令二、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 ................#省略部份内容
命令三、ansible-playbook:
ansible-playbook是平常应用中使用率最高的命令,相似于Linux中的sh或source命令,用来执行系列任务。其工做机制是:经过读取预先编写好的playbook文件实现集中处理任务。ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式以下(playbook.yml文件须要提早编写好,最好指定playbook.yml的绝对路径):
[root@ansible ~]# ansible-playbook playbook.yml
命令四、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.2 192.168.1.3 root@web (2)[f:5]$ ifconfig ens33 #查询每一个主机的网卡信息 root@web (2)[f:5]$ exit #退出ansible-console环境
5、Ansible中自带的模块介绍:
一、command模块:
command模块在远程主机执行命令,不支持管道,重定向等shell特性,其他和shell相似,经常使用参数以下:
- chdir:在远程主机上运行命令前须要提早进入的目录。
- creates:在命令运行时建立一个文件,若是文件已经存在,则不会执行建立任务。
- removes:在命令运行时移除一个文件,若是文件不存在,则不会执行移除任务。
- executeble:指明运行命令的shell程序。
[root@ansible ~]# ansible all -m command -a "chdir=/home ls ./" #在全部主机上运行“ls ./”命令,运行前切换至/home目录下。
二、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.2 | SUCCESS | rc=0 >> 192.168.1.3 | SUCCESS | rc=0 >> [root@ansible ~]# ansible web -m shell -a ' cat /tmp/hello.txt' #查看编写的文件 192.168.1.3 | SUCCESS | rc=0 >> hello world 192.168.1.2 | SUCCESS | rc=0 >> hello world
三、copy模块:
copy模块用于复制指定主机文件到远程主机的位置,常见参数以下:
- src:指出源文件路径,可使用相对路径和绝对路径。支持直接指定目录,若是源是目录,则目标也要是目录。
- dest:指出复制文件的目标目录位置,使用绝对路径,支持直接指定目录。若是源是目录,则目标也要是目录,若是目标已经存在,则会覆盖原有内容。
- mode:指出复制时,目标文件的权限,可选。
- owner:指出复制时,目标文件的属主,可选。
- group:指出复制时,目标文件的属组,可选。
- content:指出复制到目标主机上的内容,不能与src一块儿使用,至关于复制content指明的数据到目标文件中。
[root@ansible ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=nobody group=root" #将本机的/etc/hosts文件复制到web组中的主机,并指定权限为777,属主为nobody,属组为root。
四、hostname模块:
hostname模块用于管理主机名,经常使用参数以下:
- name:指明主机名。
[root@ansible ~]# ansible 192.168.1.2 -m hostname -a "name=web1" #将主机192.168.1.2的主机名改成web1 192.168.1.2 | SUCCESS => { ansible_facts: { ansible_domain: , ansible_fqdn: web1, ansible_hostname web1 ansible_nodename: web1 }, changed: true name: web1 } [root@server1 ~]# hostname #在192.168.1.2主机上查看 web1 [root@server1 ~]# cat /etc/hostname #在192.168.1.2主机上查看 web1 #更改主机名后需重启才可以使新的主机名生效。
五、yum模块:
yum模块基于yum机制,对远程主机管理程序包,经常使用参数以下:
- name:程序包的名称,能够带上版本号。若不指明版本,则默认安装最新版本。
- state=present | latest | absent:指明对程序包执行的操做,present表示安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包。
- disablerepo:在用yum安装时,临时禁用某个仓库的ID。
- enablerepo:在用yum安装时,临时启用某个仓库的ID。
- conf_file:yum运行时的配置文件,而不是使用默认的配置文件。
- diable_gpg_check=yes | no:是否启用完整性校验功能。
[root@ansible ~]# ansible web -m yum -a "name=httpd state=present" <!-- 在web组中的主机上安装httpd服务,须要注意的是,管理端只是发送yum指令到被 管理端,被管理端要存在可用的yum仓库才能够成功安装。 -->
六、Service模块:
Service模块用来管理远程主机上的服务的模块,常见参数以下:
- name:被管理的服务名称。
- state=started | stopped | restarted | reloaded:动做包含启动、关闭、重启及从新加载配置文件。
- enabled=yes | no:表示是否设置该服务开机自启动。
- runlevel:若是设定了enabled开机自启动,则要定义在那些运行目标下自动启动,如2/3/4/5。
[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes" #启动httpd服务,并设置为开机自启动。
七、user模块:
user模块用于管理远程主机上的用户帐号,常见参数以下:
- name:必须参数,帐号名称。
- state=present | absent:建立或删除帐号,present表示建立,absent表示删除。
- system=yes | no:是否为系统帐户。
- uid:用户UID。
- group:用户的基本组。
- groups:用户的附加组。
- shell:默认使用的shell。
- home:用户的家目录。
- move_home=yes | no:若是设置的家目录已经存在,是否将已存在的家目录进行移动。
- password:用户的密码。
- comment:用户的注释信息。
- remove=yes | no:当state=absent时,是否要删除用户的家目录。
[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用户
八、group模块:
group模块用于管理组,用于新建或删除组,经常使用参数以下:
- gid:指定组的gid
- name:指定组的name
- state=present | absent:建立或删除
- system=yes | no:是否为系统组
[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' #删除刚刚建立的组。
九、mount模块:
mount模块用于挂载文件系统,经常使用参数以下:
- src:要挂载的设备或文件系统
- name:指定挂载点
- fstype:指定文件系统类型
- ots=w | r | o :设置文件读写类型,可组合使用。
- state=present | absent | mounted | unmounted:present表示只修改fstab文件中的配置,不自动建立挂载点,并且不挂载;absent表示删除挂载点,修改fstab文件;mounted:自动建立挂载点并挂载,添加自动挂载(fstab);unmounted:只卸载,不删除挂载点,不修改fstab文件。
[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参数仍是可使用的。
十、cron模块:
cron模块用来管理计划任务,经常使用参数以下:
- name:指定计划任务描述,必填
- job:要执行的任务
- user:运行计划任务的用户
- 执行时间:
minute:0-59,默认为 *
hour:0-23,默认为 *
day:1-31,默认为 *
month:1-12,默认为 *
weekday:1-7,默认为 *- state=present | absent:present表示添加计划任务;absent表示删除计划任务。
[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.2 | SUCCESS | rc=0 >> #Ansible: test */2 * * * * echo test >> /tmp/warrent.txt 192.168.1.3 | SUCCESS | rc=0 >> #Ansible: test */2 * * * * echo test >> /tmp/warrent.txt
十一、 script模块:
功能:在远程主机上执行主控端的脚本,至关于scp+shell组合。
用法以下:
[root@ansible ~]#ansible web -m script -a "/home/test.sh"
模块的举例就写这么多了吧,关于playbook配置文件的使用请参考:ansible自动运维工具之ansible-playbook详解