惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - Mr.peter

Git 全量终极速记表 git常用命令汇总 Golang基础面试题 Terraform telnet localhost 3306 -bash: telnet: command not found macos 开放3306端口 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused Error: git: Failed to download resource "git.rb" Mysql 授予root在任意主机访问数据库的权限 使用Redis来处理高并发问题 go slice切片的扩容机制是什么? 使用Kubernetes时可以采取哪些最佳安全措施 Kubernetes与Docker Swarm的区别如何 k8s是怎么进行服务注册的 说说你对Job这种资源对象的了解 常用的标签分类有哪些 简述Helm及其优势 简述Kubernetes集群联邦 简述Kubernetes中,如何使用EFK实现日志的统一管理 Kubernetes 网络 Kubernetes PodSecurityPolicy
ansible是什么?怎么玩?给出常问的面试题和答案
Mr.peter · 2026-03-11 · via 博客园 - Mr.peter

一、Ansible 是什么?

简单来说,Ansible 是一个 IT 自动化引擎,能帮你自动完成配置管理、应用部署、任务编排等工作 。

它的核心设计理念是 “简单” 和 “无代理” :

  • 无代理 (Agentless):这是 Ansible 区别于 Puppet、Chef 等其他工具的最大特点。你不需要在被管理的服务器上安装任何客户端软件,它默认通过 SSH(对Linux/Unix) 或 WinRM(对Windows) 协议与目标主机通信 。这极大地降低了部署和维护成本。

  • 易用 (Easy-to-use):Ansible 使用 YAML 语法编写脚本(称为 Playbook)。YAML 是一种非常接近自然语言的数据序列化格式,易于学习和阅读,即使是非专业人员也能很快理解 Playbook 的逻辑 。

Ansible 的核心组件

一个基本的 Ansible 环境由以下几部分组成 :

  • 控制节点 (Control Node):安装了 Ansible 的机器,你在此执行命令。

  • 受管节点 (Managed Node):被 Ansible 管理的目标服务器。

  • 清单 (Inventory):定义了受管节点的列表及其分组信息,可以是静态文件(INI或YAML格式),也可以是动态生成的脚本(如从云平台拉取)。

  • 模块 (Modules):执行具体工作的代码单元,比如 copy 模块用于复制文件,yum/apt 模块用于安装软件包。Ansible 有数千个内置模块 。

  • 插件 (Plugins):用于扩展 Ansible 核心功能的代码,例如连接插件、回调插件等,它们在控制节点上运行 。

  • 剧本 (Playbooks):YAML 格式的文件,定义了一系列要在受管节点上执行的任务(Tasks),可以理解为“操作手册” 。

  • 角色 (Roles):一种用于组织 Playbook 的进阶方式,它将任务、变量、文件、模板等按功能打包成可重用的单元 。

二、怎么玩?三步快速上手

第一步:安装 Ansible

在控制节点上(通常是你的本地机器或一台跳板机),使用 pip 安装 :

第二步:准备 Inventory 文件

创建一个名为 inventory.ini 的文件,定义你要管理的主机 :

[web_servers]
192.168.1.10   ansible_user=root   # 指定 SSH 用户
192.168.1.11

[db_servers]
db1.example.com

[all:vars]
ansible_python_interpreter=/usr/bin/python3  # 所有主机都使用的 Python 解释器

第三步:运行你的第一个命令

  • Ad-Hoc 命令:执行单次的、临时的操作,比如用 ping 模块测试连通性 :

    ansible all -i inventory.ini -m ping
  • 编写并运行 Playbook:创建一个 install_nginx.yml 文件 :

    ---
    - name: Install Nginx on Ubuntu servers
      hosts: web_servers
      become: yes  

    然后运行它:

    ansible-playbook -i inventory.ini install_nginx.yml

三、常问的 Ansible 面试题及答案

这里整理了一些从基础到进阶的常见面试题,供你参考。

基础概念篇

1. 什么是 Ansible?它的主要优势是什么?

参考答案:
Ansible 是一个开源的 IT 自动化工具,用于配置管理、应用部署和任务自动化 。
它的主要优势包括:

  • 无代理架构:通过 SSH/WinRM 直接管理,无需在目标主机安装 agent,简化了部署和管理 。

  • 幂等性:执行一次和执行多次对系统状态的影响是相同的,确保配置安全可靠 。

  • YAML 语法:Playbook 使用 YAML 编写,简单易读,学习曲线平缓 。

  • 模块化:拥有海量的内置模块,覆盖了从系统、网络到云平台的各类操作 。

2. 什么是 Ansible 的“幂等性” (Idempotence)?为什么它很重要?

参考答案:
幂等性是指一个操作无论执行多少次,其结果都与执行一次相同 。
在 Ansible 中,大多数模块都是幂等的。例如,-m apt -a "name=nginx state=present" 这个命令,无论你运行多少次,它都会检查并确保 nginx 处于“已安装”状态。如果 nginx 已经安装,它就不会做任何操作。
重要性:幂等性保证了你可以安全地反复运行同一个 Playbook,而不用担心产生意外或重复的更改,这对于自动化运维的稳定性和可预测性至关重要 。

3. 解释一下 Ansible 中的 inventoryplaybook 和 role 的区别与联系。

参考答案:

  • Inventory:是 Ansible 管理的主机列表,定义了主机和组的信息 。

  • Playbook:是一个或多个“剧本”的集合,它告诉 Ansible 要在哪些主机(来自 Inventory)上,按什么顺序,执行哪些任务(Tasks)。

  • Role:是一种更高级的抽象。它把 Tasks、Handlers、Variables、Templates 等按功能组织成一个标准的目录结构。一个 Role 可以被多个 Playbook 通过 roles 关键字引用,实现了代码的复用和模块化 。
    联系:你可以理解为:Inventory 是演员名单,Role 是剧本里某个角色的完整戏份(台词、动作),而 Playbook 则是导演,它指定了哪个演员(Inventory 里的主机)去演哪个角色(Role)。

4. 什么是 Ansible Facts?

参考答案:
Facts 是 Ansible 在执行 Playbook 时,通过 setup 模块自动在受管主机上收集的系统信息 。这些信息包括 IP 地址、操作系统类型、CPU 架构、内存大小等。
你可以像使用普通变量一样使用 Facts(例如 {{ ansible_os_family }}),来根据不同的系统执行不同的任务(例如在 RedHat 上用 yum,在 Debian 上用 apt)。

5. 什么是 Handler?一般在什么场景下使用?

参考答案:
Handler 是一种特殊的任务,它不会主动执行,而是只有当被其他任务通过 notify 关键字“通知”后,才会在 Playbook 所有任务执行完毕后执行一次 。
典型场景:用于在配置文件被修改后重启服务。例如,当一个 task 修改了 nginx 的配置文件,它可以 notify 一个名为“restart nginx”的 handler。这样,只有在配置确实发生变更时,nginx 服务才会被重启,避免了不必要的服务中断 。

进阶与实践篇

6. 解释 Ansible 的变量优先级顺序(从低到高)。

参考答案:
这是面试中比较深入的话题。变量可以在多个地方定义,Ansible 有一个明确的优先级顺序。简化的优先级从低到高如下 :

  1. Role 默认变量(roles/<role>/defaults/main.yml):优先级最低。

  2. Inventory 变量(host_vars/ 或 group_vars/)。

  3. Playbook 中的 vars

  4. set_fact:在任务执行中动态设置的变量。

  5. 通过命令行传递的 -e (extra vars):拥有最高优先级。
    关键原则:“离执行越近,优先级越高”。Extra vars 永远是最强的,Role 默认值永远是最弱的。

7. 你如何管理 Ansible 中的敏感信息,比如密码或 API 密钥?

参考答案:
使用 Ansible Vault 。
Ansible Vault 可以加密整个变量文件或单个变量字符串。加密后的文件可以安全地存储在代码仓库中。在运行 Playbook 时,可以通过 --ask-vault-pass 提示输入密码,或通过 --vault-password-file 指定密码文件(在 CI/CD 中更常用)来解密 。

8. 如何调试一个执行失败的 Ansible Playbook?

参考答案:
可以采取以下步骤进行调试 :

  1. 查看详细输出:使用 -v-vvv 或 -vvvv 获取更详细信息)参数重新运行 Playbook,可以看到 SSH 的详细交互和模块返回的原始数据。

  2. 检查错误信息:仔细分析 Ansible 返回的红色错误信息,通常会指出是哪个模块、哪个 task 失败了。

  3. 在指定任务处开始执行:使用 --start-at-task="任务名" 参数,从失败的任务开始重新执行,避免重复运行之前的成功步骤。

  4. 在目标主机上手动模拟:登录到失败的主机,手动执行 Ansible 在该步骤尝试执行的命令,看是否能复现问题。

  5. 检查语法:使用 ansible-playbook --syntax-check playbook.yml 检查 Playbook 语法。

9. delegate_to 和 local_action 有什么作用?

参考答案:

  • delegate_to:用于将一个任务“委托”给清单中的另一台主机执行,而不是在当前目标主机上执行。例如,在更新一批 Web 服务器之前,你可能想通过 delegate_to 将一个任务委托给负载均衡器,让它先把这些 Web 服务器从集群中下线 。

  • local_action:是 delegate_to: 127.0.0.1 的便捷写法,表示该任务在 Ansible 控制节点本地执行。常用于在本地运行一个脚本,或者等待远程服务启动等操作 。

10. 什么是 Ansible Galaxy?什么是 Collections?

参考答案:

  • Ansible Galaxy:是一个用于分享 Ansible 内容和 Collections 的公共社区中心 。你可以在这里找到其他人写好的 Role 和 Collection,快速搭建自己的自动化项目。

  • Collections:是从 Ansible 2.9 开始引入的一种新的、更强大的内容分发格式 。它不仅仅包含 Roles,还可以包含 Modules, Plugins, Playbooks 等所有内容。你可以把 Collections 看作是一个内容“大礼包”,使得内容的打包、分发和版本管理更加规范 。