Ansible:从基础到高级应用的全面指南
1. Ansible 执行与调试
在使用 Ansible 运行 playbook 时,我们可以通过 PLAY RECAP 查看执行结果。例如,当执行结果显示 localhost : ok=1 changed=1 unreachable=0 failed=0 时,意味着只有一个任务且该任务已完成。若有多个任务,playbook 会从上次中断的地方继续执行。若发现拼写错误,可更新 playbook 后继续操作。此外,在调试时,我们还可以选择输入 continue 继续执行或 quit 停止执行。
Ansible 调试器在创建大型 playbook 时非常有用。假设一个 playbook 运行需要 20 分钟,但在运行 15 分钟后出现错误。使用调试器,我们可以进入交互式调试 shell,清晰地看到哪些变量已定义、哪些未定义,避免盲目修改 playbook 后再等待 15 分钟来验证修改是否解决了致命错误。
2. Ansible 的实际应用案例
2.1 基于聊天的交互应用
为了在笔记本电脑或手机上展示自动化演示,且无法使用命令行,我们可以借助 Slack、Hubot 和 Jenkins 等工具。具体操作步骤如下:
1. 配置 Hubot :Hubot 是 GitHub 开发的开源可扩展聊天机器人。使用 hubot-slack 插件在 Slack 频道进行配置,使其监听用户命令。
2. 定义别名 :使用 hubot-alias 插件将 @bot give me a linux server 转换为 build awslaunch OS=linux ,并通过 hubot-yardmaster 插件触发 Jenkins 中的构建任务。
3. Jenkins 执行 playbook :Jenkins 是开源自动化服务器,常用于持续集成和持续交付。利用 Jenkins Ansible 插件和 Jenkins Git 插件,将用于启动 AWS 实例的 playbook 和角色拉取到 Jenkins 服务器,并运行 playbook。该 playbook 包含一些逻辑,如限制可启动的实例数量、随机命名实例以及显示随机 GIF 等,通过 Ansible Slack 模块将实例信息和其他细节反馈给用户。
例如,在 Slack 频道输入 @bot give me a linux server 会触发 playbook 运行,在 AWS 中启动一个实例,并在服务器网络可用时返回实例信息;输入 @bot terminate all servers 则会运行另一个 playbook,删除所有运行的实例,并在实例删除后返回一个动画 GIF。
以下是该流程的 mermaid 流程图:
graph LR
A[Slack 命令输入] --> B[Hubot 监听]
B --> C[Hubot 别名转换]
C --> D[Jenkins 构建触发]
D --> E[Jenkins 拉取 playbook]
E --> F[Jenkins 运行 playbook]
F --> G[AWS 实例操作]
G --> H[返回信息到 Slack]
2.2 自动化部署应用
对于开发人员需要将代码自动部署到开发和测试服务器的需求,我们可以结合 Docker、GitHub、Jenkins 和 Ansible AWX 来实现自动化工作流。具体步骤如下:
1. 部署 Jenkins 和 AWX :使用 Ansible 将 Jenkins 部署到容器中,并使用 Docker 在同一服务器上部署 AWX。
2. 配置 Jenkins 与 GitHub 连接 :使用 Jenkins GitHub 插件将 Jenkins 项目与 GitHub 仓库连接,创建触发构建所需的 Webhooks。
3. 触发 playbook 运行 :使用 Jenkins Ansible Tower 插件,让 Jenkins 在 AWX 中触发 playbook 运行。由于目前 AWX 与 GitHub Webhooks 的集成不够方便,而 Jenkins 与 Jenkins GitHub 插件兼容性良好,所以采用这种方式。
4. 权限管理 :AWX 支持基于角色的访问控制,开发经理和运维工程师可以运行生产环境的 playbook,而开发人员只有只读权限,只能查看 playbook 运行结果。这符合我们的部署策略,即开发人员不能直接访问生产系统进行代码部署。
以下是自动化部署流程的表格总结:
| 步骤 | 操作内容 | 工具 |
| ---- | ---- | ---- |
| 1 | 部署 Jenkins 和 AWX | Ansible、Docker |
| 2 | 连接 Jenkins 与 GitHub | Jenkins GitHub 插件 |
| 3 | 触发 playbook 运行 | Jenkins Ansible Tower 插件 |
| 4 | 权限管理 | Ansible AWX |
3. Ansible 相关工具信息
更多关于文中提到的工具的信息可通过以下 URL 获取:
- Hubot: https://hubot.github.com
- Hubot Slack: https://github.com/slackapi/hubot-slack
- Hubot Alias: https://github.com/dtaniwaki/hubot-alias
- Hubot Yardmaster: https://github.com/hacklanta/hubot-yardmaster
- Jenkins Git: https://plugins.jenkins.io/git
- Jenkins Ansible: https://plugins.jenkins.io/ansible
- Jenkins GitHub: https://plugins.jenkins.io/github
- Jenkins Ansible Tower: https://plugins.jenkins.io/ansible-tower
4. Ansible 评估问题解答
以下是一些常见的 Ansible 评估问题及解答:
| 章节 | 问题 | 答案 |
| ---- | ---- | ---- |
| 安装与运行 Ansible | 用 pip 安装 Ansible 的命令是什么? | sudo -H pip install ansible |
| 安装与运行 Ansible | 使用 Homebrew 时能否选择安装或回滚到特定版本的 Ansible? | 否 |
| 安装与运行 Ansible | Windows Subsystem for Linux 是否在虚拟机中运行? | 否 |
| 安装与运行 Ansible | 列举 Vagrant 支持的三个虚拟机管理程序。 | VirtualBox、VMware、Hyper - V |
| 安装与运行 Ansible | 解释什么是主机清单。 | 主机清单是 Ansible 目标主机的列表及访问选项 |
| 安装与运行 Ansible | YAML 文件中的缩进是否仅为美观,对执行是否重要? | 是 |
| Ansible 命令 | 提供主机清单信息且 Ansible 默认自带的命令是哪个? | ansible - inventory 命令 |
| Ansible 命令 | 用 Ansible Vault 加密字符串的变量文件能否在低于 2.4 版本的 Ansible 中使用? | 否 |
| Ansible 命令 | 如何获取调用 yum 模块的示例? | 使用 ansible - doc 命令 |
| Ansible 命令 | 为什么要对清单中的主机运行单个模块? | 以可控方式对多个主机运行临时命令 |
| 部署 LAMP 栈 | 用于下载和解压 zip 文件的 Ansible 模块是什么? | unarchive 模块 |
| 部署 LAMP 栈 | roles/rolename/default/ 文件夹中的变量是否会覆盖其他同名变量? | 否 |
| 部署 LAMP 栈 | 如何在 playbook 中添加第二个用户? | 在 users 变量中添加一行,如 { name: "user2", group: "lamp", state: "present", key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" } |
| 部署 LAMP 栈 | 一个任务是否只能调用一个处理程序? | 否 |
通过这些问题和解答,我们可以更好地理解 Ansible 在不同场景下的使用方法和注意事项。
5. Ansible 的总结与展望
Ansible 创造者 Michael DeHaan 曾在推特上表示:“使用 Ansible 几个月的人与使用三年的人水平相当,它是一款有意设计得简单的工具。”这精准地概括了 Ansible 的特点。一旦掌握了基础知识,就可以轻松构建越来越复杂的 playbook,不仅能用于部署基本代码和应用程序,还能用于部署复杂的云架构甚至物理架构。
Ansible 允许我们重用自己的角色,还能通过 Ansible Galaxy 访问大量社区贡献的角色,为新项目提供了许多示例和快速启动点。此外,如果 Ansible 无法完成某些任务,通常可以与其他工具集成以提供缺失的功能。
将基础设施和部署以代码形式进行可重复、可共享的定义,并鼓励他人为 playbook 做出贡献,这应该是将 Ansible 引入日常工作流的最终目标。希望通过本文,你能开始思考 Ansible 在日常任务中的应用,从而节省时间和精力。
以下是 Ansible 应用优势的 mermaid 流程图:
graph LR
A[掌握 Ansible 基础] --> B[构建复杂 playbook]
B --> C[部署基本代码和应用]
B --> D[部署复杂架构]
A --> E[重用角色和社区资源]
E --> F[快速启动新项目]
B --> G[集成其他工具]
G --> H[提供缺失功能]
如果你对 Ansible 感兴趣,还可以了解以下相关书籍:
- 《Ansible 2 Cloud Automation Cookbook》:学习使用 Ansible Vault 保护机密信息,了解 Ansible 模块与云提供商的交互,构建云资源等。
- 《Security Automation with Ansible 2》:掌握使用 Ansible 进行安全自动化的方法,包括安全补丁管理、漏洞修复等。
最后,如果你对本文内容有任何想法,欢迎在购买平台留下评价,你的反馈对其他读者和作者都非常有价值。
Ansible:从基础到高级应用的全面指南
6. 不同场景下 Ansible 模块的使用
在不同的应用场景中,Ansible 提供了丰富的模块来满足各种需求。以下是一些常见场景及对应模块的使用说明:
- 部署 WordPress
- 获取处理器信息 :在 setup 模块执行期间收集的 ansible_processor_count 事实可用于告知 playbook 目标主机的处理器数量。
- 正则匹配与变更控制 :在 lineinfile 模块中使用 backref 可确保在正则表达式不匹配时不进行任何更改。
- 避免重复安装 :在 playbook 中构建逻辑检查 WordPress 是否已安装,这样下次运行 playbook 时可跳过下载和安装任务。
- 定义变量 :使用 set_fact 模块在 playbook 运行时定义变量。
- 指定执行目录 :向 shell 模块传递 chdir 参数可指定命令在特定目录中执行。
- 数据库访问限制 :将 MariaDB 绑定到 127.0.0.1 不能从外部访问。
- 目标多发行版
- 任务兼容性检查 :需要仔细检查 playbook 中的每个任务,确保其在不同操作系统上都能正常工作。
- 指定 Python 路径 :通过 ansible_python_interpreter 配置选项可指定 Ansible 使用的 Python 路径。
- 服务配置调整 :由于 Ubuntu 上 PHP - FPM 服务的配置文件路径和默认运行组不同,需要对相关任务进行调整。
- 包名差异 :不同操作系统的包名并非完全对应。
- 核心网络模块
- 模板循环 :在模板中使用 for 循环时,不一定要使用 with_items 。
- 多行变量分割 :使用 | 字符可将变量分割为多行。
- 设备信息传递 :使用 VyOS 模块时,无需在主机清单文件中传递设备详细信息。
以下是这些场景及对应关键信息的表格总结:
| 场景 | 关键信息 | 模块或参数 |
| ---- | ---- | ---- |
| 部署 WordPress | 获取处理器数量 | ansible_processor_count |
| 部署 WordPress | 正则匹配控制 | lineinfile 模块的 backref |
| 部署 WordPress | 避免重复安装逻辑 | 自定义逻辑 |
| 部署 WordPress | 定义变量 | set_fact 模块 |
| 部署 WordPress | 指定执行目录 | shell 模块的 chdir |
| 部署 WordPress | 数据库访问限制 | MariaDB 绑定设置 |
| 目标多发行版 | 任务兼容性 | 无 |
| 目标多发行版 | 指定 Python 路径 | ansible_python_interpreter |
| 目标多发行版 | 服务配置调整 | 无 |
| 目标多发行版 | 包名差异 | 无 |
| 核心网络模块 | 模板循环 | 无 |
| 核心网络模块 | 多行变量分割 | | 字符 |
| 核心网络模块 | 设备信息传递 | VyOS 模块 |
7. 云环境下 Ansible 的应用
在云环境中,Ansible 同样发挥着重要作用,以下是在不同云平台的应用说明:
- DigitalOcean
- 支持模块的 Python 包 :使用 digital_ocean 模块需要安装 dopy Python 模块。
- 敏感信息加密 :应始终对 DigitalOcean 个人访问令牌等敏感值进行加密。
- 查找 SSH 密钥 ID :使用 [?name=='Ansible'] 过滤器查找启动 Droplet 所需的 SSH 密钥 ID。
- 避免重复命名 :在 digital_ocean 任务中使用 unique_name 选项可确保每次 playbook 运行时不会启动多个同名 Droplet。
- 访问其他主机变量 :使用 hostvars 访问其他 Ansible 主机的变量,如 {{ hostvars['localhost'].droplet_ip }} 。
- 添加主机到组 : add_server 模块并非用于将 Droplet 添加到主机组。
- AWS
- 环境变量配置 :AWS 模块使用 AWS_ACCESS_KEY 和 AWS_SECRET_KEY 环境变量读取访问 ID 和密钥。
- VPC 创建 :每次运行 playbook 不一定会创建新的 VPC。
- 子网结果处理 :创建子网时不注册结果,以便在 playbook 后续运行中按角色分组子网 ID。
- 安全组规则定义 :在安全组规则中, cidr_ip 将端口锁定到特定 IP 地址, group_id 将端口锁定到指定组内的所有主机。
- 安全组添加顺序 :使用 group_id 定义规则时,安全组的添加顺序很重要。
- 高可用云部署
- 记录执行时间 :在 ansible - playbook 命令前添加 time 命令可记录命令执行时间。
- 自动扩展 :使用自动扩展功能时,无需手动启动 EC2 实例。
- 本地操作模块 :使用 local_action 模块可确保所有 AWS API 交互都在 Ansible 控制器上进行,而不是在目标主机上。
以下是云环境应用的 mermaid 流程图:
graph LR
A[DigitalOcean 应用] --> B[安装 dopy 模块]
A --> C[加密敏感信息]
A --> D[查找 SSH 密钥 ID]
A --> E[避免重复命名]
A --> F[访问其他主机变量]
G[AWS 应用] --> H[配置环境变量]
G --> I[控制 VPC 创建]
G --> J[处理子网结果]
G --> K[定义安全组规则]
G --> L[注意安全组顺序]
M[高可用云部署] --> N[记录执行时间]
M --> O[使用自动扩展]
M --> P[使用本地操作模块]
8. 其他场景下 Ansible 的应用
除了上述场景,Ansible 在 VMware 部署、Windows 系统管理、服务器加固以及安全扫描工具部署等方面也有广泛应用。
- VMware 部署
- Python 模块依赖 :在 Ansible 控制器上与 vSphere 交互需要安装 PyVmomi Python 模块。
- DNS 配置模块 : vmware_dns_config 不仅可设置 ESXi 主机的 DNS 解析器。
- 启动虚拟机模块 :可使用 vca_vapp 和 vmware_guest 模块启动虚拟机( vsphere_guest 模块已弃用)。
- 等待虚拟机就绪 :使用 vmware_guest_tools_wait 模块确保虚拟机完全可用后再进行后续操作。
- 电源状态调度 :可以使用 Ansible 调度虚拟机的电源状态更改。
- Windows 模块
- 跨平台模块 : setup 模块可在 Windows 和 Linux 主机上使用。
- 访问方式 :不能使用 SSH 访问 Windows 目标主机。
- 接口类型 :WinRM 使用 SOAP 接口而非交互式 shell。
- Python 模块依赖 :在 macOS 和 Linux 上与 WinRM 交互需要安装 pywinrm 模块。
- Chocolatey 安装 :不能在使用 win_chocolatey 模块前单独使用任务安装 Chocolatey。
- 服务器加固与安全扫描
- 多行变量处理 :在多行变量前添加 > 可使 Ansible 将其渲染为单行。
- 认证信息 :OpenSCAP 经过 NIST 认证。
- 任务失败处理 :告诉 Ansible 在扫描命令标记为失败时继续执行,因为任务在未达到 100% 分数时总是失败。
- 标签使用 :为某些角色使用标签,可通过 --tags 标志运行 playbook 的特定部分。
- 报告复制 :不使用 copy 命令将 HTML 报告从远程主机复制到 Ansible 控制器。
- 部署安全扫描工具
- 使用 Docker 的原因 :使用 Docker 部署 WPScan 和 OWASP ZAP 可简化部署过程,相比直接安装支持软件栈更便捷。
- pip 安装情况 :Vagrant 盒子默认未安装 pip。
- Python 模块依赖 :Ansible Docker 模块正常工作需要安装 docker 模块。
以下是这些场景的表格总结:
| 场景 | 关键信息 | 模块或工具 |
| ---- | ---- | ---- |
| VMware 部署 | Python 模块依赖 | PyVmomi |
| VMware 部署 | DNS 配置模块 | vmware_dns_config |
| VMware 部署 | 启动虚拟机模块 | vca_vapp 、 vmware_guest |
| VMware 部署 | 等待虚拟机就绪 | vmware_guest_tools_wait |
| VMware 部署 | 电源状态调度 | Ansible 调度功能 |
| Windows 模块 | 跨平台模块 | setup 模块 |
| Windows 模块 | 访问方式 | 非 SSH |
| Windows 模块 | 接口类型 | WinRM 的 SOAP 接口 |
| Windows 模块 | Python 模块依赖 | pywinrm 模块 |
| Windows 模块 | Chocolatey 安装 | 无 |
| 服务器加固与安全扫描 | 多行变量处理 | > 符号 |
| 服务器加固与安全扫描 | 认证信息 | OpenSCAP 的 NIST 认证 |
| 服务器加固与安全扫描 | 任务失败处理 | Ansible 任务配置 |
| 服务器加固与安全扫描 | 标签使用 | --tags 标志 |
| 服务器加固与安全扫描 | 报告复制 | 非 copy 命令 |
| 部署安全扫描工具 | 使用 Docker 的原因 | 简化部署 |
| 部署安全扫描工具 | pip 安装情况 | 未安装 |
| 部署安全扫描工具 | Python 模块依赖 | docker 模块 |
通过对不同场景下 Ansible 模块和工具的使用介绍,我们可以看到 Ansible 在各种环境中都能发挥强大的自动化功能,帮助我们提高工作效率,实现复杂的任务自动化。希望这些内容能为你在实际应用中提供有益的参考。
超级会员免费看
46

被折叠的 条评论
为什么被折叠?



