Ansible批量自动化管理工具

匿名 (未验证) 提交于 2019-12-02 23:03:14

批量管理服务器的工具
无需部署agent,通过ssh进行管理
流行的自动化运维工具:https://github.com/ansible/ansible

可视化运维(主要用在可视化部署)
持续构建,可以和git,svn结合
可结合ssh实现可视化运维
可结合ansible实现可视化运维

Centos7.5(yum -y install net-tools vim)
关闭防火墙(systemctl stop firewalld,systemctl disable firewalld)
关闭selinux

安装支持包

[root@ansibel ~]# yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-d
evel unzip zlib-devel zlib openssl-devel openssl

源码编译Python3.5

[root@ansibel ~]# tar xf Python-3.5.2.tgz -C /usr/src/
[root@ansibel ~]# cd /usr/src/Python-3.5.2/
[root@ansibel Python-3.5.2]# ./configure --prefix=/usr/local/python/

[root@ansibel Python-3.5.2]# make && make install

[root@ansibel Python-3.5.2]# ln -s /usr/local/python/bin/python3 /usr/bin/python3
[root@ansibel Python-3.5.2]# which python3
/usr/bin/python3
[root@ansibel Python-3.5.2]# python3 -V
Python 3.5.2

安装ansible最新版本

[root@ansibel Python-3.5.2]# /usr/local/python/bin/pip3 install --upgrade pip

[root@ansibel Python-3.5.2]# /usr/local/python/bin/pip3 install ansible

静心等待ansible安装完毕后

[root@ansibel Python-3.5.2]# ln -s /usr/local/python/bin/ansible /usr/local/bin/
[root@ansibel Python-3.5.2]# which ansible
/usr/local/bin/ansible
[root@ansibel Python-3.5.2]# ansible --version
ansible 2.7.5





[root@ansible ~]# /usr/local/python/bin/ansible-doc -l 查看总帮助
[root@ansible ~]# /usr/local/python/bin/ansible-doc -s shell 查看shell模块的帮助
[root@ansible ~]# /usr/local/python/bin/ansible-doc -s raw 查看raw模块的帮助

ansible是无agent的,无agent是怎么批量管理服务器的?主要是借用ssh来批量管理服务器。
ssh默认登陆是需要密码的,所以管理起来比较麻烦,本次实验主要是介绍ssh的无密码登陆。
ssh无密码登陆实现以后,使用ansible批量管理服务器就变得简单了。

HostIP
ansible 10.1.1.131
web01 10.1.1.132
web02 10.1.1.133

生成秘钥对

[root@ansibel python]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ""
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
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:xxnEp0IW6w0wuI6oPA5TOp/m0pRo/X7TTHXRl9EkoeY root@ansibel
The key's randomart image is:
+---[RSA 2048]----+









+----[SHA256]-----+
分发秘钥

[root@ansibel python]# ssh-copy-id -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=
no" 10.1.1.132
进行免密码登录测试

[root@ansibel python]# ssh 10.1.1.132
Last login: Tue Dec 25 18:52:58 2018 from 10.1.1.1
[root@web01 ~]# hostname -I
10.1.1.132
[root@web01 ~]# exit
logout
Connection to 10.1.1.132 closed.
[root@ansibel python]# hostname -I
10.1.1.131

通过pip安装的ansible是没有配置文件的。我们需要创建一个

  • 特别提示:
  • Web01 ===> 主机名
  • ansible_ssh_host ===>主机IP
  • ansible_ssh_port ===>ssh的默认端口
  • ansible_ssh_user ===>ssh的用户名
  • ansible_ssh_pass ===>ssh的用户的连接密码

[root@ansibel python]# mkdir -p /etc/ansible
[root@ansibel python]# > /etc/ansible/hosts
[root@ansibel python]# vim /etc/ansible/hosts
#ansible主机管理配置文件
#被管理的主机组名称
#第一台主机

#第二台主机

如果我们已经设置了ssh免密钥了。那么就不需要写密码了。例如:web01
我们要是没有设置免密钥,那么就需要安装sshpass工具,并在/etc/ansible/hosts文件里写上主机的连接密码。例如web02

#下载epel源安装sshpass

[root@ansible python]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

[root@ansible python]# yum -y install sshpass

[root@ansible python]# which sshpass

/usr/bin/sshpass

语法:

ansible chensiqi -m command -a 'uptime'
ansible 主机组 -m ansible内置功能模块名 -a 命令

进行命令测试:

[root@ansibel ansible]# ansible web01 -m command -a 'uptime'
web01 | CHANGED | rc=0 >>


[root@ansibel ansible]# ansible web02 -m command -a 'uptime'
web02 | CHANGED | rc=0 >>


[root@ansibel ansible]# ansible web01 -m command -a 'hostname -I'
web01 | CHANGED | rc=0 >>
10.1.1.132

[root@ansibel ansible]# ansible web02 -m command -a 'hostname -I'
web02 | CHANGED | rc=0 >>
10.1.1.133

[root@ansibel ansible]# ansible nginx -m ping
web01 | SUCCESS => {


}
web02 | SUCCESS => {


}

ansible -i /etc/ansible/hosts 主机或主机组 -m 指定模块 -a 命令

不用-i指定配置文件默认为/etc/ansible/hosts

ansible all -m ping

主机组,主机,all代表所有

主机和主机组注意事项:

主机组范围

解释

all

代表所有主机

Web01:web02

可以指定多台主机

all:\!web01

指定all但不包含web01,注意!前需要加转意符号\

[root@ansibel ansible]# ansible all -m ping
web01 | SUCCESS => {


}
web02 | SUCCESS => {


}

#command支持直接回显命令的执行结果

[root@ansibel ansible]# ansible all -m command -a "pwd"
web01 | CHANGED | rc=0 >>
/root

web02 | CHANGED | rc=0 >>
/root

#command模块不支持管道符操作

[root@ansibel ansible]# ansible all -m command -a "echo test | grep t"
web01 | CHANGED | rc=0 >>
test | grep t

web02 | CHANGED | rc=0 >>
test | grep t

#command模块不支持重定向操作

[root@ansibel ansible]# ansible all -m command -a "echo bb >> /tmp/testansible"
web01 | CHANGED | rc=0 >>
bb >> /tmp/testansible

web02 | CHANGED | rc=0 >>
bb >> /tmp/testansible

#shell模块支持管道符

[root@ansibel ansible]# ansible all -m shell -a "echo test | grep t"
web02 | CHANGED | rc=0 >>
test

web01 | CHANGED | rc=0 >>
test

#shell支持重定向

[root@ansibel ansible]# ansible all -m shell -a "echo bb >> /tmp/testansible"
web01 | CHANGED | rc=0 >>


web02 | CHANGED | rc=0 >>

[root@web01 tmp]# ls
testansible
[root@web01 tmp]# cat testansible
bb

[root@web02 tmp]# ls
testansible
[root@web02 tmp]# cat testansible
bb

如果遇到特殊符号需要加入\转义,这样子ansible才能正常运行

[root@ansibel ansible]# ansible web01 -m shell -a "cat /etc/passwd | awk -F":" '{p
rint \$1}' "

web01 | CHANGED | rc=0 >>
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
rpc
rpcuser
nfsnobody

两边都没有挂光盘,用ansible批量管理给他们一起挂光盘。

[root@ansibel ansible]# ansible all -m raw -a 'mount /dev/sr0 /media/cdrom'
web01 | CHANGED | rc=0 >>
mount: /dev/sr0 is write-protected, mounting read-only
Shared connection to 10.1.1.132 closed.


web02 | CHANGED | rc=0 >>
mount: /dev/sr0 is write-protected, mounting read-only
Shared connection to 10.1.1.133 closed.

用ansible批量搭建yum仓库

[root@ansibel ansible]# ansible all -m raw -a 'mv /etc/yum.repos.d/* /tmp/'
web01 | CHANGED | rc=0 >>
Shared connection to 10.1.1.132 closed.


web02 | CHANGED | rc=0 >>
Shared connection to 10.1.1.133 closed.

[root@ansibel ansible]# ansible all -m copy -a 'src=/etc/yum.repos.d/CentOS-Media.
repo dest=/etc/yum.repos.d/'

.............中间信息略..................................

测试安装nmap

[root@ansibel ansible]# ansible all -m shell -a 'yum -y install nmap'

六,ansible的copy模块批量下发文件或文件夹

6.1 copy模块概述

copy模块的参数,ansible 主机组 -m 模块 -a 命令

  • src:指定源文件或目录
  • dest:指定目标服务器的文件或目录
  • backup:是否要备份
  • owner:拷贝到目标服务器后,文件或目录的所属用户
  • group:拷贝到目标服务器后,文件或目录的所属群组
  • mode:文件或目录的权限

6.2 copy模块拷贝文件

特别提示:如果目标路径不存在会自动创建
src===>源文件路径 dest=目标路径位置

[root@ansibel ansible]# cd /tmp
[root@ansibel tmp]# ls
[root@ansibel tmp]# echo "aaa" >> test
[root@ansibel tmp]# cat test
aaa

[root@ansibel ansible]# ansible all -m copy -a 'src=/tmp/test dest=/tmp/'

6.3 copy模块拷贝文件夹

特别提示:
如果目标路径里有与我拷贝的文件同名文件的话,会直接覆盖目标路径下的文件

[root@ansible ~]# mkdir -p /service/scripts
[root@ansible ~]# echo "aaa" > /service/scripts/test.txt
[root@ansible ~]# echo "bbb" > /service/scripts/test2.txt

#拷贝/service/scripts/ 目录下所有内容到dest的路径下(注意两条命令的对比)

[root@ansible ~]# ansible web01 -m copy -a "src=/service/scripts/ dest=/service/sc
ripts/"

web01 | CHANGED => {



}

#拷贝/service/scripts目录本身及其内部的所有内容到dest的路径下(注意两条命令的对比)

[root@ansible ~]# ansible web02 -m copy -a "src=/service/scripts dest=/service/scr
ipts/"

web02 | CHANGED => {



}

特别提示:
参数:backup=yes ===>意思是,如果目标路径下,有与我同名但不同内容的文件时,在覆盖前,对目标文件先进行备份。


[root@ansible ansible]# cat /tmp/test
aaa
bbb

[root@ansible ansible]# ansible all -m copy -a 'src=/tmp/test dest=/tmp/ backup=ye
s'

6.5 copy模块指定用户和属主,权限。

[root@ansible ansible]# ansible web01 -m copy -a 'src=/tmp/test dest=/tmp/ owner=n
obody group=nobody mode=0600'

七,ansible的script模块批量运行脚本

ansible的script模块能够实现远程服务器批量运行本地的shell脚本

操作示例-->远程批量分发并自动部署nginx,所有被管理端需要挂载光盘,并创建本地yum配置文件

[root@ansible scripts]# pwd
/service/scripts
[root@ansible scripts]# vim auto_nginx.sh
[root@ansible scripts]# cat auto_nginx.sh
#!/bin/sh
#nginx install shell scripts
test -d /media/cdrom || mkdir -p /media/cdrom
mount /dev/sr0 /media/cdrom &>/dev/null

evel &>/dev/nulltest -d /service/scripts || exit 3
cd /service/scripts/
tar xf nginx-1.10.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.10.2/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_stat
us_module &>/dev/nullmake &>/dev/null
make install &>/dev/null
exit 0
[root@ansible scripts]# vim fenfa.sh
[root@ansible scripts]# cat fenfa.sh
#!/bin/sh

Group=$1
ansible $Group -m copy -a "src=/service/scripts/ dest=/service/scripts/"
ansible $Group -m script -a "/service/scripts/auto_nginx.sh"
[root@ansible scripts]# ls

注:auto_nginx.sh #自动安装nginx脚本

激活脚本

[root@ansible scripts]# sh fenfa.sh all

此脚本只是个演示示例,工作中需要写的尽量严谨一些。

八,ansible-playbook的初步使用

playbook的使用,playbook可以把ansible的模块进行组合

[root@ansible scripts]# ln -s /usr/local/python/bin/ansible-playbook /usr/local/bin

[root@ansible scripts]# which ansible-playbook
/usr/local/bin/ansible-playbook

ansible-playbook剧本,可以像拍戏一样把各个模块编成一个故事,设定一个剧本,什么情况下就去执行什么样的,甚至还可以吧if或者else的判断加进去。还能对他的某些结果进行判断。剧本用yaml结尾

用playbook执行shell模块

[root@ansible scripts]# mkdir bak
[root@ansible scripts]# mv *.sh bak/
[root@ansible scripts]# mv *.gz bak/
[root@ansible scripts]# ls
bak

8.1 playbook的简单shell模块的使用

黄色执行成功对对方电脑做出改变,绿色执行成功,不作出改变,红色失败。

  • 模板说明:
  • --- #开头必须有三个小-,顶格写
  • - hosts #正文配置代码的第一级,必须有两个空格(-占一个空格位)
  • - host: web01 #web01是host参数的值,值和hosts:之间要有一个空格
  • tasks: #tasks:表示接下来要执行的具体任务
  • - name: #相对于tasks再多缩进两个格(-占一个空格位),表示属于tasks的下一级
  • - name: test #test只是要执行的具体命令的名字可以随便写。name:后还是有一个空格要注意
  • shell: #表示调用shell模块执行命令相对于tasks仍旧要多缩进两个空格
  • shell: echo "xxx" >> xxx #shell:后边还是要有个空格,需要注意。

[root@ansible scripts]# vim test_shell.yaml
[root@ansible scripts]# cat test_shell.yaml
---
- hosts: web01




执行playbook配置文件

[root@ansible scripts]# ansible-playbook test_shell.yaml

8.2 playbook的简单copy模块的使用

[root@ansible scripts]# echo "welcom to yunjisuan" >> /tmp/test_copy
[root@ansible scripts]# vim test_copy.yaml
[root@ansible scripts]# cat test_copy.yaml
---
- hosts: all



[root@ansible scripts]# ansible-playbook test_copy.yaml

8.3 playbook使用register输出命令运行结果

我们在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。
我们可以通过register模块最加输出命令的执行结果


[root@ansible scripts]# cat test_register.yaml
---
- hosts: all




register: print_result #将之前命令的输出结果保存在变量print_result里,变量名随便取。

- debug: var=print_result #将变量的值作为debug输出出来。var是固定的。调用debug模块・

Stdout标准屏幕输出。

[root@ansible scripts]# ansible-playbook test_register.yaml

PLAY [all] ***********************************************************************

TASK [Gathering Facts] ***********************************************************
ok: [web01]
ok: [web02]

TASK [test register] *************************************************************
changed: [web02]
changed: [web01]

TASK [debug] *********************************************************************
ok: [web01] => {















}
ok: [web02] => {















}

PLAY RECAP ***********************************************************************

8.4 nginx配置下发并检测

[root@ansible scripts]# vim test_nginx_conf.yaml
[root@ansible scripts]# cat test_nginx_conf.yaml
---
- hosts: all






[root@ansible scripts]# vim test_vars.yaml
[root@ansible scripts]# cat test_vars.yaml
---
- hosts: all
#定义变量
#第一个name变量
#第二个age变量

#{{}}两对大括号引用变量,变量名两头空格


  • 特别提示:
  • 引用变量需要在双引号中引用。

[root@ansible scripts]# ansible-playbook test_vars.yaml
#这里提示,name是一个保留的内置变量,我们在自定义时不能用
................................中间信息略...........................................

有警告是因为自定义变量和系统的内置保留变量同名了,在使用自定义变量时,我们要特别注意不要和系统的内置保留变量同名,容易引发问题。

修改一下name这个变量再发送,就不会出警告了。

在使用自定义变量时,我们要特别注意不要和系统的内置保留变量同名,容易引发问题。

[root@ansible scripts]# vim test_vars.yaml
[root@ansible scripts]# cat test_vars.yaml
---
- hosts: all







9.2 在playbook中使用ansible内置变量

我们可以使用ansible all -m setup | less查看ansible内置变量

ansible 127.0.0.1 -m setup | less 看自己的ansible内置变量。

[root@ansible scripts]# vim test_setupvars.yaml
[root@ansible scripts]# cat test_setupvars.yaml
---
- hosts: all
#使用ansible内置变量




通过使用ansible的内置变量可以批量取服务器的许多内置信息

[root@ansible scripts]# ansible-playbook test_setupvars.yaml

PLAY [all] ***********************************************************************

TASK [Gathering Facts] ***********************************************************
ok: [web01]
ok: [web02]

TASK [setup var] *****************************************************************
changed: [web02]
changed: [web01]

TASK [debug] *********************************************************************
ok: [web01] => {















}
ok: [web02] => {















}

PLAY RECAP ***********************************************************************

简单演示一下ansible内置变量的取用方法ansible all -m setup | less

[root@ansible scripts]# vim test_setupvars.yaml
[root@ansible scripts]# cat test_setupvars.yaml
---
- hosts: all








[root@ansible scripts]# vim test_setupvars.yaml
[root@ansible scripts]# cat test_setupvars.yaml
---
- hosts: all








[root@ansible scripts]# vim test_setupvars.yaml
[root@ansible scripts]# cat test_setupvars.yaml
---
- hosts: all








[root@ansible scripts]# ansible-playbook test_setupvars.yaml

十,Playbook下发可变配置文件

配置文件如果使用copy模块去下发的话,那配置都是一样的;
如果下发的配置文件里有可变的配置,需要用到template模块。

10.1 利用template模块下发可变的配置文件

copy模块分发的是不能变的模块

eg:变量原封不动没有改变。copy模块识别不了变量。


[root@ansible scripts]# cat /tmp/test
#自定义变量
#系统变量

[root@ansible scripts]# ansible web01 -m copy -a 'src=/tmp/test dest=/tmp/'

利用template模块下发可变的配置文件
[root@ansible scripts]# vim test_filevars.yaml
[root@ansible scripts]# cat test_filevars.yaml
---
- hosts: all
#开启系统变量

#自定义变量


#使用template下发可变配置文件

[root@ansible scripts]# ansible-playbook test_filevars.yaml

10.2 下发配置文件里面使用判断语法

[root@ansible scripts]# vim /tmp/if.j2
[root@ansible scripts]# cat /tmp/if.j2
#if PORT存在
ip=0.0.0.0:{{ PORT }}
#否则的话
ip=0.0.0.0:80
#结尾

[root@ansible scripts]# vim test_ifvars.yaml
[root@ansible scripts]# cat test_ifvars.yaml
---
- hosts: all
#开启系统内置变量

#自定义变量



[root@ansible scripts]# ansible-playbook test_ifvars.yaml

如果我们将变量PORT值为空的话,就会是另外的结果

[root@ansible scripts]# vim test_ifvars.yaml
[root@ansible scripts]# cat test_ifvars.yaml
---
- hosts: all






[root@ansible scripts]# ansible-playbook test_ifvars.yaml

十一,Playbook的notify通知和下发nginx配置

#实战下发可执行动作的可变的nginx配置文件

先把两边nginx服务开启

[root@ansible scripts]# vim test_nginxvars.yaml
[root@ansible scripts]# cat test_nginxvars.yaml
---
- hosts: all














[root@ansible scripts]# ansible-playbook test_nginxvars.yaml

服务发生改变了。

把服务再次启动,再发就不会发生改变了。

[root@ansible scripts]# ansible-playbook test_nginxvars.yaml





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!