Linux系统——Ansible批量管理工具
批量管理工具:
(1)ansible 操作简单(适用于500台以下服务器)
(2)saltstack 比较复杂(一般适用于1000-4w台服务器)
(3)puppet超级复杂
systemctl(统一管理命令)
chkconfig、service等的功能都被systemctl替代
# system stop iptables.service(7.5版的防火墙是firewalld,企业中一般不用firewalld,直接关闭 # systemctl stop firewalld)
#enable disable(开启或关闭服务的开机自启动)
# stop start (立即开启或关闭服务)
# status(状态)
# systemctl stop firewalld(关闭防火墙服务)
# systemctl disable firewalld(关闭防火墙服务的开机自启动)
# systemctl stop NetworkManager(用来代替网卡的配置文件,管理网络,优先级高过配置文件,但是有事会出现网卡换了个IP,但重启以后未生效,就是这个服务造成的,还会导致IP 掉线)
# systemctl disable NetworkManager
部署环境时的设置
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# systemctl disable NetworkManager
安装和yum有关的所有yum源
# yum -y install epel-release
ansible特点:
通过一台管理机远程批量操作多台(500以下),无需客户端(saltstack需要安装客户端),基于Python,ansible利用ssh通道(操作要进行免密钥)
生产环境中ansible管理服务器是直接连接超级用户的,需要做很多安全处理
(1)修改ssh登录
# vim /etc/ssh/sshd_config
17行 Port 22端口改为1万以上
38行PermitRootLogin yes改为no 设为禁止超级用户远程登录(最后改动,避免掉线)
43行PubkeyAuthentication yes 默认开启,否则密钥验证就会失效
47行AuthorizedKeysFile .ssh/authorized_keys 公钥文件的位置
65行PasswordAuthentication yes 是否开启密码验验证登陆(最后设置)
79行GSSAPIAuthentication yes 是否关GASSPI认证
115行UseDNS yes 改为no 关闭DNS反向解析,提高ssh解析速度
# vim /etc/ssh/ssh_config
将StrickHostKeyChecking 的no改为yes
修改完配置文件后重启,用普通用户登录
创建普通用户
# useradd yunjisuan
客户端创建密钥,传递公钥连接到服务端的超级用户(将原公钥删除),将客户端的私钥放到xshell中,用免密方式导入到客户端,连接登录到服务端
# scp ~/.ssh/id_rsa.pub 192.168.214.144:/home/yunjisuan
(现在已经使用密钥登录服务端了)
此时修改sshd的配置文件,将第65行的PasswordAuthentication的yes改为no
重启配置文件后,已经不能使用密码登录了,必须使用私钥才能登陆
(2)设置xshell私钥登录linux
# cd .ssh
# cp authorized_keys /home/yunjisuan
# mkdir -p .ssh
# chmod 700 .ssh
# mv authorized_keys .ssh/
# chown -R yunjisuan.yunjisuan .ssh
新建xshell会话框,ip为客户端IP地址,用公钥登录普通用户
(3)用户权限策略
(a)给普通用户设置权限,visudo(在root端)
yunjisuan ALL= NOPASSWD:ALL
(b)查看用户授权情况
# sudo -l
(c)# sudo su -
提权到超级用户
(d)修改/etc/ssh/sshd_config的配置要求(在root端)
重启后(#systemctl reload sshd),登录普通用户,更改端口号,再sudo su - 连接超级用户
(1)配置ansible管理服务sudo审计日志
开启sudo日志
# echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf
# echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers
测试sudo日志记录
[root@ansible ~]# exit
登出
[yunjisuan@ansible ~]$ sudo su -
[sudo] yunjisuan 的密码:
上一次登录:日 9月 9 21:40:11 CST 2018pts/0 上
查看/var/log/sudo.log日志
[root@ansible ~]# cat /var/log/sudo.log
Sep 9 21:49:12 : yunjisuan : TTY=pts/0 ; PWD=/home/yunjisuan ; USER=root ;
COMMAND=/bin/su -
(5)安装ansible
# yum -y install epel-release
[root@ansible ~]# yum -y install ansible
[root@ansible ~]# ansible --version
(2)配置主机清单
# > /etc/ansible/hosts
# vim /etc/ansible/hosts
[nginx](模块名)
WebA ansible_ssh_host=192.168.214.123 (Web服务器的名字+IP地址)
WebB ansible_ssh_host=192.168.214.124 ansible_ssh_pass=666666
若已设置免密钥,配置完毕
ansible_ssh_host:被管理主机IP
ansible_ssh_user:被管理主机用户名
ansible_ssh_pass:被管理主机用户的登陆密码
ansible_sudo_pass:被管理主机用户sudo时的密码
(3)设置SSH免密钥登录
# ssh-keygen
# ssh-copy-id 192.168.214.140
# ssh-copt-id 192.168.214.145
(7)Ansible服务器简单的综合安全管理策略
(1)禁止非root用户查看Ansible管理服务器端/etc/hosts文件
# chmod 600 /etc/hosts
(2)禁止非root用户查看Ansible的主机清单配置文件
# chmod 600 /etc/ansible/hosts
Ansible的基础应用
Ansible可以使用命令行的方式进行自动化管理。命令的基本语法如下所示:
ansible <被操控的主机或主机组或all> [-m 模块名] [-a 具体命令]
# ansible Web01 -m command -a 'uptime'
主机组名====> /etc/ansible/hosts里设定的nginx,apache,web
主机名====> Web01,Web02
all ====>/etc/ansible/hosts里设定的所有主机
模块名====> command,cron,shell,file等
(1)ping模块
作用:检测指定主机的连通性
格式
# ansible 被管理范围 -m 模块 -a 具体命令
# ansible WebA -m ping (分发单主机WebA的信息)
# ansible nginx -m ping (分发模块(主机组)下的信息)
# ansible all -m ping (分发所有被管理的主机信息)
(2)command模块
在远程主机执行命令,不支持管道符和重定向等复杂命令,可完全被shell模块替代
# ansible Web01 -m command -a 'uptime'
(3)shell模块
可以在被管理主机上运行命令,并支持像管道符重定向这样的复杂命令
# ansible Web01 -m shell -a 'echo 123123 | passwd --stdin yunjisuan'
在所有被管理的主机的/etc/hosts文件里添加Ansible管理服务器的IP地址映射
ansible all -m shell -a 'echo "ansible 192.168.200.183" >> /etc/hosts'
(4)cron模块
cron模块用于定义任务计划。主要包括两种状态(state)
crontab时间周期: (若哪个不写就是默认*号,都不写默认5个*号)
minute:分钟
hour:小时
day:日期
month:月份
weekday:周期
crontab任务:
job:指明运行的命令是什么
crontab任务描述:
name:定时任务描述(定时任务清除的依据)
state状态:
present:表示添加(省略状态时默认使用);
absent:表示移除;
crontab任务的用户身份:
user:指定定时任务以哪个用户身份执行
添加定时任务计划,在所有被管理的主机里每十分钟输出hello字符串,定时任务描述为test cron job
# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
删除描述为test cron job的定时任务
# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=”absent”'
若不成功,用下面的命令去执行
# ansible all -m shell -a 'crontab -r'
给Web01服务器上的普通用户yunjisuan添加一个定时任务
# ansible Web01 -m shell -a 'id yunjisuan'
# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan"'
# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'
# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan" state="absent"'
# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'
(5)copy模块
copy模块用于实现文件复制和批量下发文件。其中使用src来定义本地源文件路径;使用dest定义被管理主机文件路径;使用content则是使用指定信息内容来生成目标文件
复制时,被管理主机下写具体文件名,可用来改名字
Backup=yes 表示备份,覆盖文件的同时,备份一份
将本地的/etc/hosts文件拷贝到所有被管理的主机的/etc/hosts路径下覆盖同名文件,并指定属主和权限,若拷贝的文件与目标文件内容不同,则备份目标文件再覆盖。
# ansible all -m shell -a 'tail -1 /etc/hosts'
# echo "web01 192.168.200.184" >> /etc/hosts
# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root mode=640 backup=yes'
# ansible all -m shell -a 'ls /etc/hosts*'
# ansible all -m shell -a 'tail -1 /etc/hosts'
将本地/tmp/test.sh的脚本复制到远程主机上并远程激活
(6)script模块
可以将本地脚本复制到被管理主机的内存中并运行,不会在被管理主机中留下脚本文件
编写一个脚本,然后通过ansible的script模块远程向被管理主机执行此脚本(直接显示脚本的内容执行结果)
# echo 'echo "1111" >> /tmp/test' >> /tmp/test.sh
# cat /tmp/test.sh
echo "1111" >> /tmp/test
# ansible all -m script -a '/tmp/test.sh'
Scp+ssh与script区别
scp+ssh的脚本在对方用户,远程激活也是在对方用户
Script模块是把本地的脚本不留痕迹的激活在对方的内存里
(7)yum模块
利用yum模块安装软件包,虽然能被shell模块替代
但是用yum模块更显专业一些
软件包名:
name:指定软件包的名字
state状态:
present:安装软件包(默认就是这个)
absent:卸载软件包
(8)service模块
利用service模块管理服务程序,虽然能被shell模块替代
但是用service模块更显专业一些
服务名称:
name:指定服务的名字
state状态:
started:启动服务
stopped:停止服务
restarted:重启服务
reloaded:平滑重载
enabled开机自启动:
true:设置开机自启动
false:设置开启不启动
#启动firewalld并设置开机自启动
[root@ansible ~]# ansible Web01 -m service -a 'name=firewalld state=started enabled=true'
#关闭firewalld并设置开机不启动
[root@ansible ~]# ansible Web01 -m service -a 'name=firewalld state=stopped enabled=false'
(9)user模块
用户管理模块。管理用户账号
指定用户名
name:指定操作的用户的名字
用户描述
comment:指定用户的描述信息
createhome:是否创建家目录
uid:指定用户的uid号
groups:指定用户的附加组(默认创建和用户名相同的组)
password:指定用户的密码
update_password:更新用户的密码
shell指定用户的登陆方式
(1)/bin/bash:能登录系统
(2)/sbin/nologin:不能登录系统
home:指定用户的家目录路径
state状态:
(1)present:创建用户(默认就是这个)
(2)absent:删除用户
remove:当指定state=absent时,确认是否删除用户家目录
(1)true
(2)false
在Web02上创建一个普通用户yunjisuan,并设置用户的密码为123123
[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=123123 shell=/bin/bash home=/home/yunjisuan'
利用ansible的user模块状态用户时要注意在password参数的后边添加密文,否则不能登陆用户,需要通过Python的pip程序安装passlib即可为密码加密
安装Python2的pip工具,并通过pip工具安装Python的加密模块来给密码加密
[root@ansible ~]# yum -y install epel-release
[root@ansible ~]# yum -y install python2-pip
[root@ansible ~]# pip install passlib
#删除之前创建的yunjisuan用户,并删除它的家目录
[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan state=absent remove=true'
继续在Web02上创建yunjisuan用户
ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 shell=/bin/bash' home=/home/yunjisuan'
(10)setup模块
查看被管理主机的facts(facts是Ansible采集被管理主机设备信息的一个功能)。每个被管理主机在接收并运行管理命令之前,都会将自己的相关信息(操作系统版本,IP地址等)发送给控制主机
查看远程主机的facts信息
[root@ansible ~]# ansible Web01 -m setup | head
修改主机名
(1)临时修改主机名
# hostname
(2)永久修改主机名
# vim /etc/hostname
修改服务启动和开机自启动用systemctl修改
(1)开启/关闭服务用start/stop
(2)开启/取消开机自启动 用enable/disable
防火墙firewalld
克隆机必关服务
# systemctl stop firewalld
# systemctl disable firewalld
# systemctl stop NetworkManager
# systemctl disable NetworkManager