批量部署服务器时,若每台服务器有登陆密码,一个个输入就不是自动化部署了,所以我们需要免密码登陆。

一.SSH免密登陆:

下面,我们了解SSH免密登陆。

1.RSA非对称机密算法

他有两个密钥组成:
Public Key:公钥
Private Key:私钥
公钥是公开出去的,私钥是我们自己保管的。他们是成对使用的,如果我们用公钥加密的数据。只有通过对应私钥才能解密成功,反过来,通过私钥加密的数据,只有通过对应公钥才能解密。

2.实现原理

ansible 指定账户和密钥 ansible密钥免密登录_ubuntu


实现如上图,用户需要从服务器获取数据时,服务器先用对应公钥加密一段数据发给用户,用户能用私钥解密的话,表示他们两者可以互通。

尤其要注意,私钥要保管好,不要外泄。

涉及两个命令:
生产密钥对:

ssh-keygen

将公钥放到服务器上:

ssh-copy-id
3.具体实现代码

下面的代码,要远程连接服务器,还需要输入密码:

ssh root@192.168.88.180

创建密钥对:

ssh-keygen

弹出保存位置确认,点击回车继续,之后也全部回车。

此时生成两个文件:

ansible 指定账户和密钥 ansible密钥免密登录_python_02


查看目录:

ansible 指定账户和密钥 ansible密钥免密登录_python_03

发送公钥到服务器:

ssh-copy-id root@192.168.88.180

需要输入服务器密码。
此时,再用ssh root@192.168.88.180就不需要密码即可登陆了。

二.批量操作Ansible

了解ssh原理后,我们来了解Ansible这个远程运维工具。
Ansible是一个python开发的ssh运维工具,使用它我们可以很方便的同时在多台服务器上去执行维护任务,是一个非常简单的运维工具。
安装(apt install -y ansible为python2的版本,之后要停止维护了):

sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

查看版本及对应文件ansible --version

ansible 指定账户和密钥 ansible密钥免密登录_ansible 指定账户和密钥_04

cd /etc/ansible
ls

编辑hosts vi hosts

[web]
172.31.88.131
172.31.88.133
[db]
#172.31.88.132

每一个 [ ] 表示一个分组。

查看服务器时间和负载情况:

uptime

查看远程服务器的情况:

ansible all -m raw -a 'uptime'

如果没有做ssh免密,此时会失败,做了之后可以直接得到远程服务器的时间和负载情况。

说明:ansible [1] -m [2] -a [3]
1:选择配置文件的IP:all表示全部ip,还可以输入一个组的,例如上述的web.
2:选择的模块
3:所需要的参数

常用模块:

ping模块:测试连接可通性,没有参数。通的话返回pong。没有安装python则会失败。

ansible all -m ping

一般部署之前会用ping检查python环境是否装好,没有装好的话,远程安装:

ansible all -m raw -a 'apt update && apt install -y python'

script模块:将本地脚本复制到远程主机,并执行。

ansible all -m script -a "./hello.sh"

该模块在初始化部署服务器的时候常用,比如安装python,安装uwsgi等,用一个文件保存所有语句,放到远程服务器执行。

command模块:用于在远程执行命令。和raw很像,不同的是command需要有python的环境

ansible all -m command -a "uptime"

该模块比raw更推荐使用,它也是默认的模块,上面的代码可以省略为ansible all -a "uptime"

copy模块:用于复制文件到远程服务器指定位置

ansible all -m copy -a "src=./test.sh dest=/temp"

表示把./test.sh文件拷贝到远程服务器/temp目录下

file模块:设定文件属性和创建文件的符号链接

ansible all -m file -a "path=/temp/test.sh mode=0755"

表示把远程服务器上路径为/temp/test.sh的文件权限设置为可执行(默认创建的文件没有可执行权限)。
shell模块:执行远程机器上的文件

ansible all -m shell -a "/temp/test.sh"

表示执行远程服务器上路径为/temp/test.sh的文件。

fetch模块:将远程服务器上的文件下载到本服务器。

ansible all -m fetch -a "src=/temp/test.sh dest=/download"

表示将远程服务器上路径为/temp/test.sh的文件下载到本服务器/download目录下,每个远程服务器以ip地址为文件夹,进入目录后,temp下有一个test.sh文件。
常用模块: