Linux系统——Ansible批量管理工具

 

 

 

 

批量管理工具:

(1)ansible 操作简单(适用于500台以下服务器)

(2)saltstack 比较复杂(一般适用于1000-4w台服务器)

(3)puppet超级复杂

 

systemctl(统一管理命令)

chkconfigservice等的功能都被systemctl替代

# system stop iptables.service7.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需要安装客户端),基于Pythonansible利用ssh通道(操作要进行免密钥)

 

 

生产环境中ansible管理服务器是直接连接超级用户的,需要做很多安全处理

(1)修改ssh登录

# vim /etc/ssh/sshd_config

17Port 22端口改为1万以上

38PermitRootLogin yes改为no 设为禁止超级用户远程登录(最后改动,避免掉线)

43PubkeyAuthentication yes 默认开启,否则密钥验证就会失效

47AuthorizedKeysFile .ssh/authorized_keys 公钥文件的位置

65PasswordAuthentication yes 是否开启密码验验证登陆(最后设置)

79GSSAPIAuthentication yes 是否关GASSPI认证

115UseDNS 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行的PasswordAuthenticationyes改为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 的密码:

上一次登录:日 99 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

 

7Ansible服务器简单的综合安全管理策略

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里设定的nginxapacheweb

主机名====> Web01,Web02

all ====>/etc/ansible/hosts里设定的所有主机

模块名====> commandcronshellfile

 

(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'

 

3shell模块

可以在被管理主机上运行命令,并支持像管道符重定向这样的复杂命令

# 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'

4cron模块

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'

5copy模块

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模块

可以将本地脚本复制到被管理主机的内存中并运行,不会在被管理主机中留下脚本文件

编写一个脚本,然后通过ansiblescript模块远程向被管理主机执行此脚本(直接显示脚本的内容执行结果)

# 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+sshscript区别

scp+ssh的脚本在对方用户,远程激活也是在对方用户

 

Script模块是把本地的脚本不留痕迹的激活在对方的内存里

 

(7)yum模块

利用yum模块安装软件包,虽然能被shell模块替代
但是用yum模块更显专业一些

软件包名:

name:指定软件包的名字

state状态:

present:安装软件包(默认就是这个)

absent:卸载软件包

8service模块

利用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时,确认是否删除用户家目录

1true

2false

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'

 

利用ansibleuser模块状态用户时要注意在password参数的后边添加密文,否则不能登陆用户,需要通过Pythonpip程序安装passlib即可为密码加密

 

安装Python2pip工具,并通过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'

 

10setup模块

查看被管理主机的factsfactsAnsible采集被管理主机设备信息的一个功能)。每个被管理主机在接收并运行管理命令之前,都会将自己的相关信息(操作系统版本,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

 

posted @ 2018-11-23 21:23  daisy118  阅读(2025)  评论(0编辑  收藏  举报