首页 资源列表 文章列表

自动化运维部署学习日记--Ansible的安装

Ansible 是一款开源、基于 Python 的自动化运维与配置管理工具,核心目标是‌简单、安全、无代理(Agentless)‌,通过 SSH 协议在控制节点对被管节点执行批量任务,无需在被控端安装客户端。

一、Ansible的安装

      我系统是Ubuntu 24.04 64位

     1、使用Xshell远程连接工具登录服务器

     2、# 先更新包列表

          sudo apt update

        #安装虚拟环境包

# 假设输出 Python 3.11,则安装:

sudo apt install python3.11-venv

# 创建虚拟环境

python3 -m venv ~/ansible-env

# 激活虚拟环境(每次都要执行)

source ~/ansible-env/bin/activate

# 安装 Ansible

pip install ansible

# 验证

ansible --version

三、SSH 免密登录配置(关键前置步骤)

Ansible 基于 SSH 通信,建议配置 SSH 密钥认证,避免每次执行都输入密码

# 1. 在控制节点生成 SSH 密钥(如果还没有)

ssh-keygen -t ed25519 -C "ansible@control-node" -f ~/.ssh/ansible_key

# 2. 将公钥复制到每台受管服务器

ssh-copy-id -i ~/.ssh/ansible_key.pub root@<目标服务器IP>

# 3. 测试 SSH 连接是否正常

ssh -i ~/.ssh/ansible_key root@<目标服务器IP>


使用 ssh-agent(推荐)

# 启动 ssh-agent 并添加私钥

eval $(ssh-agent)

ssh-add ~/.ssh/ansible_key

# 验证密钥已添加

ssh-add -l


四、编写 Inventory(主机清单)

Inventory 文件定义了你要管理哪些服务器。建议按业务角色分组,而不是把所有机器混在一起。


创建一个 inventory.ini 文件,内容如下:


ini

# 阿里云服务器组

[aliyun]

web-1 ansible_host=47.96.xxx.xxx ansible_user=root

web-2 ansible_host=120.96.xxx.xxx ansible_user=root


# 腾讯云服务器组

[tencent]

web-3 ansible_host=118.24.xxx.xxx ansible_user=ubuntu


# 定义公共变量(所有组生效)

[all:vars]

ansible_port=22

ansible_python_interpreter=/usr/bin/python3


# 定义生产环境组(包含所有服务器)

[production:children]

aliyun

tencent

验证 Inventory 是否配置正确:


bash

# 测试与所有服务器的连通性

ansible all -i inventory.ini -m ping


# 只测试阿里云服务器组

ansible aliyun -i inventory.ini -m ping

如果返回 "pong",说明连接正常,可以继续下一步。


五、编写第一个 Ansible Playbook

Playbook 用 YAML 格式编写,定义了在一组服务器上执行的一系列任务。它的一个核心特性是幂等性——无论执行多少次,最终状态都是一致的。


创建一个 deploy-nginx.yml 文件:


yaml

---

- name: 在 Web 服务器上安装和配置 Nginx

 hosts: production          # 目标服务器组

 become: yes                # 使用 sudo 提权

 vars:

   nginx_port: 80


 tasks:

   # 任务1:安装 Nginx

   - name: 安装 Nginx (Ubuntu/Debian)

     apt:

       name: nginx

       state: present

       update_cache: yes

     when: ansible_os_family == "Debian"


   - name: 安装 Nginx (CentOS/RHEL)

     yum:

       name: nginx

       state: present

     when: ansible_os_family == "RedHat"


   # 任务2:复制自定义 Nginx 配置文件(从模板渲染)

   - name: 配置 Nginx 虚拟主机

     template:

       src: nginx.conf.j2          # 本地模板文件

       dest: /etc/nginx/nginx.conf

       mode: '0644'

     notify: restart nginx         # 配置文件变更时触发 handler


   # 任务3:确保 Nginx 服务正在运行

   - name: 启动 Nginx 服务

     systemd:

       name: nginx

       state: started

       enabled: yes                # 设置开机自启


 handlers:

   # Handler:只在被 notify 时执行

   - name: restart nginx

     systemd:

       name: nginx

       state: restarted

执行 Playbook

bash

ansible-playbook -i inventory.ini deploy-nginx.yml

执行后,Ansible 会逐一在目标服务器上执行任务,并报告每个任务的结果:


ok:服务器已经处于期望状态(不需要变更)


changed:执行了变更操作


failed:执行失败


六、常用 ad-hoc 命令(快速操作)

对于一次性任务,可以直接使用 ad-hoc 命令,不需要写 Playbook:


bash

# 批量执行命令(查看系统版本)

ansible production -i inventory.ini -m shell -a "cat /etc/os-release"


# 批量查看磁盘使用情况

ansible aliyun -i inventory.ini -m shell -a "df -h"


# 批量重启服务

ansible tencent -i inventory.ini -m systemd -a "name=nginx state=restarted"

七、进阶配置建议

7.1 创建项目级配置文件 ansible.cfg

在项目目录下创建 ansible.cfg,可以统一管理连接参数,避免每次指定 -i 参数:


ini

[defaults]

inventory = ./inventory.ini

private_key_file = ~/.ssh/ansible_key

remote_user = root

host_key_checking = False

forks = 20          # 并行执行的进程数,可根据服务器数量调整

retry_files_enabled = False


[privilege_escalation]

become = True

become_method = sudo

become_user = root

become_ask_pass = False

7.2 使用 Ansible Vault 加密敏感信息

不要在 Inventory 或 Playbook 中明文存放密码。可以使用 Ansible Vault 加密敏感变量文件:


bash

# 创建加密的变量文件

ansible-vault create vars/secret.yml


# 编辑加密文件

ansible-vault edit vars/secret.yml


# 执行 Playbook 时输入密码

ansible-playbook -i inventory.ini deploy.yml --ask-vault-pass

八、总结

阶段 操作

安装 在控制节点安装 Ansible(Ubuntu 用 apt install ansible,CentOS 用 dnf install ansible)

SSH 配置 配置控制节点到所有目标服务器的 SSH 免密登录

编写 Inventory 定义目标服务器分组(按阿里/腾讯或业务角色分组)

编写 Playbook 定义自动化任务(安装软件、配置文件、启动服务等)

执行部署 ansible-playbook -i inventory.ini deploy.yml

这套从零开始的 Ansible 操作流程,能够支撑你的混合云(阿里+腾讯)部署需求。接下来可以先用 ping 模块验证连通性,再逐步扩展 Playbook,把之前讨论的镜像拉取、容器启动等步骤纳入自动化管理中。