【Ansible】

文章目录


一、自动化运维工具 - Ansible

Ansible 是一款基于 Python 开发的无代理自动化运维工具,通过 SSH 协议实现对远程服务器的批量管理,无需在被管理节点安装任何客户端软件。它将复杂的运维操作抽象为简单的 "剧本 (Playbook)",支持配置管理、应用部署、任务编排等多种场景。

1、核心特点

  • 无代理架构:仅需控制节点安装 Ansible,被管理节点只需开启 SSH 服务
  • 声明式语法:使用 YAML 格式编写 Playbook,可读性强
  • 幂等性:重复执行相同操作不会产生副作用
  • 模块化设计:内置数千个功能模块,覆盖绝大多数运维场景
  • 可扩展性:支持自定义模块、插件和角色

2、架构组成

  • 控制节点:安装 Ansible 的服务器,执行管理命令和 Playbook
  • 被管理节点:需要被管理的远程服务器
  • Inventory:主机清单文件,定义被管理节点的分组和信息
  • Modules:执行具体操作的功能单元
  • Playbook:YAML 格式的任务编排文件

二、Ansible 的基本使用

  • 控制节点安装 Ansible(192.168.13.134)
  • 从 EPEL 10 开始,原来的完整ansible元包暂时未同步,目前官方仓库只提供ansible-core核心包(包含所有基础功能)
bash 复制代码
# 安装EPEL仓库(提供额外依赖)
dnf install -y epel-release

# 安装Ansible
dnf install -y ansible

# 验证安装
ansible --version
  • 配置 SSH 免密登录
bash 复制代码
# 为了实现无密码批量操作 需要将控制节点的公钥分发到所有被管理节点

# 生成SSH密钥对(一路回车即可)
ssh-keygen -t ed25519

# 分发公钥到所有节点
ssh-copy-id root@192.168.13.134
ssh-copy-id root@192.168.13.135
ssh-copy-id root@192.168.13.136

# 测试免密登录
ssh root@192.168.13.135 "hostname"
  • 配置主机清单 (Inventory)
bash 复制代码
vim etc/ansible/hosts
bash 复制代码
# 全局变量
[all:vars]
ansible_user=root
ansible_ssh_port=22

# 定义web服务器组
[webservers]
192.168.13.134
192.168.13.135
192.168.13.136

# 定义数据库服务器组(示例)
[dbservers]
# 192.168.13.137
  • 测试节点连通性
bash 复制代码
# 测试所有节点
ansible all -m ping

# 测试webservers组节点
ansible webservers -m ping

# 测试单个节点
ansible 192.168.13.135 -m ping

三、Ansible 常用模块说明

Ansible 模块是执行具体操作的基本单元,使用格式为:ansible <主机组> -m <模块名> -a "<参数>"

1、命令执行模块

2、软件包管理模块

bash 复制代码
# 安装软件包
ansible webservers -m dnf -a "name=nginx state=present"

# 卸载软件包
ansible webservers -m dnf -a "name=nginx state=absent"

# 更新所有软件包
ansible webservers -m dnf -a "name=* state=latest"

3、文件管理模块

bash 复制代码
# 创建目录
ansible webservers -m file -a "path=/data/www state=directory mode=0755 owner=nginx group=nginx"

# 复制本地文件到远程
ansible webservers -m copy -a "src=/root/index.html dest=/usr/share/nginx/html/index.html mode=0644"

# 获取远程文件内容
ansible webservers -m fetch -a "src=/etc/nginx/nginx.conf dest=/tmp/ flat=yes"

# 删除文件或目录
ansible webservers -m file -a "path=/tmp/test.txt state=absent"

4、服务管理模块

bash 复制代码
# 启动服务并设置开机自启
ansible webservers -m service -a "name=nginx state=started enabled=yes"

# 停止服务
ansible webservers -m service -a "name=nginx state=stopped"

# 重启服务
ansible webservers -m service -a "name=nginx state=restarted"

5、用户管理模块

bash 复制代码
# 创建用户
ansible webservers -m user -a "name=www shell=/bin/bash home=/home/www"

# 删除用户
ansible webservers -m user -a "name=www state=absent remove=yes"

四、Ansible 配置文件详解

Ansible 的主配置文件为/etc/ansible/ansible.cfg,包含了全局配置参数。以下是最常用的配置项。

从 Ansible 2.12(也就是 ansible-core 时代开始),官方做了一个重大改变:

不再默认提供包含所有配置项的完整文件,所有配置项都有内置默认值,空文件表示 "全部使用默认值"。所以查看ansible.cfg 是空的!

bash 复制代码
[defaults]
# 主机清单文件路径
inventory = /etc/ansible/hosts

# 默认远程用户
remote_user = root

# 并发连接数
forks = 10

# 关闭SSH主机密钥检查(生产环境建议开启)
host_key_checking = False

# 超时时间(秒)
timeout = 30

# 日志文件路径
log_path = /var/log/ansible.log

# 模块搜索路径
library = /usr/share/ansible/modules

[privilege_escalation]
# 是否开启权限提升
become = True

# 权限提升方式
become_method = sudo

# 权限提升用户
become_user = root

# 是否需要输入密码
become_ask_pass = False

[ssh_connection]
# SSH连接参数
ssh_args = -o ControlMaster=auto -o ControlPersist=60s

# 控制路径
control_path = /tmp/ansible-ssh-%%h-%%p-%%r

五、Playbook 介绍与应用

Playbook 是 Ansible 的核心,它使用 YAML 格式编写,将多个任务组合成一个完整的自动化流程。

  • Playbook 基本结构
bash 复制代码
---
 - name: Playbook名称
  hosts: 目标主机组
  become: yes  # 是否使用root权限执行
  vars:
    # 定义变量
    variable1: value1
    variable2: value2
  tasks:
    # 任务列表
    - name: 任务1名称
      模块名:
        参数1: 值1
        参数2: 值2

    - name: 任务2名称
      模块名:
        参数1: 值1
  • 变量使用
bash 复制代码
---
 - name: 变量使用示例
  hosts: webservers
  vars:
    nginx_port: 80
    nginx_docroot: /usr/share/nginx/html

  tasks:
    - name: 安装Nginx
      dnf:
        name: nginx
        state: present

    - name: 配置Nginx端口
      lineinfile:
        path: /etc/nginx/nginx.conf
        regexp: '^        listen       80;'
        line: '        listen       {{ nginx_port }};'
  • 条件判断
bash 复制代码
---
 - name: 条件判断示例
  hosts: webservers
  tasks:
    - name: 仅在Rocky Linux系统上安装Nginx
      dnf:
        name: nginx
        state: present
      when: ansible_os_family == "RedHat"
  • 执行 Playbook
bash 复制代码
# 执行Playbook
ansible-playbook playbook.yml

# 检查Playbook语法
ansible-playbook playbook.yml --syntax-check

# 模拟执行(不实际修改)
ansible-playbook playbook.yml --check

# 详细输出执行过程
ansible-playbook playbook.yml -v

六、使用 Ansible 批量安装部署 Nginx

以下是一个完整的 Playbook,实现批量安装、配置、启动 Nginx 并验证服务状态。

  • 创建项目目录结构
bash 复制代码
mkdir -p /etc/ansible/nginx-deploy/{files,templates}
cd /etc/ansible/nginx-deploy
  • 准备 Nginx 配置文件
bash 复制代码
vim files/index.html
bash 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Ansible部署的Nginx</title>
    <style>
        body { text-align: center; padding: 50px; font-family: Arial, sans-serif; }
        h1 { font-size: 3em; color: #2c3e50; }
        p { font-size: 1.5em; color: #34495e; }
    </style>
</head>
<body>
    <h1>恭喜!Nginx部署成功</h1>
    <p>服务器IP: {{ ansible_default_ipv4.address }}</p>
    <p>部署时间: {{ ansible_date_time.iso8601 }}</p>
</body>
</html>
  • 编写 Playbook
bash 复制代码
vim nginx_install.yml
bash 复制代码
---
- name: 批量安装部署Nginx服务
  hosts: webservers
  become: yes
  gather_facts: yes
  collections:
    - community.general

  vars:
    nginx_port: 80
    nginx_docroot: /usr/share/nginx/html
    nginx_user: nginx
    nginx_group: nginx

  tasks:
    - name: 安装EPEL仓库
      dnf:
        name: epel-release
        state: present

    - name: 安装Nginx
      dnf:
        name: nginx
        state: present

    - name: 创建Nginx文档根目录
      file:
        path: "{{ nginx_docroot }}"
        state: directory
        owner: "{{ nginx_user }}"
        group: "{{ nginx_group }}"
        mode: '0755'

    - name: 复制自定义首页文件
      template:
        src: files/index.html
        dest: "{{ nginx_docroot }}/index.html"
        owner: "{{ nginx_user }}"
        group: "{{ nginx_group }}"
        mode: '0644'

    - name: 配置Nginx监听端口
      lineinfile:
        path: /etc/nginx/nginx.conf
        regexp: '^        listen       80;'
        line: '        listen       {{ nginx_port }};'
        backup: yes

    - name: 开放防火墙80端口
      firewalld:
        port: "{{ nginx_port }}/tcp"
        permanent: yes
        immediate: yes
        state: enabled

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

    - name: 验证Nginx服务状态
      uri:
        url: "http://{{ ansible_default_ipv4.address }}:{{ nginx_port }}"
        status_code: 200
      register: nginx_status
      until: nginx_status.status == 200
      retries: 5
      delay: 2

    - name: 输出部署成功信息
      debug:
        msg: "Nginx服务在{{ ansible_default_ipv4.address }}部署成功,访问地址:http://{{ ansible_default_ipv4.address }}:{{ nginx_port }}"
  • 执行 Playbook
bash 复制代码
# 安装最常用的几个社区集合
ansible-galaxy collection install community.general ansible.posix community.docker

# 先检查语法
ansible-playbook nginx_install.yml --syntax-check

# 执行部署
ansible-playbook nginx_install.yml
相关推荐
木雷坞3 小时前
n8n Docker Compose 部署:Postgres、Webhook 和数据卷配置
运维·docker·容器
kebidaixu3 小时前
AD7606B 使用总结报告
linux
我的世界洛天依3 小时前
停服公告-柴框云
运维
程序猿阿伟3 小时前
《Opencloak代理的自动化验证指南》
java·运维·自动化
zhangfeng11333 小时前
htop命令根据实际Linux环境下的讲解,结合国家超算中心hpc
linux·运维·服务器
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
linux基础开发工具
linux
日取其半万世不竭3 小时前
Gitea SSH 克隆失败?域名、端口和 ROOT_URL 配置检查
运维·ssh·gitea
stolentime3 小时前
Mailwarm 2.0 邮件送达率提升效果实测
运维·网络·网易邮箱大师
小六学编程3 小时前
Linux 下 gcc / g++ 编译过程详解:从编译到链接
linux·c/c++