Skip to content

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 命令执行过程

  1. 加载自己的配置文件,默认 /etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 commandcopyshell
  4. 通过 Ansible 将模块或命令生成对应的临时 py 文件 (python 脚本),并将该文件传输至远程服务器;
  5. 对应执行用户的 Home 目录的 .ansible/tmp/XXX/XXX.PY 文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时 py 文件,sleep 0 退出;

自动化运维的演变

早期,运维人员需要维护数量众多的机器,执行大量重复性劳动。例如,为 backup 服务器部署 Rsync 服务,需要在所有其他服务器上分别配置 Rsync 客户端,过程繁琐。

在 2003-2012 年间,SSH 自动化运维逐渐流行。通过在管理机上创建密钥对,将公钥分发至被管理机器,然后开发脚本实现批量管理。然而,这些脚本通常复杂且难以维护。系统管理员面临的主要问题是系统配置管理和远程命令执行,因此诞生了 Fabric、Puppet、Chef、Ansible、SaltStack 等多种开源工具。其中,基于 Python 开发的 SaltStack 和 Ansible 因其学习简单、功能强大而备受青睐。

如今,自动化运维已进入数据化、可视化和智能化阶段。DevOps 和 AIOps 成为行业趋势,AI 机器人等技术也开始辅助运维工作,前景广阔。

自动化运维的好处:

  • 提高工作效率,减少重复性工作
  • 大大减少人为出错的可能性
  • 数据化管理、数据化汇报、问题可追溯

如何学习 Ansible

  1. 官网文档: 打开 Ansible 官网查看最新的功能和文档:https://docs.ansible.com/ansible/latest/
  2. 模块: Ansible 提供了丰富的模块来执行各种命令,如文件拷贝、软件安装、服务重启等。
  3. 语法: 严格按照 Ansible 提供的语法进行操作。
  4. 实践: 多动手实践,熟悉 Ansible 的各项操作。

Ad-Hoc 命令模式

Ad-Hoc 模式用于执行一些临时、快速的命令。

bash
ansible     web         -m       command       -a       "hostname"
 命令     定义主机名    指定模块     模块名字    指定执行动作    执行命令

Ansible 环境配置

安装

bash
# 使用阿里源更新乌班图源
sudo apt update
sudo apt install -y ansible
sudo apt-get install sshpass

开启 root 登录

bash
# 打开 SSH 配置文件
vim /etc/ssh/sshd_config

# 找到 PermitRootLogin prohibit-password 并修改为 yes
PermitRootLogin yes

# 重启 SSH 服务
sudo service ssh restart

# 设置 root 密码
sudo passwd

主机清单配置

编辑 /etc/ansible/hosts 文件来定义受管主机。

基础配置:

ini
[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

使用变量简化配置:

ini
[web:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass="1234"

[web]
172.16.1.[7:10]

常用参数:

参数说明
ansible_host远程主机 IP
ansible_portSSH 连接端口,默认 22
ansible_userSSH 连接用户
ansible_passwordSSH 连接密码

SSH 指纹确认

首次连接新主机会有指纹确认提示。

bash
[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 中禁用主机密钥检查:

ini
[defaults]
host_key_checking = False

常用模块

查看帮助

bash
# 查看所有模块
ansible-doc -l

# 查看特定模块帮助
ansible-doc -s <module_name>

命令状态颜色

  • 绿色:命令已执行,但状态未改变。
  • 黄色:命令已执行,且状态发生变化。
  • 紫色:警告信息,提示有更合适的模块用法。
  • 红色:执行出错。
  • 蓝色:详细的执行过程日志。

ping 模块

测试与主机的连通性。

bash
ansible all -m ping

command 模块

在远程节点上执行简单命令。这是 Ansible 的默认模块。

注意: command 模块不支持 shell 变量(如 $HOME)和特殊符号(如 <>|;&)。

示例:

bash
# 查看主机名 (可省略 -m command)
ansible web -a hostname

# 查看内存
ansible web -a "free -m"

# 创建文件
ansible web -a "touch /opt/test.log"

command 模块参数:

参数说明
chdir在执行命令前进入指定目录
creates如果指定文件不存在,则执行命令
removes如果指定文件存在,则执行命令

shell 模块

在远程节点上执行复杂的命令,支持管道、重定向等 shell 特性。

示例:

bash
# 过滤 ssh 进程信息
ansible all -m shell -a "ps -ef | grep ssh"

# 使用重定向创建文件
ansible web -m shell -a "date > /opt/date.log"

copy 模块

将文件从控制节点复制到远程主机。

示例:

bash
# 简单复制文件
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 模块

管理远程主机上的文件和目录属性,如创建、删除、修改权限等。

filecopy 的区别:

  • copysrc 在控制节点,dest 在远程节点。
  • filesrcdest 都在远程节点(用于创建链接)。

常用参数:

参数说明
path必须,指定要操作的文件或目录
statedirectory(目录)、touch(文件)、link(软链接)、hard(硬链接)、absent(删除)
owner指定属主
group指定属组
mode指定权限
recurseyes 时递归修改目录属性

示例:

bash
# 创建文件
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 模块

在远程主机上执行本地脚本。

示例:

bash
# 在所有 web 主机上执行本地的 /tmp/test.sh 脚本
ansible web -m script -a "/tmp/test.sh"

group 模块

管理远程主机上的用户组。

常用参数:

参数说明
name必须,指定组名
statepresent (创建,默认值)、absent (删除)
gid指定组 ID

示例:

bash
# 创建一个名为 www 的用户组
ansible all -m group -a "name=www state=present"

# 删除 www 用户组
ansible all -m group -a "name=www state=absent"

user 模块

管理远程主机上的用户账户。

常用参数:

参数说明
name必须,指定用户名
statepresent (创建,默认值)、absent (删除)
uid指定用户 ID (UID)
group指定用户所属的主组
groups指定用户所属的附加组
shell指定用户的登录 Shell
home指定用户的家目录
password设置用户密码 (加密后的字符串)
removestate=absent 时,yes 表示删除用户的家目录

示例:

bash
# 创建一个名为 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"

贡献者

The avatar of contributor named as LI SIR LI SIR

页面历史