ansible

Ansible 基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

 

ansible安装

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

 下载阿里yum源

然后,清除yum缓存,并生成新的yum缓存元数据。

yum  clean all

yum  makecache  fast

然后,用yum下载ansible软件

yum  -y  install ansible  --downloadonly --downloaddir=/ansible7

ls  /ansible7

createrepo  /ansible7   (必做)生成yum的repodata仓库数据库(metadata元数据)文件夹和文件

创建ansible7的yum配置文件

vim  /etc/yum.repo.d/ansible7.repo

[ansible7]

name=asible 7

baseurl=file:///ansible7

enable=1

gpgcheck=0

删除网络yum源配置文件

cd /etc/yum.repo.d

rm -rfv  C*.repo epel.repo

yum  clean  all

yum  repolist

yum  search  ansible

yum  -y  install  ansible

 

 http://mirrors.aliyun.com/repo/epel-7.repo

 

for  i  in  {1..5}

do

(ssh  [email protected].$i  yum -y install  vsftpd ftp lftp)&  多线程

done

 

安装ansible软件

先下载ansible包

yum  -y  install  ansible

rpm  -qc   ansible

vim   /etc/ansible/hosts 在最后添加如下内容

[qf]

192.168.11.11

192.168.11.12

 

生成秘钥对,并上传公钥给要管理的主机

ssh-keygen

ssh-copy-id  [email protected]

ssh-copy-id  [email protected]

 

测试ansible的使用

语法:ansible  主机名或ip  -m  模块名   -a  模块的选项和参数

ansible选项:

-m  指定模块,常见的模块有ping ,shell,command,cron,user,group,yum等

-a  指定模块的选项参数,参数中state状态有present(现在就有,用于创建)、absent(缺席的,用于删除)两种

 

eg:ansible  192.168.11.12  -m  shell   -a  ip  a

 

用ansible给qf主机组中的所有主机新增jack用户。然后删除jack用户。

ansible  qf  -m  user  -a   name=jack  shell=/sbin/nologin  state=present’”

ansible  qf  -m  shell  -a   id  jack;tail  -5  /etc/passwd

新增jack用户

ansible  qf  -m  user  -a   name=jack  remove=yes  state=absent’”

ansible  qf  -m  shell  -a   id  jack;tail  -5  /etc/passwd

 

 

setup:查看远程主机的基本信息  例:ansible  qf  -m  setup

ping:    ansible  qf  -m  ping 测试远程主机的运行状态

file:  ansible  qf  -m  file   -a  path=/aa/bb  state=directory’”设置文件属性

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的链接,然后创造新的软链接,有2个选项:yes|no

 

group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效,有两个选项:yes|no
src:被链接的源文件路径,只应用于state=link的情况
state:
       directory:如果目录不存在,就创建目录
       file:即使文件不存在,也不会被创建
       link:创建软链接
       hard:创建硬链接
       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
       absent:删除文件

ansible,expect_第1张图片

ansible,expect_第2张图片

ansible,expect_第3张图片

ansible,expect_第4张图片

ansible,expect_第5张图片

ansible,expect_第6张图片

ansible,expect_第7张图片

expect

shell脚本需要交互式的地方,有些命令需要手动去交互如passwd scp

对自动部署免去用户交互的痛苦,expect能很好的解决这类问题

expect 把交互式操作变成非交互式

expect的核心spawn  expect  send  set


spawn 调用要执行的命令

 expect 等待命令提示信息的出现,也就是捕捉用户输入的提示
send  发送需要交互的值,代替了用户手动输入的内容
set  设置变量值    
set timeout 300  300秒超时   如果300秒没有expect内容出现就退出
设置expect永不超时
 set timeout -1
interact   执行完成后保持交互状态。如果没有这一句登陆完成后会退出    
expect eof   这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if ...then ...fi

expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

expect使用实例:

1.首先确认expect的包是否安装

#rpm  -qa | grep  expect

#yum  install  -y  expect

2.安装完成后查看expect的路径,可以用

which  expect

/usr/bin/expect


例:制作秘钥并将公钥发给ssh服务器192.168.11.12,其密码是0

vim a.txt

ansible,expect_第8张图片

运行脚本

chmod  -v  +x   a.txt

. a.txt

查看公钥和私钥

image.png

这样就成功了。

如需给多台服务器发送公钥只需写一个for循环就够了。