作为自动化运维领域的标杆工具,Ansible 凭借独特设计理念和强大功能,在众多工具中脱颖而出。以下是其核心优点
1、控制节点资源占用极低,单台服务器可轻松管理上万台设备,适合大规模集群
2、通过标准 SSH 协议直接管理目标节点,无需安装任何代理程序,节省部署和维护成本。
3、用人类可读的 YAML 语言编写任务流程,清晰定义系统期望状态,代码本身即成为最佳文档。
4、批量部署服务时间从小时级缩短至分钟级
内网环境下安装ansible
[root@loaclhost app]$ yum install --downloadonly --downladdir=/app ansible
[root@loaclhost /]# useradd appuser
[root@loaclhost /]# echo 'appuser:appuser@devA'|chpasswd
[root@loaclhost /]# chown appuser. /app -R
[root@loaclhost /]# su - appuser
[appuser@loaclhost ~]$ ls
[appuser@loaclhost ~]$ cd /app/
[appuser@loaclhost app]$ ls
ansible-2.9.27-1.el7.noarch.rpm python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm python-ply-3.4-11.el7.noarch.rpm
libyaml-0.1.4-11.el7_0.x86_64.rpm python-cffi-1.6.0-5.el7.x86_64.rpm python-pycparser-2.14-1.el7.noarch.rpm
python2-cryptography-1.7.2-2.el7.x86_64.rpm python-enum34-1.0.4-1.el7.noarch.rpm python-setuptools-0.9.8-7.el7.noarch.rpm
python2-httplib2-0.18.1-3.el7.noarch.rpm python-idna-2.4-1.el7.noarch.rpm python-six-1.9.0-2.el7.noarch.rpm
python2-jmespath-0.9.4-2.el7.noarch.rpm python-ipaddress-1.0.16-2.el7.noarch.rpm PyYAML-3.10-11.el7.x86_64.rpm
python2-pyasn1-0.1.9-7.el7.noarch.rpm python-jinja2-2.7.2-4.el7.noarch.rpm sshpass-1.06-2.el7.x86_64.rpm
python-babel-0.9.6-8.el7.noarch.rpm python-markupsafe-0.11-10.el7.x86_64.rpm
python-backports-1.0-8.el7.x86_64.rpm python-paramiko-2.1.1-9.el7.noarch.rpm
[appuser@loaclhost app]$ yum install *.rpm
You need to be root to perform this command.
[appuser@loaclhost app]$ exit
[root@loaclhost /]# vim /etc/sudoers
appuser ALL=(ALL) NOPASSWD: /usr/bin/yum
[root@loaclhost /]# su - appuser
[appuser@loaclhost app]$ sudo yum install *.rpm
Examining ansible-2.9.27-1.el7.noarch.rpm: ansible-2.9.27-1.el7.noarch
卸载安装的rpm包
[appuser@loaclhost app]$ for i in `ls -l /app | awk '{print $9}' |sed 's/\.rpm$//'`; do sudo yum -y remove $i; done
2.ansible 互信脚本
[appuser@loaclhost ansible]$ cat ssh.sh
#!/bin/bash
# 检查必要的文件是否存在
if [ ! -f "ip.txt" ]; then
echo "ip.txt 文件不存在,请检查。"
exit 1
fi
if [ ! -f "passwd.txt" ]; then
echo "passwd.txt 文件不存在,请检查。"
exit 1
fi
# 读取 Base64 编码的密码并解码
password=$(cat passwd.txt | base64 -d)
# 创建结果文件
> ok.txt
> error.txt
# 检查 sshpass 是否安装
if ! command -v sshpass &> /dev/null; then
echo "sshpass 未安装,请先安装 sshpass。"
exit 1
fi
# 检查本地 SSH 密钥文件是否存在
if [ ! -f "/home/appuser/.ssh/id_rsa.pub" ]; then
echo "/home/appuser/.ssh/id_rsa.pub 文件不存在,请检查。"
exit 1
fi
# 循环读取 IP 列表
while IFS= read -r ip; do
# 执行 ssh-copy-id 命令添加互信
sshpass -p "$password" ssh-copy-id -i /home/appuser/.ssh/id_rsa.pub -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@"$ip" > /dev/null 2>&1
# 获取命令执行结果
exit_status=$?
if [ $exit_status -eq 0 ]; then
echo "$ip" >> ok.txt
else
echo "$ip" >> error.txt
fi
done < ip.txt
echo "互信添加完成,成功的 IP 记录在 ok.txt 中,失败的 IP 记录在 error.txt 中。"
#互信IP为ip.txt root密码被base64加密在passwd.txt
[appuser@loaclhost ansible]$ bash ssh.sh
互信添加完成,成功的 IP 记录在 ok.txt 中,失败的 IP 记录在 error.txt 中。
[appuser@loaclhost ansible]$ ls
error.txt ip.txt ok.txt passwd.txt ssh.sh
[appuser@loaclhost ansible]$ du -sh *
0 error.txt
4.0K ip.txt
4.0K ok.txt
4.0K passwd.txt
4.0K ssh.sh
[appuser@loaclhost ansible]$ cat ok.txt
10.0.0.17
10.0.0.27
10.0.0.37
3.ansible的使用
[appuser@loaclhost ansible]$ ansible all -i 10.0.0.17, -u root -m ping
10.0.0.17 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[appuser@loaclhost ansible]$ ansible all -i 10.0.0.17, -m ping #因为互信和root用户添加,appuser用户默认和appuser用户链接 ,所以有问题
10.0.0.17 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}