Ansible 自动化部署:告别手动运维


阿里云特惠 - 新用户专享

Ansible 自动化部署:告别手动运维

随着服务器数量增长,手动运维的效率和准确性越来越难以保证。Ansible 是一款强大的自动化运维工具,使用简单,功能强大。本文详细介绍 Ansible 的使用方法和实战技巧。

一、Ansible 优势

  • 无需 Agent:使用 SSH 协议,无需在被控端安装代理
  • YAML 配置:配置文件使用 YAML,易读易写
  • 幂等性:多次执行结果一致,不会重复执行
  • 模块化:丰富的内置模块,支持自定义模块

二、安装 Ansible

# Ubuntu/Debian
sudo apt update
sudo apt install ansible

# CentOS/RHEL
sudo yum install ansible

# macOS
brew install ansible

# 验证安装
ansible --version

三、配置 Inventory

# 编辑 /etc/ansible/hosts
sudo vim /etc/ansible/hosts

[webservers]
192.168.1.10
192.168.1.11

[dbservers]
192.168.1.20

[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa

四、常用命令

# 测试连接
ansible all -m ping

# 查看主机信息
ansible all -m setup

# 执行命令
ansible webservers -m shell -a "uptime"

# 复制文件
ansible webservers -m copy -a "src=/local/file dest=/remote/file"

# 安装软件包
ansible webservers -m apt -a "name=nginx state=present"

五、Playbook 编写

# deploy_web.yml
---
- name: Deploy Web Server
  hosts: webservers
  become: yes

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

    - name: Install Nginx
      apt:
        name: nginx
        state: present

    - name: Start Nginx
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Copy website files
      copy:
        src: ./website/
        dest: /var/www/html/

    - name: Configure Nginx
      template:
        src: ./nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: restart nginx

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

六、执行 Playbook

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

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

# 执行 Playbook
ansible-playbook deploy_web.yml

# 指定主机组执行
ansible-playbook -i inventory.ini deploy_web.yml

# 增加详细输出
ansible-playbook -vvv deploy_web.yml

七、常用模块

1. apt/yum – 包管理

- name: Install packages
  apt:
    name:
      - nginx
      - mysql-server
      - python3-pip
    state: present

2. service – 服务管理

- name: Ensure Nginx is running
  service:
    name: nginx
    state: started
    enabled: yes

3. copy – 文件复制

- name: Copy configuration file
  copy:
    src: config/nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes

4. template – 模板渲染

# nginx.conf.j2
server {
    listen {{ nginx_port }};
    server_name {{ server_name }};

    root {{ document_root }};
}

# playbook
- name: Configure Nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-available/default
  vars:
    nginx_port: 80
    server_name: example.com
    document_root: /var/www/html

5. file – 文件管理

- name: Create directory
  file:
    path: /var/www/html
    state: directory
    owner: www-data
    group: www-data
    mode: '0755'

- name: Ensure file exists
  file:
    path: /var/www/html/index.html
    state: touch

6. systemd – systemd 管理

- name: Reload systemd
  systemd:
    daemon_reload: yes

- name: Restart service
  systemd:
    name: nginx
    state: restarted

八、变量使用

# 定义变量
---
- name: Deploy Application
  hosts: webservers
  vars:
    app_name: myapp
    app_port: 3000
    app_user: appuser

  tasks:
    - name: Create user
      user:
        name: "{{ app_user }}"
        shell: /bin/bash

    - name: Deploy application
      copy:
        src: "./{{ app_name }}/"
        dest: "/opt/{{ app_name }}/"

九、Roles 角色

roles/
├── common/
│   ├── tasks/
│   │   └── main.yml
│   ├── handlers/
│   │   └── main.yml
│   ├── files/
│   ├── templates/
│   ├── vars/
│   │   └── main.yml
│   └── defaults/
│       └── main.yml
├── nginx/
│   └── ...
└── mysql/
    └── ...
# site.yml
---
- hosts: webservers
  roles:
    - common
    - nginx

- hosts: dbservers
  roles:
    - common
    - mysql

十、Vault 加密敏感数据

# 创建加密文件
ansible-vault create secret.yml

# 编辑加密文件
ansible-vault edit secret.yml

# 使用加密变量
- hosts: webservers
  vars_files:
    - secret.yml

# 执行时提供密码
ansible-playbook site.yml --ask-vault-pass

十一、最佳实践

  • 使用版本控制:将 Playbook 和 Roles 放入 Git 仓库
  • 模块化设计:使用 Roles 复用配置
  • 幂等性:确保多次执行结果一致
  • 错误处理:使用 ignore_errors 和 failed_when 控制错误处理
  • 测试:使用 –check 参数先测试再执行

总结

Ansible 是自动化运维的利器。通过 Playbook 和 Roles,可以轻松实现自动化部署、配置管理、应用发布等任务。掌握 Ansible,告别手动运维,提升工作效率。

发表评论