前言
在部署ansible过程中,刚开始我把被控制端的密码明文的写在了/etc/ansible/hosts中考虑到安全问题,因为ansible不需要安装客户端和服务端,原因是基于ssh连接。正因此可以创建ssh互信控制端和被控制端。
一、文件iplist
该文件是记录被控制端的ip 要和/etc/ansible/hosts
定义的ip一致。否则会有的机器不会连通。
实验过程中:
cat iplist
192.168.2.180
192.168.2.235
192.168.2.141
192.168.1.130
192.168.1.131
192.168.1.132
192.168.1.133
192.168.1.134
有这么几个服务器。。
cat /etc/ansible/hosts
[webhosts]
192.168.2.235 ansible_ssh_user=root
#ansible_ssh_pass=nbs2010
192.168.2.180 ansible_ssh_user=root
#ansible_ssh_pass=nbs2010
192.168.2.141 ansible_ssh_user=root
#ansible_ssh_pass=nbs2010
192.168.1.130 ansible_ssh_user=root
192.168.1.131 ansible_ssh_user=root
192.168.1.132 ansible_ssh_user=root
192.168.1.133 ansible_ssh_user=root
192.168.1.134 ansible_ssh_user=root
二、文件test.exp
该文件是用来和第三个文件相互给iplist中的创建互信。因为在创建过程中要产生互动输入密码通过expect语言来完成。
在使用expect之前需要安装
yum install tcl
yum install tk
yum install expect
test.exp
#!/usr/bin/expect -f
set host [lindex $argv 0]
定义一个参数和变量host
set password "nbs2010"
定义互动时输入的密码
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub " root@$host"
此处是ssh建立互信时的登陆口令$host会是在test.sh 里作为参数传进来。
expect { "yes/no" {send "yes\r";exp_continue} "*password*" {send "$password\r"} } expect eof //此处是当建立完互信后立刻退出被控制端
三、test.sh
该文件是结合iplist和test.exp来建立互信
#!/bin/bash
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ‘‘
//创建互信时,创建认证文件。可以man ssh-keygen 各个参数的含义。
n=0 for ip in `cat iplist` do #逐行取出每个ip的数值 n=$(($n+1)) expect test.exp $ip > /dev/null 2>&1 done
//此处是shell脚本的核心。通过for循环来逐行读取ip列表。作为一个参数传到test.exp的$argv 0
把执行结果都输出到/dev/null 文件中去。。
演示过程如下:
直接执行./test.sh
[root@server ~]# ./test.sh
Generating public/private rsa key pair.
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:
3d:b1:d5:51:12:be:f1:43:91:08:18:1b:5a:93:10:20 root@server
The key‘s randomart image is:
+--[ RSA 2048]----+
| E ..oo=+.. =+o|
| . oo+ + +.|
| . .. . +. |
| . + .+ |
| S + ...|
| . .|
| |
| |
| |
+-----------------+
此时在/root/.ssh/下出现:
[root@server ~]# ll .ssh/
总用量 12
-rw-------. 1 root root 1671 10月 11 23:03 id_rsa
-rw-r--r--. 1 root root 393 10月 11 23:03 id_rsa.pub
-rw-r--r--. 1 root root 3160 10月 11 23:03 known_hosts
说明现在互信已经建立。
可以通过ansible webhost -m ping 会出现:
[root@server ~]# ansible webhosts -m ping
192.168.2.141 | success >> {
"changed": false,
"ping": "pong"
}
192.168.1.130 | success >> {
"changed": false,
"ping": "pong"
}
192.168.1.131 | success >> {
"changed": false,
"ping": "pong"
}
192.168.2.235 | success >> {
"changed": false,
"ping": "pong"
}
192.168.2.180 | success >> {
"changed": false,
"ping": "pong"
}
192.168.1.133 | success >> {
"changed": false,
"ping": "pong"
}
192.168.1.132 | success >> {
"changed": false,
"ping": "pong"
}
192.168.1.134 | success >> {
"changed": false,
"ping": "pong"
}
此时说明这八个ip的被控制端和控制端互信已经建立。。
接下来你可以批量的使用ansible的强大的功能了。。不需要在/etc/ansible/hosts中写密码。。。
本文出自 “黎明前的黑暗” 博客,谢绝转载!
原文地址:http://9907516.blog.51cto.com/9897516/1701969