Ansible概述、安装、命令基础、批量部署SSH密钥登录
ansible概述
Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基于Python研发,糅合了很多老运维工具的优点。实现了批量操作系统配置,批量程序的部署,批量运行命令等功能。
为什么要选择ansible?
• ansible优点
是仅需要ssh和Python即可使用
无客户端
• ansible功能强大,模块丰富
• 上手容易门槛低
• 基于 python 开发,做二次开发更容易
• 使用公司比较多,社区活跃
ansible安装
环境准备:
virsh制作6台虚拟机(2G内存、2CPU、20G硬盘、root密码为123456)
- 1台管理机ansible(192.168.4.10)
- 另外5台虚拟机:
- web1 (192.168.4.11)
- web2 (192.168.4.12)
- db3 (192.168.4.13)
- db4 (192.168.4.14)
- cache5 (192.168.4.15)
[root@ansible ~]# cat /etc/yum.repos.d/local.repo //自定义ansible的安装yum源
[public]
name=public
baseurl=ftp://192.168.4.254/public //真实机ftp有ansible的rpm包及依赖包
enabled=1
gpgcheck=0
[centos7]
name=centos7
baseurl=ftp://192.168.4.254/centos7
enabled=1
gpgcheck=0
[root@ansible ~]# vim /etc/hosts //设置6台机器IP与主机名对应关系
[root@ansible ~]# yum -y install ansible //使用yum安装ansible(安装方式有源码编译、yum、pip等)
[root@ansible ~]# ansible --version //查看ansible版本
主机定义与分组
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# vim ansible.cfg //修改ansible配置文件
inventory = /etc/ansible/hosts //取消注释
[root@ansible ansible]# vim hosts //设置需要管理的主机的分组
[web]
web1
web2
[db]
db3
db4
[cache]
cache5
[root@ansible ansible]# ansible web,db --list-hosts //列出分组中的主机
hosts (4):
web1
web2
db3
db4
[root@ansible ansible]# ansible all --list-hosts //列出所有主机
hosts (5):
web1
web2
cache5
db3
db4
ssh交互式密码登录远程主机
[root@ansible ansible]# vim ansible.cfg
:61
host_key_checking = False //取消注释
[root@ansible ansible]# ansible web -m ping -k //交互式登录
SSH password: //输入密码123456
web2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
web1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ssh非交互式登录远程主机
(先修改了db3、db4的root密码分别为a、b)
[root@ansible ansible]# vim hosts
[db]
db3 ansible_ssh_pass="a"
db4 ansible_ssh_pass="b"
[root@ansible ansible]# ansible db -m ping //非交互式登录
db4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
db3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
注:ansible建立的是长连接。即客户端和服务端只用一个Socket对象,长期保持Socket的连接。socket文件在/root/.ansible/cp/
[root@ansible ansible]# ls /root/.ansible/cp/
6b13a69203
设置参数、子组
[root@ansible ansible]# vim hosts
[web]
web[1:2]
[web:vars] //参数
ansible_ssh_pass="123456"
[db]
db3
db4
[app:children] //子组
web
db
[cache]
cache5
ansible命令基础
命令格式:
ansible 主机或分组 -m 模块名 -a 模块的参数
-M 指定模块路径
-m 使用模块,默认 command 模块
-a or --args 模块参数
-i inventory 文件路径,或可执行脚本
-k 使用交互式登录密码
-e 定义变量
-v 详细信息,-vvvv 开启 debug 模式
例如:
[root@ansible ~]# ansible web -m command -a 'uptime'
web2 | SUCCESS | rc=0 >>
09:00:52 up 12 min, 1 user, load average: 0.14, 0.15, 0.18
web1 | SUCCESS | rc=0 >>
09:00:52 up 12 min, 1 user, load average: 0.00, 0.13, 0.19
批量部署SSH密钥登录
原因:
• 交互输入密码较麻烦
• 密码写入配置文件安全性很差
• 不同远程主机如果密码不同,配置文件将很复杂
步骤:
给所有主机部署公钥:
[root@ansible ~]# vim /etc/ansible/hosts //先删除之前实验设置的密码
[root@ansible ~]# cd /root/.ssh/
[root@ansible .ssh]# ssh-keygen -t rsa -b 2048 -N ' ' //生成一对密钥。-t type 指定密钥算法,-b bits 指定密钥长度,对于RSA密钥,最小要求768位,默认是2048位。 -N new_passphrase 提供一个新的密语。
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:frfCsFFWF9bjKOrFpyGncn/8NBJTzbwqr1xEPb6BKPg root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| oo |
| ..o+o|
| . oo+=|
| . o.o.+.o|
| .S+o..= + |
| .+o.=..+o|
| oE*.*+ +|
| ..=+o++o.|
| o .=+... |
+----[SHA256]-----+
[root@ansible .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@ansible .ssh]# ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(</root/.ssh/id_rsa.pub)'" -k //批量给所有主机部署SSH密钥
SSH password: //输入root密码(所有主机密码一样)
......
若报错
"msg": "Using a SSH password instead of a key is
not possible because Host Key checking is
enabled and sshpass does not support this.
Please add this host's fingerprint to your
known_hosts file to manage this host."
解决方法:
修改ansible.cfg
host_key_checking = False