1、常用的自动化运维工具对比
1、Puppet
基于ruby语言开发,CS架构,扩展性强,比如集群,客户端和服务器通信用ssl协议
2、Slatstack
基于python开发,也是采用cs架构,比puppet更轻量级,脚本配置更为简单
3、Ansible
基于python开发,支持分布式,无需客户端,更轻量级,配置语言采用yaml,更简单,但是比较新
选择ansible的理由
相对于puppet和saltstack,ansible不需要客户端,更轻量级
ansible不需要提供启动服务,仅仅只是一个工具,实现分布式扩展
更强的远程命令执行操作
不输于pupprt和satstack的其他功能
2、ansible的工具架构
连接插件:connection plugins 通过连接插件管理客户端
核心模块:core midules,依赖于具体的模块去做具体的事情
自定义模块:custom modules,当核心模块满足不了的时候,需要自定义模块
配置文件:playbooks用于定义配置文件,定义一大堆任务下发到客户端去自动执行
主机清单:Host inventory,定义管理的主机就在这个host inventory
3、ansible工作原理
三种远程方式:
Local(无聊方式)
Ssh(主流的方法)
0mq(被管理端需要安装客户端)
利用modules在playbooks定义一堆命令,然后应用到hosts inventory主机清单中,通过ssh的方式对
客户端下发命令管理
4、安装
yum -y install epel* --------先装代理
yum -y install ansible
5、ansible目录结构介绍
/etc/ansible 配置文件目录
/etc/ansible/ansible.cfg主配置文件
/etc/ansible/hosts 定义的主机清单
/usr/bin/ansible
-u 指定用户,不指定默认是root
-m 指定模块 如果不指定模块默认就是command模块
-a 指定命令
-k 用来提示输入远程主机密码
[test] ------对不同的主机进行分组
192.168.16.141 -----指定这个主机
192.168.16.139
Web1 ---------------可以填域名、必须可解析
[nginx] 对不同的主机进行分组
案例一:定义两个组,对组内成员进行命令操作
[test]
192.168.16.141
192.168.16.139
Web1
[nginx]
改配置文件,注释去掉
/etc/ansible/ansible.cfg
host_key_checking = False
[root@localhost ansible]# ansible -i /etc/ansible/hosts test -u root -m command -a 'ls /home' -k
SSH password:
192.168.16.141 | SUCCESS | rc=0 >>
han
192.168.16.139 | SUCCESS | rc=0 >>
admin
han
案例二、
[root@localhost ansible]# ansible -i /etc/ansible/hosts test -u root -m command -a 'ls /home' -k
默认情况下hosts root 模块也是command所以可以省略写为
[root@localhost ~]# ansible test -a 'ls /home' -k
SSH password:
192.168.16.139 | SUCCESS | rc=0 >>
admin
han
192.168.16.141 | SUCCESS | rc=0 >>
han
[root@localhost ~]#
案例三:管理很多连续的主机
[test]
192.168.16.141
192.168.16.139
192.168.16.[50:100]-----从16.50到100
Web1
案例三:做好互信任
那么多主机就不用再加key参数指定密码了
互信步骤:
1、ssh 文件开启rsa认证
以root用户登录,更改SSH的配置文件 /etc/ssh/sshd_config
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径
重启SSH服务: service sshd restart
2、以无密码访问的用户执行如下命令建立公钥和私钥,提示输入时直接回车。
[root@localhost asg]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:
72:bb:4f:1d:ef:57:d0:7f:5a:40:f2:63:cc:77:6c:86 [email protected]
默认公钥文件/root/.ssh/id_rsa.pub
默认私钥文件/root/.ssh/id_rsa
.ssh文件夹如果不存在,需要手动创建,并将权限改为700
3、如果要和其他机器建立互信、让其他机器无密码访问本机,需要将其他机器的公钥拷贝到本机,并追加到文件/root/.ssh/authorized_keys,然后修改该文件权限为600.
scp 192.168.50.147:/root/.ssh/id_rsa.pub /root/.ssh/147.pub
cat /root/.ssh/147.pub >>/root/.ssh/authorized_keys
(147以root用户建立的公钥和私钥,本机就可以以root用户无密码ssh访问147)
4、SSH无密码验证的原理:
Master作为客户端,要实现无密码公钥认证,连接到服务器Salve上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Salve上。当Master通过SSH链接到Salve上时,Salve会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Salve,Salve确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,期间不需要手工输入密码,重要的过程是将Master上产生的公钥复制到Salve上。
案例四:ping所有模块所有主机
[root@localhost ~]# ansible all -m ping -k
SSH password:
192.168.16.139 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.16.141 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@localhost ~]#
案例五:非标准端口,文件里指定用户
案例六:嵌套组mfs:children组中嵌套很多组
[mfs:children]
mfs_nginx
mfs_apache
mfs_tomcat
[mfs_nginx]
192.168.16.139
[mfs_apache]
192.168.16.141
[mfs_tomcat]
[root@localhost ~]# ansible mfs -m ping
192.168.16.139 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.16.141 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@localhost ~]# ansible mfs_apache -m ping
192.168.16.141 | SUCCESS => {
"changed": false,
"ping": "pong"
}