六.ansible批量管理服务
期中集群架构-第六章-ansible批量管理服务介绍
======================================================================
01. 批量管理服务知识介绍
a. ansible是一个基于Python开发的自动化运维工具
b. ansible是一个基于ssh协议实现远程管理的工具
c. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)
saltstack puppet
02. 批量管理服务特征介绍 简单便捷
a ansible软件服务端(管理端):不需要启动任何服务 默认服务端不需要任何的配置
b ansible软件客户端(受控端):没有客户端软件安装
03. ansible软件安装部署
a ansible软件自动化环境架构规划
管理主机1台:
10.0.0.61 m01
受控主机3台:
10.0.0.41 backup
10.0.0.31 nfs01
10.0.0.7 web01
Linux系统 6.9
b ansible软件自动化部署条件
建议基于ssh密钥方式建立远程连接
a ssh密钥对创建(管理主机)
ssh-keygen -t dsa
影响免交互创建密钥对创建因素:
1)需要指定私钥存放路径
-f 指定私钥路径
-f /root/.ssh/id_dsa
2)需要进行私钥文件密码设定
-N/-P
-N ""/-P "" 密码为空
免交互创建密钥对方法
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
b 分发公钥文件(管理主机进行分发)
# ssh-copy-id -i /root/.ssh/id_dsa.pub lianxizc@118.24.2.20
ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
影响免交互批量分发密钥因素:
1)需要有确认连接过程,需要输入yes/no
-o StrictHostKeyChecking=no
免交换分发公钥最终
sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"
2)需要解决密码问题
sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
Now try logging into the machine, with "ssh '172.16.1.31'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
免交互批量分发公钥脚本:
#!/bin/bash
\rm /root/.ssh/id_dsa*
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
for ip in 31 41 7
do
sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
done
密码
ssh-copy-id 指定ssh 17524端口在/root/.ssh/下添加config文件内容为port 17524
c 检查是否可以进行基于密钥远程管理
ssh 172.16.1.31 uptime
免交互批量检查测试脚本
#!/bin/bash/
if [ $# -ne 1 ];then
echo "input one agrs"
exit 1
fi
for ip in 31 41 7 8 9
do
echo ===== info 172.16.1.$ip =====
ssh -p17524 172.16.1.$ip $1
echo ""
done
运行测试检查主机名称

补充说明:ssh-copy-id 公钥分发原理
which ssh-copy-id
/usr/bin/ssh-copy-id
vim /usr/bin/ssh-copy-id
第41行:
{ eval "$GET_ID" ; } | ssh $1 "exec sh -c 'cd; umask 077;test -d .ssh || mkdir .ssh ;
cat >> .ssh/authorized_ keys && (test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)'" || exit 1
1.临时设置一个umask值 为077
2.test -d 判断是否存在.ssh/目录,没有就利用脚本创建.ssh/目录
3.将本地公钥文件中的信息重定向到远程主机的.ssh/authorized_ keys文件中
并授权此文件为600权限
基于以上信息知道,分发公钥实际上是通过ssh命令来实现的
通过修改ssh-copy-id信息
第一种
把-p参数添加进去 也就解决了指点端口号分发公钥
ssh -p17524 $1 "exec sh -c 'cd; umask 077
第二种
利用$1 传参数 ip地址相当于$1 把它和-p 17524整合一起
ssh-copy-id -i /root/.ssh/id_dsa.pub "172.16.1.31 -p17524"
或者:
在/root/.ssh/下添加config文件内容为port 17524 也可
为什么$1 是最后的ip地址不是排在第一的 -i 呢
# vim shift_test.sh
#!/bin/bash
until [ $# -eq 0 ]
do
echo $* #输出所有参数
shift #shift命令主要在脚本中应用时会将传参的参数依次向前推进
done
只要是ssh 的参数都可以和ip进行一个捆绑
列如
sshpass -p333333 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
基于ssh口令方式建立远程连接(也可以)
vim /etc/ansible/hosts
[oldboy]
172.16.1.7
172.16.1.31 ansible_user=root ansible_password=123456
172.16.1.41
ansible 172.16.1.31 -m command -a "hostname" -k --- 实现口令交互式远程管理
SSH password:
172.16.1.31 | SUCCESS | rc=0 >>
nfs01
ansible管理主机软件安装:
yum install -y ansible
ansible受控主机软件安装:(可选)
yum install -y libselinux-python
d ansible软件受控主机添加配置
cat /etc/ansible/hosts
[oldboy] 分组
172.16.1.7:17524 添加受控主机和指定ssh端口号
172.16.1.31:17524 。。。。。。。
172.16.1.41:17524 。。。。。。。
如果受控主机不能基于秘钥的方式认证,基于口令的免交互连接
可以在host文件中主机ip后面添加上指定的 用户和密码
172.16.1.31:17524 ansible_user=root ansible_password=333333
04. ansible软件应用过程
ansible oldboy -m command -a "hostname"
ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数
主机信息:远程主机IP地址 远程主机组名称 远程所有主机all
-m 指定相应模块
-a 利用模块中某些参数功能
命令模块:
第一个模块:command
官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html
参数:chdir---在执行某个命令前,先切换目录
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/tmp
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/etc/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/etc
参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf exists
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf.bak exists
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup
参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.1212213123 does not exist
参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
ansible 172.16.1.41 -m command -a "ls"
172.16.1.41 | SUCCESS | rc=0 >>
1
anaconda-ks.cfg
dead.letter
heqing
第二个模块:shell模块 (相当于万能模块)
参数:chdir---在执行莫个命令前,先切换目录
参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
[root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls;pwd"
172.16.1.41 | SUCCESS | rc=0 >>
1
anaconda-ks.cfg
dead.letter
/root
说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;
第三个模块:script---专门运行脚本模块 让脚本在受控主机上执行
参数:chdir---在执行莫个命令前,先切换目录
参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
ansible 172.16.1.41 -m script -a "/server/scripts/yum.sh"

文件类型模块:
第一个模块:copy----复制模块
参数:backup---对数据信息进行备份
[root@m01 ansible]# ansible 172.16.1.41
-m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes"
172.16.1.41 | SUCCESS => {
"backup_file": "/tmp/file01.txt.71887.2018- 4-02@23:33:19~",
"changed": true,
"checksum": "029b054db136cc36d5605e3818305825ff4b8ffb",
"dest": "/tmp/file01.txt",
"gid": 0,
"group": "root",
"md5sum": "434660b5ad7deeba8815349f71409405",
"mode": "0644",
"owner": "root",
"size": 6,
"src": "/root/.ansible/tmp/ansible-tmp-1522683197.05-52744169892601/source",
"state": "file",
"uid": 0
}
参数:src---定义要推送数据信息
参数:dest---定义将数据推送到远程主机什么目录中
[root@m01 ansible]# touch /tmp/file01.txt
[root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
172.16.1.41 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/file01.txt",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1522682948.27-60532389065095/source",
"state": "file",
"uid": 0
}
[root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
172.16.1.41 | SUCCESS | rc=0 >>
total 24
-rw-r--r-- 1 root root 0 Apr 2 23:29 file01.txt
参数:owner---设置复制后的文件属主权限
参数:group---设置复制后的文件属组权限
参数:mode---设置复制后的文件权限(600 755)
第二个模块:file----文件属性修改/目录创建/文件创建
参数:owner---设置复制后的文件属主权限
参数:group---设置复制后的文件属组权限
参数:mode---设置复制后的文件权限(600 755)
ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600"
172.16.1.41 | SUCCESS => {
"changed": true,
"gid": 500,
"group": "oldboy",
"mode": "0600",
"owner": "oldboy",
"path": "/tmp/file01.txt",
"size": 6,
"state": "file",
"uid": 500
}
参数state---用于指定创建目录或文件
创建文件
ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt state=touch"
172.16.1.41 | SUCCESS => {
"changed": true,
"dest": "/tmp/file01.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
检查文件
ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
创建目录:
ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory"
172.16.1.41 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/dir01",
"size": 4096,
"state": "directory",
"uid": 0
}
检查目录
[root@m01 ~]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
172.16.1.41 | SUCCESS | rc=0 >>
total 2
drwx------ 2 root root 1024 May 6 22:46 ansible_d8WnHE
drwxr-xr-x 2 root root 1024 May 6 22:45 zhou
包管理模块类型
模块:yum---安装软件包模块
name:执行要安装软件的名称,以及软件的版本
state:installed安装 absent(卸载)
ansible 172.16.1.41 -m yum -a "name=iftop state=installed"
ansible 172.16.1.41 -m yum -a "name=iftop state=absent"
list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了
ansible 172.16.1.41 -m yum -a "list=iftop"
系统模块类型
模块:
service---管理服务状态模块
name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
state:停止stopped 启动started 重启restarted 平滑重启reloaded
enabled:yes表示服务开机自启动 no表示服务开机不要自动启动
关闭crond服务 关闭开机自启动
# ansible 172.16.1.31 -m service -a "name=crond state=stopped enabled=no"

开启crond服务 和开机自动启动
ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"

cron---定时任务模块
* * * * * /bin/sh /server/scripts/test.sh &>/dev/null
分minute=0-59 * */n , -
时 hour
日day
月month
周weekday
# ansible 172.16.1.31 -m ceon -a "minute=0 hour=0 day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh &>/dev/null'"
默认就是每天 月 周可以省略
# ansible 172.16.1.31 -m ceon -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'
添加定时任务
ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
name=.... 定义定时任务的名称 避免任务重复 这是完整方法
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
删除定时任务
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"
state=absent 删除定时任务
ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"
注释定时任务
yes注释 no取消注释
ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"
ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no"
总结ansible颜色信息:
绿色:查看远程主机信息,不会对远程主机系统做任何修改
红色:执行操作出现异常错误
黄色:对远程主机系统进行修改操作
粉色:警告或者忠告信息
ansible软件剧本
编写剧本规范:
http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml
①. - 用法说明,表示列表显示的内容
水果信息:
- 苹果
- 香蕉
- 西瓜
②. : 用法说明:前面表示名称 后面表示值
姓名: 张三
性别: 男
人员信息:
- 运维人员: sa
- 开发人员: dev
- 存储人员: dba
③. 空格 用法说明:
对内容进行分级时,需要有两个空格表示分级
软件安装步骤:
- 服务端安装步骤:
第一个里程碑: 检查软件是否安装
第二个里程碑: 编写配置文件内容
- 客户端安装步骤:
补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割
执行脚本方法:
ansible-playbook /etc/ansible/ansible-playbook/test.yaml
模拟执行剧本 -C
ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml
一键部署rsync 服务
- hosts: 172.16.1.41 定义主机
tasks: 任务格式 任务和主机是不同的级别所以空两格
- name: 描述任务级别又不同继续空两格
yum: 命令又是一个级别再空两格
安装rsync
- name: 跟上面的name一个级别- 划列表
copy: rsync的配置文件统一放在一个文件夹里
把它推送到服务端的/etc/目录下
user 创建目录 createhome=no 不创建家目录 shell指定解释器
copy 事先保存的秘钥模板文件推送到服务端/etc/目录 并设置权限600
fiel 创建备份目录 并设置属主 属组
shell 命令启动rsync的守护进程 creates=判断rsync的进程id文件是否存在
如果 存在就不执行启动命令
- hosts 构成列表 以下是部署客户端
生成一个认证文件 和权限设置

作业:
01. nfs服务一键化部署
02. inotify/sersync软件一键化部署
六.ansible批量管理服务的更多相关文章
- Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务
SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ...
- ansible批量管理服务 上
1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ...
- ansible批量管理服务 下
1 ansible-playbook 任务剧本 1.1 剧本文件概念 (1)playbook可以将多个批量操作模块功能整合,完成一件事情.(2)简化运维工作复杂度(3)playbook通过yaml语法 ...
- Ansible 批量管理Windows Server服务器
Ansible批量管理Windows Server Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppe ...
- 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...
- linux运维、架构之路-ansible批量管理
一.ansible软件 1.介绍 ①ansible是一个基于Python开发的自动化运维工具 ②其功能实现基于SSH远程连接服务 ③ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量 ...
- ansible批量管理软件部署及剧本
服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 -.el6.x86_64 # SMP Tue Mar :: UTC x86_64 x86_6 ...
- Linux中ansible批量管理软件部署及剧本编写
服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...
- Linux系统——Ansible批量管理工具
批量管理工具: (1)ansible 操作简单(适用于500台以下服务器) (2)saltstack 比较复杂(一般适用于1000-4w台服务器) (3)puppet超级复杂 systemctl(统一 ...
随机推荐
- 剖析height百分比和min-height百分比
height的百分比 当我们给块元素设置百分比高度时,往往没能看到效果.因为百分比的大小是相对其最近的父级元素的高的大小,也就是说,其最近的父级元素应该有一个明确的高度值才能使其百分比高度生效. &l ...
- vue组件之前嵌套
https://www.cnblogs.com/chengduxiaoc/p/7099552.html <!DOCTYPE html> <html lang="en&quo ...
- linux 命令ls
命令格式 ls -la /etc -a 查看所有隐藏文件 以.开头的,就是隐藏文件.改名.开头,就可以改成隐藏文件 -l 长格式显示 ]# ls -al total 8 drwxr-xr-x ...
- 4.1 socket
socket 背景概念 脑图结构 OSI 模型 socket 概念特性 脑图结构 理解示意图 额外补充 Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口. 在设计模式中 ...
- 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
[bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...
- Java【初识篇】语言概述
什么是计算机语言 语言:是人与人之间用于沟通的一种方式.例如:中国人与中国人用普通话沟通.而中国人要和英国人交流,就要学习英语.计算机语言(编程语言):人与计算机交流的方式.如果人要与计算机交流,那么 ...
- shell 基础(一)
废话少说 往下看 1. 查看 Shell Shell 是一个程序,一般都是放在/bin或者/user/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中./e ...
- go Test的实现 以及 压力测试
引用 import "testing" 一些原则 文件名必须是 *_test.go* 结尾的,这样在执行 go test 的时候才会执行到相应的代码 必须 import testi ...
- Linux下查看Nginx安装目录、版本号信息及当前运行的配置文件
Linux环境下,怎么确定Nginx的安装路径 输入命令行: ps -ef | grep nginx 摁回车,将出现如下图片: master process 后面的就是的 /data/software ...
- 第四届CCCC团体程序设计天梯赛 后记
一不小心又翻车了,第二次痛失200分 1.开局7分钟A了L2-3,一看榜已经有七个大兄弟排在前面了,翻车 * 1 2.把L1-3 A了18分,留了两分准备抢顽强拼搏奖,最后五秒钟把题过了,万万没想到还 ...