Ansible 批量管理多台机器

Posted xiaodai12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 批量管理多台机器相关的知识,希望对你有一定的参考价值。

Ansible是一个轻量级的工具,基于python语言实现,通过python中的paramiko来连接并管理机器, 功能强大(YAML,PlayBook,模块化功能),不需要安装客户端,

通过ssh连接,推送命令到客户端,只有服务器端,就可以批量管理。

 

 

#安装 ,仅供Centos6系列系统

软件包链接:https://pan.baidu.com/s/1v8B6sCzm2BO8XO9ufgMu_w 密码:ifnb

下载后通过rpm安装即可,如有依赖包问题,yum那个依赖包

技术分享图片

 

安装完毕后通过ansible --version 检查是否安装成功

技术分享图片

 

#下面介绍我在工作中的常用用法,一下均在实际环境中实现,由于实际环境,需要管理的机器很多,所以,通常情况下,机器的端口,用户名,密码等都是一样的。

首先,建立一个文件,文件中存储你想管理的主机,主机端口,主机用户名,密码等等,ansible依赖这个文件,进行批量管理动作,我这边的文件如下。

[[email protected] shell]$ cat yatai_all

10.124.193.76 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.165.76 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc 
10.124.193.81 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc 
10.124.165.75 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.194.185 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.165.77 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.193.77 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.163.170 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.194.3 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.165.74 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.194.187 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.165.78 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.165.73 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.193.82 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.193.78 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.32 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.194.2 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.21 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.31 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.18 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.10 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.16 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.126 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc
10.124.198.13 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=abc ansible_sudo_pass=abc 

#上方的配置横向解释依次是ip,port,user,passwd,sudo_passwd 相信看得懂

#我这有个简单的脚本,根据你的机器来生成端口,密码等信息,并创建这个主机信息文件,如果你懒得写,你可以直接复制过去,你只需要在脚本同级目录新建一个命名为ip的文件,里面每行1个ip地址即可,调整下脚本内容,指定连接的用户,密码等

技术分享图片
#!/bin/bash
port=ansible_ssh_port=22
user=ansible_ssh_user=admin‘‘
passwd=ansible_ssh_pass=abc‘‘
sudo_passwd=ansible_sudo_pass=abcnew_hosts_filename=new_ip
function  run (){
for i in `cat ip`;
        do
        echo "$i $port $user $passwd $sudo_passwd " >> $new_hosts_filename
done

}
cat $new_hosts_filename &> /dev/null
if [ $? != "0" ] ; then
    run
else
    echo "file $new_hosts_filename already exists please check"
fi
View Code

 

 

ansible提供了默认的机器信息文件,但是里面是空的,只标注了一些配置介绍,有兴趣你也可以去看看。

/etc/ansible/hosts

 

 

下面开始执行命令,从简单开始。

#此命令是使用ping模块,对-i yatai_all文件里面all,所有机器,执行ping测试。

-i 指定hosts文件,就是上面创建的主机ip与密码对应的文件,直接执行,不用输入连接机器的密码,因为我在文件中已经定义过了,高效率就是这么来的。

ansible -i yatai_all  all -m ping

技术分享图片

 

#有人第一次执行ansible命令的时候会报错,就算你在你的hosts文件中设置了主机ip,密码,端口等,这些都正确,也会报错,可能是因为第一次连接linux服务器是出现的交互式hostkey_check搞的鬼,如下,ansible默认可不会帮你输入yes or no ,你可以通过下方方式来解决:

永久跳过次检查,在/etc/ansible/ansiblt.cfg文件中配置如下参数。
host_key_checking = False

技术分享图片

 

通过ansible在主机中批量执行命令

ansible -i yatai_all  all -m shell -a ‘echo $USER‘

#在yatai_all文件中指定的所有主机上执行命令“echo $USER”

使用shell模块,-a后面跟上被控机需要执行的命令

技术分享图片

 

 

#在工作环境中,root用户权限一般是不能直接使用的,避免因权限太高导致的不可挽回的后果,所以我们应该尽量使用其他用户,那么,如果真有需要在多台机器上使用root用户执行的命令时怎么办呢(首先,你需要用root用户,在 /etc/sudoers文件中添加配置,允许用户进行提权,我使用的是admin用户,那么我用root用户在文件中放入admin ALL=(ALL:ALL) ALL )

首先,通过ansible使用root用户批量增加其他用户的sudo权限。#此时你的主机信息文件里面,对应的用户要改为root,以及root的密码。如下,或者使用上面脚本重新生成主机配置

(10.124.198.16 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=abc ansible_sudo_pass=abc )

ansible -i yatai_all  all -m shell -a ‘echo “admin  ALL=(ALL)   ALL” ‘  

 

使用sudo提权执行命令

#yatai_all文件中给每台机器都定义了一个选项:ansible_sudo_pass=abc,作用就是定义sudo时输入的密码(如果不想定义ansible_sudo_pass选项,也可以通过交互式页面手动输入密码,执行时附带参数【-k】即可 )

提权操作很简单,只需要在你的用户已经有提权的权限时,加一个-s参数即可,让我们看看结果

ansible -i yatai_all  all -m shell -a ‘echo $USER‘  -s

技术分享图片

加和不加-s的图中结果明显不同,-s选项加上后,使用的是root用户执行的命令。

 

ansible copy文件,操作也很简单,命令如下。

以下命令,是将本机的/etc/file1文件,copy到所有主机的/etc/下命名file2,copy时,还可以设置文件权限等(需将参数加到命令引号内)。

ansible -i yatai_all  all -m copy -a ‘src=/etc/file1 dest=/etc/file2‘

命令中的src=/etc/file1 如果替换为 content=‘abcabc‘, 代表将content中的内容放到对端主机的/etc/file2文件中,切,shell -a ‘echo  "abcabc" > /etc/file2   ‘ 也可以实现

 force 参数,如果对端机器上已经有/etc/file2了,是否覆盖,设置值force={no,yes},默认yes

 mode 参数,当你希望文件在对端机器的权限是777时,你需要设置mode=0777,当你需要给属组增加执行权限时,mode=g+x

 

目前我接触到的常用操作就是这些,唯一变化较大的就是命令方便的变化,如有遇到我觉得很好用的功能会持续更新,yaml以后再讲,
























以上是关于Ansible 批量管理多台机器的主要内容,如果未能解决你的问题,请参考以下文章

自动化批量管理工具pssh - 运维小结

Linux多台主机批量执行命令

自动化运维工具--ansible

运维自动化之 - ansible 批量主机管理

Ansible(二)如何在多台主机上批量执行任务

ansible 用户批量创建与管理