Skip to content

Ansible-基础

  1. 官方文档https://docs.ansible.com/
  2. Ansible Galaxy:共享 Playbook 和角色的社区平台
  3. GitHub 仓库https://github.com/ansible/ansible

Ansible 是一款功能强大的开源自动化运维工具,广泛应用于配置管理、应用部署、任务自动化和多节点管理等领域。下面我将从多个方面详细介绍 Ansible 的核心概念、特点、架构和使用方法。

Ansible 概述

Ansible 是由 Michael DeHaan 于 2012 年创建的自动化工具,名称来源于科幻小说《安德的游戏》中的即时通信工具。2015 年 10 月,Red Hat 以 1.5 亿美元收购了 Ansible。

Ansible 基于 Python 语言开发,使用 Paramiko 和 PyYAML 两个关键模块构建。它集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible 核心特点

  1. 无代理架构:Ansible 不需要在被控节点上安装任何代理软件,通过 SSH 协议与被控节点通信。这简化了部署,提高了安全性,并节省了系统资源。

  2. 基于模块工作:Ansible 本身没有批量部署的能力,真正执行任务的是各种模块。Ansible 提供了大量内置模块,也支持自定义模块。

  3. 幂等性:Ansible 的绝大多数模块都具备幂等性,即多次执行同一操作对系统的影响是一致的。例如停止一个已经停止的服务不会产生任何影响。

  4. 声明式语法:使用 YAML 格式的 Playbook 描述期望的系统状态,Ansible 会自动确保系统达到该状态。

  5. 易于学习和使用:Ansible 的语法简单直观,学习曲线平缓。

Ansible 架构与工作原理

Ansible 的核心组件

  1. 控制节点:运行 Ansible 的机器,负责发送任务指令。
  2. 被管理节点:需要被配置或管理的目标机器。
  3. 主机清单(Inventory):记录所有被管理节点及其分组信息。
  4. 模块(Modules):执行具体操作的核心组件。
  5. Playbook:YAML 格式的任务定义文件。
  6. 插件(Plugins):扩展 Ansible 功能的组件。

Ansible 的工作流程

  1. 解析主机清单确定目标节点
  2. 通过 SSH 连接被管理节点
  3. 根据 Playbook 执行相应模块和任务
  4. 收集并返回执行结果

Ansible-安装与配置

安装方法

bash
# 在 CentOS/RHEL 上安装
yum --y install epel-release
# openEuler 直接安装
yum -y install ansible

# 在 Ubuntu/Debian 上安装
apt update
apt install software-properties-common
apt-add-repository --yes --update ppa:ansible/ansible
apt install ansible

# 通过 pip 安装
pip3 install ansible

# 查看版本
ansible --version

第一次ask确认取消

Ansible第一次通信的时候会有客户端key确认,可以有如下两种方式避免

修改ansible.cfg(推荐)

bash
vi /etc/ansible/ansible.cfg
# 其实就是把#去掉
# host_key_checking = False

修改ssh_config

bash
vi /etc/ssh/ssh_config
# 将ask改成no
StrictHostKeyChecking no

# 重启ssh服务
systemctl restart sshd

配置 SSH 免密登录

为了便于管理,建议配置控制节点到被控节点的 SSH 免密登录:

bash
# 生成密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rea -C "免密登录"

# 分发公钥
ssh-copy-id root@被控节点IP

主机清单配置

主机清单文件通常位于 /etc/ansible/hosts,修改ansible.cfg中的inventory参数指定自定义的主机清单位置。

配置文件优先级

Ansible会按照以下顺序查找主机清单文件:

  1. 命令行通过-i参数指定的文件
  2. ANSIBLE_CONFIG环境变量指定的配置文件中的inventory设置
  3. 当前目录下的ansible.cfg中定义的inventory
  4. 用户家目录下的.ansible.cfg中定义的inventory
  5. /etc/ansible/ansible.cfg中定义的inventory
  6. 默认的/etc/ansible/hosts

主机与组定义方法

基本主机定义

ini
# 单台主机定义
192.168.1.1
host1.example.com

主机组定义

使用中括号[]定义组名,组内主机可以按行列出

ini
[webservers]
web1.example.com
web2.example.com
192.168.1.10

[dbservers]
db1.example.com
db2.example.com

主机范围定义

对于连续编号的主机,可以使用范围表示法简化配置

ini
[webservers]
web[01:50].example.com  # web01到web50

[dbservers]
db-[a:f].example.com    # db-a到db-f

嵌套组定义

使用:children后缀定义组嵌套关系

ini
[production:children]
webservers
dbservers

[webservers]
web1.example.com

[dbservers]
db1.example.com

这表示production组包含webserversdbservers两个子组

YAML格式定义

主机清单也支持YAML格式,特别适合复杂嵌套结构

yaml
all:
  hosts:
    192.168.1.60:
    192.168.1.61:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
    dbservers:
      hosts:
        db1.example.com:
        db2.example.com:

连接参数配置

主机连接参数

可以为每台主机单独指定连接参数

ini
host1 ansible_host=192.168.1.10 ansible_port=2222 ansible_user=admin
host2 ansible_host=192.168.1.11 ansible_user=root ansible_password=123456

常用连接参数包括:

  • ansible_host:实际连接的主机地址
  • ansible_port:SSH端口,默认22
  • ansible_user:SSH用户名
  • ansible_password:SSH密码(不推荐明文存储)
  • ansible_ssh_private_key_file:SSH私钥路径
  • ansible_connection:连接类型(ssh, paramiko, local等)

组连接参数

使用[groupname:vars]为整个组设置变量

ini
[webservers]
web1.example.com
web2.example.com

[webservers:vars]
ansible_user=admin
ansible_port=2222
ansible_ssh_pass=password123
ansible_python_interpreter=/usr/bin/python3		# 指定Python解释器

变量定义

主机变量

直接在主机后定义变量

ini
host1 ansible_host=192.168.1.10 http_port=8080

组变量

使用[groupname:vars]定义组变量

ini
[webservers]
web1.example.com
web2.example.com

[webservers:vars]
nginx_version=1.18.0
max_connections=1000

变量文件

可以将变量存储在单独的文件中,放在以下目录

  • host_vars/:主机变量,文件名与主机名相同
  • group_vars/:组变量,文件名与组名相同

变量文件支持YAML或JSON格式

ini
# group_vars/webservers
nginx_version: 1.18.0
max_connections: 1000

主机选择模式

基本选择

bash
ansible all -m ping           # 选择所有主机
ansible webservers -m ping    # 选择webservers组
ansible host1 -m ping         # 选择单个主机

模式匹配

bash
ansible 'web*' -m ping        # 选择名称以web开头的主机
ansible '192.168.1.*' -m ping # 选择192.168.1网段的主机

逻辑运算

bash
ansible 'webservers:dbservers' -m ping      # webservers或dbservers
ansible 'webservers:&production' -m ping    # 同时在webservers和production组的主机
ansible 'webservers:!production' -m ping   # 在webservers但不在production组的主机

正则表达式

bash
ansible '~(web|db).*\.example\.com' -m ping  # 匹配web或db开头,以.example.com结尾的主机

特殊组

Ansible有两个内置的特殊组

  • all:包含清单中的所有主机
  • ungrouped:包含不属于任何自定义组的主机