找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2207

积分

0

好友

295

主题
发表于 1 小时前 | 查看: 1| 回复: 0

还在手动登录一台台服务器进行重复操作吗?Ansible作为开源自动化领域的“扛把子”,能够帮助你实现高效的批量运维。想象一下,为100台服务器部署应用,手动操作可能需要数小时,而Ansible或许只需要一条命令。它究竟有何魅力?

为什么选择 Ansible?

Ansible的核心优势在于其简洁与强大:

  • 无代理架构:无需在被管理主机上安装任何客户端软件,降低运维复杂度。
  • SSH通信:直接通过SSH协议连接并管理远程主机。
  • YAML语法:采用易于阅读和编写的YAML语言来定义自动化任务(Playbook)。
  • 幂等性:确保任务重复执行的结果一致,避免意外状态,安全可靠。

安装 Ansible

以下以CentOS/RHEL系统为例,介绍控制节点的安装步骤。

第1步:安装EPEL源
对于CentOS/RHEL系统,需要先安装EPEL扩展源。

yum -y install epel-release

第2步:安装Ansible
通过yum直接安装Ansible。

yum -y install ansible

# 查看版本
ansible --version
# 输出:ansible 2.9.27

第3步:配置SSH免密登录
这是实现自动化管理的关键前提。控制节点需要能够免密登录所有被管理主机。

# 在控制节点执行,生成SSH密钥对(一直按回车使用默认值即可)
ssh-keygen -t rsa

# 将公钥复制到所有被管理主机
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.11
ssh-copy-id root@192.168.1.12

基础配置

安装完成后,需要进行一些基础配置。

Ansible配置文件
主要的配置文件有两个:

  • /etc/ansible/ansible.cfg:主配置文件。
  • /etc/ansible/hosts:主机清单文件,用于定义你要管理哪些服务器。

配置主机清单
编辑 /etc/ansible/hosts 文件,将你的服务器IP或域名按分组进行定义。

# /etc/ansible/hosts
[web_servers]
192.168.1.10
192.168.1.11
192.168.1.12

[db_servers]
192.168.1.20
192.168.1.21

[all_servers:children]
web_servers
db_servers

修改 ansible.cfg(可选)
根据需求调整主配置文件,例如关闭首次连接时的SSH主机密钥检查。

[defaults]
# 关闭主机密钥检查(避免首次连接手动确认)
host_key_checking = False
# 开启日志记录
log_path = /var/log/ansible.log
# 设置并发数
forks = 100
# 库存文件位置
inventory = /etc/ansible/hosts

测试连通性
配置完成后,使用 ping 模块测试与所有主机的连接是否正常。

# 测试所有主机
ansible all -m ping
# 测试指定分组
ansible web_servers -m ping

如果返回 pong,则表示Ansible控制节点可以成功连接到目标主机。

Ansible 常用模块详解

模块是Ansible执行任务的核心单元。以下介绍10个最常用的模块。

1. ping 模块 — 主机连通性检查

最基础的模块,用于检查主机是否在线且Ansible可连接。

# 单台主机
ansible 192.168.1.10 -m ping
# 分组主机
ansible web_servers -m ping
# 所有主机
ansible all -m ping

2. command / shell 模块 — 执行命令

  • command:执行简单命令,不支持管道符、重定向等Shell特性。
    # 查看系统负载
    ansible web_servers -m command -a "uptime"
    # 查看内存使用情况
    ansible all -m command -a "free -h"
  • shell:在远程主机的Shell环境下执行命令,支持管道、重定向等所有Shell特性。
    # 使用管道过滤磁盘信息
    ansible all -m shell -a "df -h | grep /dev/sda"
    # 写入文件
    ansible all -m shell -a "echo 'hello ansible' > /tmp/test.txt"

3. yum / apt 模块 — 软件包管理

  • yum模块:用于CentOS/RHEL等基于RPM的系统。

    - name: 安装Nginx
      yum:
        name: nginx
        state: present
    
    - name: 安装多个软件包
      yum:
        name:
          - nginx
          - php-fpm
          - mariadb
        state: present
    
    - name: 确保软件包是最新版本
      yum:
        name: nginx
        state: latest
    
    - name: 卸载软件包
      yum:
        name: nginx
        state: absent
  • apt模块:用于Debian/Ubuntu系统。
    - name: 安装Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

4. copy 模块 — 文件复制

将本地文件或目录复制到远程主机。

- name: 复制配置文件到远程主机
  copy:
    src: /local/config/nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'

- name: 复制整个目录
  copy:
    src: /local/app/
    dest: /opt/app/
    owner: app
    group: app
    mode: '0755'

5. template 模块 — 模板渲染

基于Jinja2模板引擎,将包含变量的模板文件渲染后传输到远程主机,常用于配置文件的动态生成。

- name: 渲染Nginx配置文件
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'

模板示例 (nginx.conf.j2)

server {
    listen {{ port }};
    server_name {{ domain }};
    location / {
        root {{ web_root }};
    }
}

6. file 模块 — 文件/目录管理

用于创建、删除文件或目录,以及管理符号链接和权限。

- name: 创建目录
  file:
    path: /opt/app
    state: directory
    mode: '0755'

- name: 创建空文件
  file:
    path: /opt/app/config.txt
    state: touch
    mode: '0644'

- name: 创建符号链接
  file:
    src: /opt/app/current
    dest: /opt/app/latest
    state: link

- name: 删除文件或目录
  file:
    path: /opt/app
    state: absent

7. user 模块 — 用户管理

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

- name: 创建普通用户并加入sudo组
  user:
    name: deploy
    state: present
    shell: /bin/bash
    groups: sudo
    append: yes

- name: 创建系统用户(如用于运行服务)
  user:
    name: redis
    system: yes
    shell: /sbin/nologin
    create_home: no

- name: 删除用户并移除其主目录
  user:
    name: deploy
    state: absent
    remove: yes

8. group 模块 — 用户组管理

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

- name: 创建用户组
  group:
    name: developers
    state: present

- name: 创建系统组
  group:
    name: appuser
    system: yes

9. service 模块 — 服务管理

用于管理系统的服务(启动、停止、重启、设置开机自启等)。

- name: 启动Nginx服务并设为开机自启
  service:
    name: nginx
    state: started
    enabled: yes

- name: 停止PHP-FPM服务
  service:
    name: php-fpm
    state: stopped

- name: 重启Nginx服务
  service:
    name: nginx
    state: restarted

10. setup 模块 — 收集系统信息

收集远程主机的各种系统信息(称为“Facts”),这些信息可以在Playbook中作为变量使用。

# 收集所有主机信息(信息量较大)
ansible all -m setup
# 收集信息并保存到指定目录的文件中
ansible all -m setup --tree /tmp/facts/
# 过滤收集特定的信息(如内存相关)
ansible all -m setup -a "filter=ansible_*_mb"

常用的事实变量示例:

  • ansible_facts[‘hostname’] — 主机名
  • ansible_facts[‘default_ipv4’][‘address’] — IPv4地址
  • ansible_facts[‘memory_total_mb’] — 总内存大小(MB)
  • ansible_facts[‘distribution’] — 操作系统发行版

Playbook 实战案例

Playbook是将多个任务组织起来的YAML文件,是实现复杂自动化的核心。

案例:一键部署LAMP环境
创建一个名为 lamp.yml 的Playbook。

---
- name: 部署 LAMP 环境
  hosts: web_servers
  become: yes
  tasks:
    - name: 安装 Apache
      yum:
        name: httpd
        state: present

    - name: 安装 MySQL (MariaDB)
      yum:
        name: mariadb-server
        state: present

    - name: 安装 PHP
      yum:
        name: php,php-mysql
        state: present

    - name: 启动并启用服务
      service:
        name: "{{ item }}"
        state: started
        enabled: yes
      loop:
        - httpd
        - mariadb

    - name: 复制PHP配置文件
      copy:
        src: php.ini
        dest: /etc/php.ini

执行该Playbook:

ansible-playbook lamp.yml

模块使用速查表

模块 功能 典型场景
ping 检查连通性 批量检测主机网络可达性
command/shell 执行命令 执行简单的Shell命令或脚本
yum/apt 包管理 安装、更新、卸载软件包
copy 文件复制 分发静态配置文件、应用包
template 模板渲染 分发需要根据变量动态生成的配置文件
file 文件操作 创建、删除、修改文件/目录属性
user 用户管理 创建、删除系统用户,管理用户属性
group 组管理 创建、删除用户组
service 服务管理 启动、停止、重启系统服务
setup 信息收集 收集主机系统信息用于决策或配置

总结

通过本文,你已经掌握了Ansible从安装、配置到核心模块使用的全流程。简单回顾一下关键步骤:

  1. 安装:在控制节点通过包管理器(如yum)安装Ansible。
  2. 配置:完成SSH免密登录,并编辑主机清单文件定义管理目标。
  3. 测试:使用 ansible all -m ping 验证基础连通性。
  4. 使用模块:灵活运用ping、yum、copy、service等模块执行具体任务。
  5. 编写Playbook:将任务模块组织成YAML文件,实现可重复、复杂的自动化流程。

Ansible就像一把运维的“瑞士军刀”,熟练掌握它,能让你从繁琐的重复操作中解放出来,真正实现高效、可靠的自动化运维。如果你想了解更多运维工具与实践,欢迎在云栈社区与其他开发者交流探讨。




上一篇:OpenDataLoader:这款开源PDF解析器,以93%的表格提取精度登上基准测试榜首
下一篇:火山引擎ArkClaw上手指南:开箱、飞书集成与技能扩展实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-21 05:45 , Processed in 0.634004 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表