使用Ansible前需要进行ssh密钥认证
Ansible简介
- 自动化运维:批量管理、批量分发、批量执行
- Ansible由python编写
| 批量管理工具 | 说明 |
| Ansible | 无客户端,基于ssh进行管理与维护 |
| Saltstack | 需要安装客户端,基于ssh进行管理与维护 |
| Terraform | tf批量管理基础设施 |
Ansible管理架构⭐⭐⭐⭐
- Host Inventory(主机清单):被管理主机的ip列表、模块
- ad-hoc模式(点对点模式):命令行批量管理
- playbook模式(剧本模式):将对应操作写入脚本

部署与配置
# 部署ansible yum install -y ansible # 修改配置文件关闭主机Host_key_checking # 修改配置文件开启日志功能 [root@m01 ~]# egrep -vn '^$|#' /etc/ansible/ansible.cfg 10:[defaults] 71:host_key_checking = False 111:log_path = /var/log/ansible.log 327:[inventory] 340:[privilege_escalation] 346:[paramiko_connection] 370:[ssh_connection] 431:[persistent_connection] 445:[accelerate] 460:[selinux] 469:[colors] 485:[diff]
Ans-inventory主机清单⭐⭐⭐
- 主机清单:ansible被管理节点的列表
- ansible默认读取/etc/ansible/hosts文件
# 主机清单格式 [分类或分组名] # 分类要体现出对应节点的作用 ip地址/主机名/域名 # 对应的主机名需要能解析 #子组的格式 [组名:children] 子组名 子组名 [root@m01 ~]# cat /etc/ansible/hosts [web] 172.16.1.7 [backup] 172.16.1.41 [nfs] 172.16.1.31 [data:children] [nfs] [backup] # 指定用户、密码、端口(不推荐,推荐先进行ssh认证,再进行管理) 172.16.1.7 ansible_user=root ansible_password=root ansible_port=22
Ansible模块⭐⭐⭐⭐⭐
- ansible中的模块类似于Linux中的命令
- Linux命令管理系统
- ansible模块实现批量管理
| ansible选项 | 说明 |
| -i | 指定主机清单文件 |
| -m | 指定模块 |
| -a | 指定模块中的选项 |
常见模块介绍
| 模块分类 | 模块 |
| 命令和脚本 | command模块:ansible默认的模块,执行简单命令,不支持特使符号 |
| shell模块:执行命令,支持特殊符号 | |
| script模块:分发脚本命令 | |
| 文件 | file模块:创建目录、文件、软连接 |
| copy模块:远程分发文件,修改权限,所有者,备份 | |
| 服务 | system模块:服务管理(旧版本的系统使用service模块) |
| 软件包 | yum源模块:yum_repository |
| yum命令 | |
| get_url下载软件 | |
| 系统管理 | mount模块:挂载 |
| cron模块:定时任务 | |
| 用户管理 | group模块:管理用户组 |
| user模块:管理用户 | |
| 调试 | ping模块:检查ansible与其他节点连通性 |
| debug模块:用于检查/显示变量 |
命令与脚本类模块
command模块
ans默认的模块,适用于执行简单的命令,不支持特殊符号
# 案例:批量获取所有主机的主机名 ansible all -m command -a 'hostname' ansible all -a 'hostname'
shell模块
执行简单的命令,支持特殊符号
# 案例:批量删除/tm/下面所有的内容 ansible all -m shell -a 'rm -rf /tmp/*' # 案例:批量获取ip地址 ansible all -m shell -a "ip address show |awk -F'[ /]+' 'NR==3{print \$3}'"
script模块
# 案例:批量执行/server/scripts/create_distribute_keys.sh脚本 ansible all -m script -a '/server/scripts/create_distribute_keys.sh'
文件类模块
template模块
- 从模板文件生成配置文件或其他文本文件
- template模块使用Jinja2模板引擎,可以在模板中使用变量、控制结构(如条件语句和循环)来动态生成目标文件的内容
| template模块 | 说明 |
| src | 模板文件的源路径 |
| dest | 目标文件的路径 |
| owner | 文件所有者 |
| group | 文件所属组 |
| mode | 文件权限 |
file模块
批量管理文件、目录、软连接
| file模块 | 模块说明 |
| path | 目录/文件路径(必须要写) |
| src | source,源文件或目录(一般创建软连接时使用) |
| state |
状态(模式):具体的操作
|
| mode | mode=777 创建并修改问价 |
| onwer | onwer=root |
| group | group=root |
- 案例:批量创建/yuan/yuanxiaojiang.txt
ansible all -m file -a 'path=/yuan/yuanxiaojiang.txt state=touch state=directory'
- 案例:批量创建/etc/hosts的软连接到/opt下面
ansible all -m file -a 'src=/etc/hosts path=/opt/hosts state=link'
- 案例:批量创建/backup/host/目录,所有者所属组为root,权限为700
ansible all -m file -a 'path=/backup/host/ mode=700 owner=root group=root state=directory
- 案例:批量删除/bakcup/目录及目录下内容
ansible all -m file -a 'state=absent path=/backup'
copy模块
批量分发(批量推送):管理节点发送文件或压缩包到被管理节点
| copy模块 | 模块说明 |
| src | source 管理端的文件或目录 |
| dest | destination 被管理端的文件或目录 |
| backup | backup=yes 覆盖前进行备份(文件内容要求有变化) |
| mode | 修改权限 |
| owner | 修改为指定的所有者 |
| group | 修改为指定的所属组 |
- 案例:批量分发/etc/hosts文件,文件存在则自动备份
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'
服务管理-systemd
systemd模块相当于linux中systemctl命令
systemd模块适用于目前大部分系统Linux系统
service模块适用于管理旧的Linux系统
| systemd模块 | 说明 |
| name | 用于指定服务名称 |
| enabled | 是否开机自启动(yes/no) |
| state |
state=started 开启 state=stopped 关闭 state=reloaded 重读配置文件(服务支持) state=restarted 重启(关闭再开启) |
| daemon-reload | 是否重新加载对应的服务的管理配置文件 |
- 案例:批量开启crond服务并设置开机自启动
ansible all -m systemd -a 'name=crond state=started enabled=yes'
- 案例:批量关闭firewalld服务并不让其开机自启动
ansible all -m systemd -a 'name=firewalld state=stopped enabled=no'
软件模块
yum模块
yum模块包含yum/apt命令
| yum模块 | 说明 |
| name | 指定软件包名字,可以指定多个软件包(使用","分割) |
| state |
installed 安装(也可以写成present) removed 删除(也可以写成absent) latest 安装或更新 |
| update_cache | 是否更新yum缓存(加速) |
- 批量安装tree,lrzsz,sshpass软件包
ansible all -m yum -a 'name=tree,lrzsz,sshpass state=present'
get_url模块
相当于wget命令(所有主机需要能访问网络)
推荐在管理节点下载好,使用copy分发
| get_url模块 | 说明 |
| url | 指定下载地址 |
| dest | 下载到哪个目录 |
- 案例:批量下载zabbix-agent的软件包到/app/tools/下面
ansible all -m file -a 'path=/app/tools/ state=directory' ansible all -m get_url -a 'url="https://mirrors.aliyun.com/zabbix/zabbix/6.5/rhel/7/x86_64/zabbix-agent2-7.0.0-alpha6.release2.el7.x86_64.rpm" dest=/app/tools/'
yum_repository模块
未来将配置好的yum配置文件,通过copy分发到被管理机
| yum_repository模块 | 说明 | yum源配置 |
| name | yum源的名字 | [源名字] |
| decription | yum源中的注释说明 | name |
| baseurl | yum源中的下载地址 | baseurl |
| enabled | 是否启动这个源 | enabled |
| gpgcheck | 是否启动gpgcheck功能 | gpgcheck |
| file | 指定yum源文件(自动添加.repo,默认与模块名字一致) |
- 案例:批量给web服务器配置nginx的yum源
https://nginx.org/en/linux_packages.html#RHEL
ansible web -m yum_repository -a 'name=nginx-stable description="nginx repo" baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" gpgcheck=no enabled=yes'
用户管理模块
- user用户管理:useradd,userdel
- group用户组管理:groupadd
user模块
| user模块 | 说明 |
| name | 用户名 |
| uid | 指定uid |
| group | 指定用户组(一般用于事先创建好了用户组) |
| shell | 指定命令解释器:默认是/bin/bash |
| create_home | 是否创建家目录( yes/no ) |
| state |
present 添加 absent 删除 |
| password | 后买指定的密码为加密的密码 |
- 批量创建用户名为yuan_ans,uid为2000没有家目录的虚拟用户
ansible all -m user -a 'name=yuan_ans uid=2000 shell=/sbin/nologin create_home=no state=present'
批量更新用户密码
ansible all -m user -a "name=zhangsan password{{ 'zhangsan' | password_hash('sha512','zifuudanyu') }} state=present" 注意:{{ 内容 }} # 注意空格 # 关于{{}}相关解释 {{'root' | password_hash('sha512','suijizifu')}} root表示的是密码,经过管道,传递给password_hash()插件 sha512加密算法,suijizifu(盐值)是随机字符用于生成加密后的密码
group模块
| group模块 | 说明 |
| name | 指定用户组名字 |
| gid | 指定组的gid |
| state |
present 添加用户组 absent 删除用户组 |
mount模块
实现mount命令进行挂载(可以指定参数修改/etc/fstab实现永久挂载)
| mount模块参数 | 说明 |
| fstype | filesystem type:指定文件系统(xfs、ext4、iso9660、nfs) |
| src | 源地址(eg:nfs地址 172.16.1.31/data) |
| path | 挂载点 |
| state |
absent 卸载并修改fstab unmounted 卸载不修改/etc/fstab present 仅修改/etc/fstab 不挂载 mounted 挂载并修改/etc/fstab remounted 重新挂载 |
- 案例:通过ans管理在web01上挂载nfs:/data/到web01的/ans-upload/
# 检查nfs服务端配置 ansible nfs -m shell -a 'cat /etc/exports ; ls -l / |grep "data"' # 在web服务器上安装nfs ansible web -m yum -a 'name=nfs-utils state=present' # 创建挂载点 ansible web -m file -a 'path=/ans-upload/ state=directory' # 挂载nfs ansible web -m mount -a 'src=172.16.1.31:/data/ path=/ans-upload/ fstype=nfs state=mounted' # 检查 ansible web -a 'df -h' ansible web -a 'grep upload /etc/fstab'

cron模块
用户管理系统的定时任务,替代了crontab -e功能
| cron模块选项 | 说明 |
| name | 定时任务的注释(必须有) |
| minute | 分钟(minute="*/2") |
| hour | 小时 |
| day | 日期 |
| month | 月份 |
| week | 周几 |
| job | 指定命令或脚本(定向到空) job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" |
| state |
present 添加定时任务(默认) absent 删除定时任务 |
- 案例:批量创建定时任务
ansible all -m cron -a 'name="sync time" minute="*/3" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
- 案例:批量删除定时任务
ansible all -m cron -a 'name="sync time" state=absent'
浙公网安备 33010602011771号