Ansible 基础
更新: 10/15/2025 字数: 0 字 时长: 0 分钟
Ansible 简介
Ansible 是目前最受运维欢迎的批量自动化运维工具,基于 Python 开发,集合了众多运维工具 (SaltStack puppet、chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible 是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是 Ansible 所运行的模块,Ansible 只是提供一种框架。Ansible 不需要在远程主机上安装 client/agents,因为它们是基于 ssh 来和远程主机通讯的。
Ansible 特点
- 部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作;
- 默认使用 SSH 协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持 API 及自定义模块,可通过 Python 轻松扩展;
- 通过 Playbooks 来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装 agent,更新时,只需在操作机上进行一次更新即可;
Ansible 命令执行过程
- 加载自己的配置文件,默认
/etc/ansible/ansible.cfg
; - 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如
command
、copy
、shell
- 通过 Ansible 将模块或命令生成对应的临时 py 文件 (python 脚本),并将该文件传输至远程服务器;
- 对应执行用户的 Home 目录的
.ansible/tmp/XXX/XXX.PY
文件; - 给文件
+x
执行权限; - 执行并返回结果;
- 删除临时 py 文件,
sleep 0
退出;
自动化运维的演变
早期,运维人员需要维护数量众多的机器,执行大量重复性劳动。例如,为 backup 服务器部署 Rsync 服务,需要在所有其他服务器上分别配置 Rsync 客户端,过程繁琐。
在 2003-2012 年间,SSH 自动化运维逐渐流行。通过在管理机上创建密钥对,将公钥分发至被管理机器,然后开发脚本实现批量管理。然而,这些脚本通常复杂且难以维护。系统管理员面临的主要问题是系统配置管理和远程命令执行,因此诞生了 Fabric、Puppet、Chef、Ansible、SaltStack 等多种开源工具。其中,基于 Python 开发的 SaltStack 和 Ansible 因其学习简单、功能强大而备受青睐。
如今,自动化运维已进入数据化、可视化和智能化阶段。DevOps 和 AIOps 成为行业趋势,AI 机器人等技术也开始辅助运维工作,前景广阔。
自动化运维的好处:
- 提高工作效率,减少重复性工作
- 大大减少人为出错的可能性
- 数据化管理、数据化汇报、问题可追溯
如何学习 Ansible
- 官网文档: 打开 Ansible 官网查看最新的功能和文档:https://docs.ansible.com/ansible/latest/
- 模块: Ansible 提供了丰富的模块来执行各种命令,如文件拷贝、软件安装、服务重启等。
- 语法: 严格按照 Ansible 提供的语法进行操作。
- 实践: 多动手实践,熟悉 Ansible 的各项操作。
Ad-Hoc 命令模式
Ad-Hoc 模式用于执行一些临时、快速的命令。
ansible web -m command -a "hostname"
命令 定义主机名 指定模块 模块名字 指定执行动作 执行命令
Ansible 环境配置
安装
# 使用阿里源更新乌班图源
sudo apt update
sudo apt install -y ansible
sudo apt-get install sshpass
开启 root 登录
# 打开 SSH 配置文件
vim /etc/ssh/sshd_config
# 找到 PermitRootLogin prohibit-password 并修改为 yes
PermitRootLogin yes
# 重启 SSH 服务
sudo service ssh restart
# 设置 root 密码
sudo passwd
主机清单配置
编辑 /etc/ansible/hosts
文件来定义受管主机。
基础配置:
[web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123123
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123123
使用变量简化配置:
[web:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass="1234"
[web]
172.16.1.[7:10]
常用参数:
参数 | 说明 |
---|---|
ansible_host | 远程主机 IP |
ansible_port | SSH 连接端口,默认 22 |
ansible_user | SSH 连接用户 |
ansible_password | SSH 连接密码 |
SSH 指纹确认
首次连接新主机会有指纹确认提示。
[root@master-61 ~]#ansible 172.16.1.9 -m ping
172.16.1.9 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
可以手动 ssh
连接一次,或者在 Ansible 配置文件 /etc/ansible/ansible.cfg
中禁用主机密钥检查:
[defaults]
host_key_checking = False
常用模块
查看帮助
# 查看所有模块
ansible-doc -l
# 查看特定模块帮助
ansible-doc -s <module_name>
命令状态颜色
- 绿色:命令已执行,但状态未改变。
- 黄色:命令已执行,且状态发生变化。
- 紫色:警告信息,提示有更合适的模块用法。
- 红色:执行出错。
- 蓝色:详细的执行过程日志。
ping
模块
测试与主机的连通性。
ansible all -m ping
command
模块
在远程节点上执行简单命令。这是 Ansible 的默认模块。
注意: command
模块不支持 shell 变量(如 $HOME
)和特殊符号(如 <
、>
、|
、;
、&
)。
示例:
# 查看主机名 (可省略 -m command)
ansible web -a hostname
# 查看内存
ansible web -a "free -m"
# 创建文件
ansible web -a "touch /opt/test.log"
command
模块参数:
参数 | 说明 |
---|---|
chdir | 在执行命令前进入指定目录 |
creates | 如果指定文件不存在,则执行命令 |
removes | 如果指定文件存在,则执行命令 |
shell
模块
在远程节点上执行复杂的命令,支持管道、重定向等 shell 特性。
示例:
# 过滤 ssh 进程信息
ansible all -m shell -a "ps -ef | grep ssh"
# 使用重定向创建文件
ansible web -m shell -a "date > /opt/date.log"
copy
模块
将文件从控制节点复制到远程主机。
示例:
# 简单复制文件
ansible web -m copy -a 'src=/tmp/local.log dest=/opt/'
# 复制并修改文件属性
ansible web -m copy -a 'src=/tmp/local.log dest=/opt/ group=www owner=www mode=600'
# 复制前备份远程文件 (仅当内容变化时)
ansible web -m copy -a 'src=/tmp/local.log dest=/opt/ backup=yes'
# 直接写入内容到远程文件
ansible web -m copy -a "content='some content' dest=/opt/newfile.txt"
file
模块
管理远程主机上的文件和目录属性,如创建、删除、修改权限等。
file
与 copy
的区别:
copy
:src
在控制节点,dest
在远程节点。file
:src
和dest
都在远程节点(用于创建链接)。
常用参数:
参数 | 说明 |
---|---|
path | 必须,指定要操作的文件或目录 |
state | directory (目录)、touch (文件)、link (软链接)、hard (硬链接)、absent (删除) |
owner | 指定属主 |
group | 指定属组 |
mode | 指定权限 |
recurse | yes 时递归修改目录属性 |
示例:
# 创建文件
ansible all -m file -a "path=/opt/test.log state=touch"
# 创建目录
ansible all -m file -a "path=/opt/test_dir state=directory"
# 创建文件并设置权限
ansible all -m file -a "path=/opt/hello.log state=touch owner=www group=www mode=0644"
script
模块
在远程主机上执行本地脚本。
示例:
# 在所有 web 主机上执行本地的 /tmp/test.sh 脚本
ansible web -m script -a "/tmp/test.sh"
group
模块
管理远程主机上的用户组。
常用参数:
参数 | 说明 |
---|---|
name | 必须,指定组名 |
state | present (创建,默认值)、absent (删除) |
gid | 指定组 ID |
示例:
# 创建一个名为 www 的用户组
ansible all -m group -a "name=www state=present"
# 删除 www 用户组
ansible all -m group -a "name=www state=absent"
user
模块
管理远程主机上的用户账户。
常用参数:
参数 | 说明 |
---|---|
name | 必须,指定用户名 |
state | present (创建,默认值)、absent (删除) |
uid | 指定用户 ID (UID) |
group | 指定用户所属的主组 |
groups | 指定用户所属的附加组 |
shell | 指定用户的登录 Shell |
home | 指定用户的家目录 |
password | 设置用户密码 (加密后的字符串) |
remove | 当 state=absent 时,yes 表示删除用户的家目录 |
示例:
# 创建一个名为 www 的用户,并将其添加到 www 组
ansible all -m user -a "name=www group=www state=present"
# 删除 www 用户及其家目录
ansible all -m user -a "name=www state=absent remove=yes"