一、使用讲解
1.1 运行原理
工作原理:
1、用户登录管理机器:通过ansible剧本或者单行命令针对业务机器组或者单个机器部署任务
2、管理机器读取用户的部署任务:根据自己hosts文件中定义的业务机器组查找对应的机器地址(ip或者域名)
3、管理机下发任务:管理机通过ssh免密连接业务机器,下发任务给业务机器
4、业务机器执行任务
5、业务机器将执行结果发送给ansible管理机器
反馈字体颜色
绿色 未发生变化
黄色 更改生效
红色 执行错误
1.2 部署前准备
约定事项:
- 所有服务器全部采用静态ip
主机名称 | IP地址 |
---|---|
manage01 | 192.168.66.200/24 |
node1 | 192.168.66.201/24 |
node2 | 192.168.66.202/24 |
node3 | 192.168.66.203/24 |
-
主机名及主机名互相绑定
[root@manage01 ~]# vim /etc/hosts
127.0.0.1 localhost
::1 localhost
192.168.66.200 manage01
192.168.66.201 node1
192.168.66.202 node2
192.168.66.203 node3其他机器同理
-
关闭防火墙, selinux
[root@manage01 ~]# systemctl disable firewalld
[root@manage01 ~]# sed -i -r '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config
[root@manage01 ~]# reboot其他机器同理
-
采用时间服务器,时间同步
1、修改配置文件,配置时间服务器为阿里云的时间服务器
[root@manage01 ~]# egrep "^server" /etc/chrony.conf
server ntp1.aliyun.com
server ntp2.aliyun.com
server ntp3.aliyun.com
server ntp4.aliyun.com2、重启服务chronyd
[root@manage01 ~]# systemctl restart chronyd.service3、查看源信息
#chronyc chrony的命令行客户端
[root@manage01 ~]# chronyc sources -v
210 Number of sources = 2.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | |
MS Name/IP address Stratum Poll Reach LastRx Last sample^? 116.62.13.223 2 6 1 7 -1647us[-1647us] +/- 27ms
^? 203.107.6.88 2 6 1 9 -8206us[-8206us] +/- 30ms -
确认和配置yum源(需要epel源)
yum -y install epel-*
1.3 安装ansible
-- 下载
yum -y install ansible
-- 检查下载版本
ansible --version
-- 记的检查一下Linux中有不有python
python -V
无网络状态下载:
1、官网下载地址:https://releases.ansible.com/ansible
[root@manage01 ~]# wget https://releases.ansible.com/ansible/ansible-2.9.3.tar.gz
2、安装ansible
[root@manage01 ~]# tar xf ansible-2.9.3.tar.gz
[root@manage01 ~]# mv ansible-2.9.3 /opt/ansible
[root@manage01 ~]# cd /opt/ansible
# python目前的版本 python2 python3
# pip是python中的下载工具,python2已经不支持的,早就停止更新了
# 如果是python3,pip的名字叫pip3
#python软件包安装--1、安装依赖
[root@manage01 ansible]python get-pip.py
[root@manage01 ansible-2.9.0rc3]#
# install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
#python软件包安装--2、安装软件
[root@manage01 ansible-2.9.0rc3]# pip install --user ansible -i https://pypi.tuna.tsinghua.edu.cn/simple/
#安装后设置
[root@manage01 ~]# ln -s /opt/ansible/bin/* /usr/bin/
[root@manage01 ~]# cp /opt/ansible/examples/ansible.cfg /etc/ansible/
[root@manage01 ~]# cp /opt/ansible/examples/hosts /etc/ansible/
1.4 修改配置文件
vim /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性(一般无需修改)
-- 找到下面的语句,取消注释
host_key_checking = False # 检查对应服务器的host_key
#log_path=/var/log/ansible.log # 日志文件,建议启用
#module_name = command # 默认模块,可以修改为shell模块
vim /etc/ansible/hosts
[组名]
写入要控制的主机ip

Inventory 主机清单
1> ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
2> 默认的inventory file为/etc/ansible/hosts
3> inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
/etc/ansible/hosts文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名。
可以将同一个主机同时归并到多个不同的组中;
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
ntp.zking.com 不分组,直接加
webservers\] webservers组 www1.zking.com:2222 可以指定端口 www2.zking.com \[dbservers
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
示例:
websrvs
www[1:100].example.com ip: 1-100
dbsrvs
db-[a:f].example.com dba-dbff
1.5 ansible系列命令
Ansible系列命令
ansible ansible-doc ansible-playbook ansible-vault ansible-console
ansible-galaxy ansible-pull
ansible-doc: 显示模块帮助
ansible-doc [options] [module...]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)
示例:
ansible-doc -l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc -s ping 查看指定模块帮助用法
ansible通过ssh实现配置管理、应用部署、任务执行等功能,
建议配置ansible端能基于密钥认证的方式联系各被管理节点
ansible <host-pattern> [-m module_name] [-a args]
ansible +被管理的主机(ALL) +模块 +参数
--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 --vv -vvv更详细
--list-hosts 显示主机列表,可简写 --list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo切换
--become-user=USERNAME 指定sudo的runas用户,默认为root
-K, --ask-become-pass 提示输入sudo时的口令
1.6 ssh远程连接
第一步:生成ssh公私钥
ssh-keygen
后面操作回车就行
第二步:将公钥传给node1
cd ~
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
后面跟要连接的主机ip
-- 这里需要输入对面连接主机的用户密码
第三步:测试连接
ssh root@[ip]
不需要自己输入密码,就可以登录到其他主机
1.7 ssh连接脚本
#!/bin/bash
# 定义变量
USER="root"
PASSWORD="123456"
PUBLIC_KEY_FILE="/root/.ssh/id_rsa.pub"
BASE_IP="192.168.66.1"
ssh-keygen -f /root/.ssh/id_rsa -N ""
# 循环遍历 IP 地址范围 1 到 10
for i in {1..10}
do
HOST="${BASE_IP}${i}"
echo "设置免密 SSH for $USER@$HOST..."
# 使用 sshpass 和 ssh-copy-id 命令来设置免密登录
sshpass -p "$PASSWORD" ssh-copy-id -o StrictHostKeyChecking=no -i "$PUBLIC_KEY_FILE" "$USER@$HOST"
if [ $? -eq 0 ]; then
echo "设置成功 for $USER@$HOST."
else
echo "设置失败 SSH for $USER@$HOST."
fi
done
1.8 ansible的Host-pattern
ansible的Host-pattern
匹配主机的列表
All :表示所有Inventory中的所有主机
ansible all --list
* :通配符
ansible "*" --list (*表示所有主机)
ansible 192.168.66.* --list
ansible "*srvs" --list
或关系 ":"
ansible "websrvs:appsrvs" --list
ansible "192.168.66.10:192.168.66.20" --list
逻辑与 ":&"
ansible "websrvs:&dbsrvs" --list
在websrvs组并且在dbsrvs组中的主机
逻辑非 ":!"
ansible 'websrvs:!dbsrvs' --list
在websrvs组,但不在dbsrvs组中的主机
注意:此处为单引号
综合逻辑
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' --list
正则表达式
ansible "websrvs:&dbsrvs" --list
ansible "~(web|db).*\.zking\.com" --m ping
[websrvs]
web1.zking.com ansible_host=192.168.66.10
web2.zking.com ansible_host=192.168.66.11
[appsrvs]
app1.zking.com ansible_host=192.168.66.20
app2.zking.com ansible_host=192.168.66.21
[dbsrvs]
db1.zking.com ansible_host=192.168.66.30
db2.zking.com ansible_host=192.168.66.31
[ftpsrvs]
ftp1.zking.com ansible_host=192.168.66.40
ftp2.zking.com ansible_host=192.168.66.41
# 定义一个组合组,包含所有服务器
[servers:children]
websrvs
appsrvs
dbsrvs
ftpsrvs
# 使用别名
[aliases]
alias_web1 ansible_host=192.168.66.10
alias_app1 ansible_host=192.168.66.20
1.9 ansible命令执行过程
ansible命令执行过程
加载自己的配置文件 默认/etc/ansible/ansible.cfg
加载自己对应的模块文件,如command
通过ansible将模块或命令生成对应的临时py文件,
并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
给文件+x执行
执行并返回结果
删除临时py文件,sleep 0退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
可以通过添加-v观察执行过程
示例:
以wang用户执行ping存活检测
ansible all -m ping -u wang -k
以wang sudo至root执行ping存活检测
ansible all -m ping -u wang -k -b
以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang -k -b --become-user=mage
以wang sudo至root用户执行ls
ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -K
ansible ping模块测试连接
ansible 192.168.66.126,192.168.66.127 -m ping -k