Ansible 详细笔记

Ansible 详细笔记

一、Ansible 基础概述

1.1 定义与定位

Ansible 是由 Red Hat 主导开发的开源自动化运维工具,基于 Python 语言实现,专注于简化 IT 基础设施的配置管理、应用部署、任务编排等操作。它采用无代理架构,通过 SSH 协议与被控节点通信,避免了传统代理模式下的部署和维护成本。

1.2 核心优势

  • 轻量易用:无需在被控节点安装客户端,仅需控制节点部署 Ansible 即可。

  • 幂等性保障:相同操作多次执行结果一致,避免重复操作导致的系统异常。

  • 模块化扩展:内置数千个模块,覆盖系统管理、云服务、网络设备等场景,同时支持自定义模块。

  • 声明式配置:通过 YAML 格式的 Playbook 描述目标状态,而非具体操作步骤,降低学习和维护成本。

  • 跨平台兼容:支持 Linux、Windows、macOS 等操作系统,以及 AWS、Azure、GCP 等云平台。

二、核心组件深度解析

2.1 控制节点(Control Node)

  • 作用:运行 Ansible 命令和 Playbook,负责发起和管理自动化任务。

  • 要求:需安装 Python 3.8+ 及 Ansible 软件包,可通过 SSH 连接被控节点。

  • 注意:一个环境中可部署多个控制节点,但需确保 Inventory 和 Playbook 同步。

2.2 被控节点(Managed Node)

  • 作用:被 Ansible 管理的目标设备,包括服务器、网络设备、虚拟机等。

  • 要求

  • 开启 SSH 服务(Linux/Unix)或 WinRM 服务(Windows)。

  • 安装 Python 2.7 或 3.5+(部分模块需特定版本支持)。

  • 控制节点与被控节点之间网络可达,且控制节点拥有登录权限(密码或密钥认证)。

2.3 Inventory(主机清单)

  • 定义:用于存储被控节点的信息,支持静态文件和动态生成两种方式。

  • 静态 Inventory 格式

# 简单主机列表
# 直接列出单个主机,Ansible将使用默认SSH端口(22)连接
webserver1.example.com# 带自定义端口的主机表示方式
# 格式:主机名:端口号,这里指定使用2222端口进行SSH连接
webserver2.example.com:2222  # 自定义SSH端口# 主机组定义
# [组名] 表示定义一个主机组
[webservers]
# 将以下主机加入webservers组
webserver1.example.com
webserver2.example.com[dbservers]
# 将以下主机加入dbservers组
dbserver1.example.com
dbserver2.example.com# 嵌套组
# :children 表示这是一个组的组(组包含其他组)
[all_servers:children]
# 将webservers组加入all_servers组
webservers
# 将dbservers组加入all_servers组
# 此时all_servers组包含了webservers和dbservers组中的所有主机
dbservers# 变量定义
# :vars 表示为该组定义变量,这些变量会应用到组内所有主机
[webservers:vars]
# 定义HTTP端口变量,可在Playbook中通过{{ http_port }}引用
http_port=80
# 定义最大请求数变量
max_requests=1000
  • 动态 Inventory:通过脚本(如 Python、Shell)从云平台(AWS EC2、VMware)或 CMDB 中动态获取主机信息,适合大规模动态环境。

2.4 Module(模块)

  • 分类

  • 核心模块(Core Modules):由 Ansible 官方维护,覆盖常见操作(如 copy、service、yum)。

  • 扩展模块(Extras Modules):由社区贡献,需通过 ansible-galaxy 安装。

  • 自定义模块:通过 Python 或其他语言编写,满足特定业务需求。

  • 执行逻辑:模块以独立脚本形式在被控节点上临时运行,执行完成后自动清理,无需常驻内存。

2.5 Playbook(剧本)

  • 结构:由一个或多个 Play 组成,每个 Play 包含目标主机、变量、任务等信息。

  • YAML 语法规则

  • 缩进使用空格(推荐 2 个空格),不支持 Tab。

  • 列表项以 - 开头。

  • 键值对用 key: value 表示,值为字符串时可加引号(特殊字符需加引号)。

  • 示例

- name: 部署 Nginx 服务hosts: webserversbecome: yes  # 切换为root权限vars:nginx_version: 1.21.6tasks:- name: 安装 Nginxyum:name: "nginx-{{ nginx_version }}"state: present- name: 配置 Nginx 服务template:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confnotify: 重启 Nginx 服务  # 配置文件变化时触发Handlerhandlers:- name: 重启 Nginx 服务service:name: nginxstate: restarted

2.6 Role(角色)

  • 作用:将 Playbook、变量、模板、文件等按功能模块化,实现代码复用和标准化。

  • 目录结构

roles/
└── nginx/├── defaults/        # 默认变量(优先级低)│   └── main.yml├── vars/           # 角色变量(优先级高)│   └── main.yml├── tasks/          # 任务列表│   └── main.yml├── handlers/       # 处理器│   └── main.yml├── templates/      # 模板文件(.j2后缀)│   └── nginx.conf.j2└── files/          # 静态文件└── index.html
  • 使用方式:在 Playbook 中通过 roles 关键字引用角色。

三、工作流程详解

  1. 准备阶段
  • 控制节点编写 Inventory,定义被控节点信息。

  • 编写 Playbook 或准备临时命令,明确需要执行的任务。

  1. 执行阶段
  • 控制节点解析 Playbook 或命令,确定目标主机和模块。

  • 通过 SSH/WinRM 连接被控节点,传输模块和参数。

  • 被控节点执行模块,将结果(成功 / 失败、输出信息)返回给控制节点。

  1. 结果处理
  • 控制节点汇总所有被控节点的执行结果,以人类可读的格式展示。

  • 若配置了 handlers 且任务触发了变化,执行相应的 handler 操作(如重启服务)。

四、安装与配置

4.1 控制节点安装(CentOS 7)

# 安装 EPEL 源
yum install -y epel-release# 安装 Ansible
yum install -y ansible# 验证安装
ansible --version
# 输出示例:
# ansible [core 2.14.3]
#   config file = /etc/ansible/ansible.cfg
#   configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
#   ansible python module location = /usr/lib/python3.6/site-packages/ansible
#   ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
#   executable location = /usr/bin/ansible
#   python version = 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
#   jinja version = 3.1.2
#   libyaml = True

4.2 被控节点配置

  • Linux 节点
# 安装 Python
yum install -y python3# 配置 SSH 免密登录(控制节点操作)
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id root@被控节点IP
  • Windows 节点

  • 启用 WinRM 服务,配置 PowerShell 远程管理。

  • 控制节点安装 pywinrm 模块:pip install pywinrm。

4.3 核心配置文件(ansible.cfg)

主要配置项:

[defaults]
inventory = /etc/ansible/hosts  # 默认Inventory路径
remote_user = root              # 默认远程用户名
become = yes                    # 自动切换为root权限
become_method = sudo            # 提权方式
become_user = root              # 目标用户
timeout = 30                    # SSH连接超时时间(秒)
host_key_checking = False       # 禁用主机密钥检查(测试环境用)

五、常用模块实战

5.1 文件操作模块

  • copy:复制文件到被控节点
ansible webservers -m copy -a "src=/local/path/file dest=/remote/path/file mode=0644 owner=root group=root"
  • file:管理文件 / 目录属性
# 创建目录
ansible webservers -m file -a "path=/data/logs state=directory mode=0755"
# 删除文件
ansible webservers -m file -a "path=/tmp/test.txt state=absent"
  • template:基于 Jinja2 模板生成文件
# Playbook中使用
- name: 生成Nginx配置文件template:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confmode: 0644

5.2 包管理模块

  • yum(RedHat 系)
# 安装指定版本
ansible webservers -m yum -a "name=httpd-2.4.6 state=present"
# 卸载软件
ansible webservers -m yum -a "name=httpd state=absent"
# 更新所有包
ansible webservers -m yum -a "name=* state=latest"
  • apt(Debian 系)
ansible dbservers -m apt -a "name=mysql-server state=installed update_cache=yes"

5.3 服务管理模块

  • service
# 启动服务并设置开机自启
ansible webservers -m service -a "name=httpd state=started enabled=yes"
# 重启服务
ansible webservers -m service -a "name=httpd state=restarted"

5.4 命令执行模块

  • command:不支持管道和环境变量
ansible all -m command -a "ls /home"
  • shell:支持 bash 特性
ansible all -m shell -a "ps aux | grep nginx"
  • script:在被控节点执行本地脚本
ansible webservers -m script -a "/local/path/script.sh arg1 arg2"

六、Playbook 高级特性

6.1 变量管理

  • 变量来源

  • Inventory 变量(主机 / 组变量)

  • Playbook 中 vars 关键字定义

  • 命令行 -e 参数传递(优先级最高)

  • 角色变量(defaults/vars)

  • 变量引用:使用 {{ variable_name }} 语法,如 {{ http_port }}。

6.2 条件判断(when)

tasks:- name: 仅在CentOS系统安装httpdyum:name: httpdstate: presentwhen: ansible_os_family == "RedHat"

6.3 循环(loop)

tasks:- name: 创建多个目录file:path: "{{ item }}"state: directorymode: 0755loop:- /data/logs- /data/backup- /data/tmp

6.4 处理器(handlers)

用于在任务发生变化时执行操作(如配置文件更新后重启服务):

tasks:- name: 更新Nginx配置template:src: nginx.conf.j2dest: /etc/nginx/nginx.confnotify: 重启Nginx  # 触发handlerhandlers:- name: 重启Nginxservice:name: nginxstate: restarted

七、常用命令详解

7.1 ansible

  • 功能:执行临时命令,适合快速测试。

  • 常用参数

  • -i:指定 Inventory 文件路径。

  • -m:指定模块名称。

  • -a:模块参数。

  • -u:远程用户名。

  • -b:提权执行(sudo)。

  • 示例

ansible webservers -i ./my_hosts -u admin -b -m yum -a "name=httpd state=present"

7.2 ansible-playbook

  • 功能:执行 Playbook。

  • 常用参数

  • -C/–check:模拟执行,不实际修改系统。

  • -v:显示详细输出(-vvv 最详细)。

  • -e:传递额外变量。

  • -t:只执行指定标签的任务。

  • 示例

ansible-playbook -C -e "env=test" deploy.yml

7.3 ansible-galaxy

  • 功能:管理 Ansible 角色和集合。

  • 常用命令

# 安装角色
ansible-galaxy install geerlingguy.nginx
# 列出已安装角色
ansible-galaxy list
# 创建新角色
ansible-galaxy init myrole

八、高级应用场景

8.1 滚动更新(Rolling Updates)

通过 serial 关键字控制每次更新的主机数量,实现零 downtime 部署:

- name: 滚动更新Web服务hosts: webserversserial: 2  # 每次更新2台主机tasks:- name: 停止服务service:name: httpdstate: stopped- name: 部署新版本copy:src: ./new_version/dest: /var/www/html/- name: 启动服务service:name: httpdstate: started

8.2 集成云服务

以 AWS 为例,使用 amazon.aws 集合管理 EC2 实例:

- name: 创建EC2实例hosts: localhostgather_facts: nocollections:- amazon.awstasks:- name: 启动实例ec2:aws_access_key: "{{ aws_access_key }}"aws_secret_key: "{{ aws_secret_key }}"region: us-east-1instance_type: t2.microimage: ami-0c55b159cbfafe1f0count: 1key_name: my_keyvpc_subnet_id: subnet-123456assign_public_ip: yesstate: running

九、最佳实践与注意事项

  1. 目录结构标准化
project/
├── inventory/          # 主机清单(按环境分文件)
│   ├── dev.yml
│   └── prod.yml
├── playbooks/          # 主Playbook
│   ├── deploy.yml
│   └── backup.yml
├── roles/              # 角色目录
│   ├── web/
│   └── db/
├── group_vars/         # 组变量
│   └── webservers.yml
├── host_vars/          # 主机变量
│   └── webserver1.yml
└── ansible.cfg         # 项目级配置
  1. 变量加密:使用 ansible-vault 加密敏感信息(如密码、API 密钥):
# 创建加密文件
ansible-vault create secrets.yml
# 编辑加密文件
ansible-vault edit secrets.yml
# 执行Playbook时解密
ansible-playbook --ask-vault-pass deploy.yml
  1. 版本控制:将 Playbook、角色等代码纳入 Git 管理,实现变更追踪和协作。

  2. 测试策略

  • 使用 --check 模拟执行,验证逻辑正确性。

  • 在测试环境完全验证后再部署到生产环境。

  • 采用 Molecule 等工具进行角色单元测试。

  1. 性能优化
  • 启用 SSH 长连接(ControlPersist)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93109.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 后端】Spring Boot 集成 JPA 全攻略

Spring Boot 集成 JPA 全攻略 一、前言 在 Java Web 开发中,数据库访问是绕不开的话题。 传统方式使用 JDBC 编写 SQL,维护困难、可读性差。后来有了 MyBatis 这种半自动 ORM 框架,再到 JPA(Java Persistence API)这…

pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)

写在前面:有些地方和视频里不一样的是因为官方文档更新了,一些参数用法不一样也很正常,包括我现在的也是我这个时间节点最新的,谁知道过段时间会不会更新呢 建议大家不要一味看视频/博客,多看看官方文档才是正道&#…

RocketMQ 4.9.3源码解读-NameServer组件启动流程分析

作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流 【金山文档 | WPS云文档】 namesrv 启动流程 相关重要类介绍说明…

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准 前言 在电子系统开发领域,C 语言作为底层开发的核心语言,其代码质量直接关系到系统的稳定性、可维护性和扩展性。良好的编码规范不仅是团队协作的基础,更是降低生命周期成…

纯半精度模型和全精度模型的耗时分别为248微秒和1400微秒。混合精度模型371微秒比原始模型快大约四倍!

不过有一点需要注意:在上下文管理器内部生成的任何输出,必然会采用该上下文管理器的数据类型。因此,之后我们必须将这些输出转换回FP32(例如,使用float()函数)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…

一款开源的远程桌面软件,旨在为用户提供流畅的游戏体验,支持 2K 分辨率、60 FPS,延迟仅为 40ms。

软件介绍 CloudPlayPlus(云玩加)是一款令人惊艳的开源远程桌面、串流软件,云玩加由个人开发者开发者,具有四大特征:开源、免费、低延迟、安全。 软件使用 客户端支持多个平台,包括 Windows、Mac OS、安卓…

MySql——binlog和redolog的区别

目录一、binlog和redolog的区别一、binlog和redolog的区别 binlog和redolog都是存储修改的新数据,是否保留binlog和redolog中的一个即可。 binlog属于整个mysql,是所有引擎共用的,不是只属于innoDB引擎。而redolog属于InnoDB存储引擎。binlo…

软件著作权产生与登记关键点

知识讲解一、 软件著作权的核心特征与权利内容自动产生原则: 这是软件著作权最核心、最重要的特征。产生时间: 软件著作权自软件开发完成之日起自动产生。法律依据: 《中华人民共和国著作权法》第二条及《计算机软件保护条例》第五条明确规定…

什么是主成分分析(PCA)和数据降维

主成分分析(PCA)和数据降维是机器学习和统计学中处理高维数据的核心工具。下面用清晰的结构解释其概念、原理和应用: 一、数据降维(Dimensionality Reduction) 1. 是什么? 目标:将高维数据&…

图论(4)单源赋权最短路径算法实现(BFS实现)

目录 1. 什么是赋权最短路径 2. 赋权最短路径中的关键概念 3. Dijkstra 算法的基本思想 4. Dijkstra 算法实现(Java) 1. 什么是赋权最短路径 在图论中,最短路径问题是指在图中寻找两点之间路径总权重最小的路径问题。如果图的每条边都带…

【Lua】题目小练9

题目:实现一个简单的“银行账户”类要求:使用 元表 模拟面向对象。支持以下功能:Account:new(owner, balance) 创建账户(初始余额可选,默认为 0)。deposit(amount) 存款(不能为负数)…

【二分图】染色问题

核心思想&#xff1a;为每一个未染色的&#xff0c;对它自己和它的邻居进行染色&#xff0c;看是否会出现冲突时间复杂度O&#xff08;nm&#xff09;#include<bits/stdc.h> using namespace std; using lllong long; const int N200010; int n,m; vector<int>edge…

报数游戏(我将每文更新tips)

今日tips&#xff1a;报数游戏题目描述报数游戏的游戏规则如下&#xff1a;对一个区间内的整数进行报数&#xff0c;若遇到的数字是质数或个位数是 1&#xff0c;则不报数&#xff0c;输出 pass。 给定开始游戏的第一个整数 a&#xff0c;及结束游戏时的最后一个整数 b&#xf…

大模型开发 - 基于Spring AI 借助MCP Client 通过STDIO和SSE协议调用MCP Server (上)

文章目录概述MCP协议&#xff1a;为AI应用连接外部世界的桥梁MCP Server&#xff1a;上下文与能力的提供者基于Spring AI 1.0.0的开发之路1. 使用Spring AI构建MCP客户端2. 使用Spring AI构建MCP服务器Mcp Client 实战整体架构概览技术栈Codepom配置mcp servers(sse&stdio)…

分析三个文件--启动文件、链接文件、map文件

目录 启动文件 链接文件 部分map文件内容 FLASH物理地址(0x08000000开始)的映射关系 0x08000000 之前地址空间 启动文件 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40_41xxx.s ;* Author…

从零开始学Python之数据结构(字符串以及数字)

一、字符串 1.1 怎么定义字符串 字符串是Python最常用的数据结构之一。在 Python 里是用于处理文本数据的&#xff0c;比如存储姓名、文章内容等文本信息 。 定义方式&#xff1a; 单引号&#xff1a;用单引号 包裹文本&#xff0c;如 name Alice &#xff0c;单引号内可…

Navicat 全量增量数据库迁移

在使用 Navicat 进行数据库迁移时&#xff0c;除了常见的“全量迁移”&#xff08;一次性迁移所有数据和结构&#xff09;&#xff0c;有时还需要支持 增量迁移&#xff08;只迁移新增或修改的数据&#xff09;。下面我将详细讲解如何通过 Navicat 实现&#xff1a;&#x1f50…

css初学者第五天

<1>css的三大特性1.1 层叠性相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一份冲突的样式。层叠式主要解决样式冲突的问题。层叠性原则&#xff1a;-样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近…

从神经网络语言模型(NNLM)到Word2Vec:自然语言处理中的词向量学习

语言模型 语言(人说的话)模型(完成某个任务) 任务: 概率评估任务:在两句话中&#xff0c;判断哪句话出现的概率大(哪句话在自然语言中更合理)生成任务:预测词语,我明天要____ 统计语言模型 用统计的方法解决上述的两个任务 核心思想 给定一个词序列&#xff0c;计算该序列出现的…

PID学习笔记5-双环PID

在学习江协科技PID课程时&#xff0c;做一些笔记&#xff0c;对应视频3-1&#xff0c;对应代码&#xff1a;1313-双环PID定速定位置控制-代码封装main.c:#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLE…