自动化运维:Ansible与基础设施即代码
大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊自动化运维这个重要话题。作为一个全栈开发者,自动化运维可以大大提高运维效率和可靠性。今天就来分享一下Ansible和基础设施即代码的实战经验。
自动化运维概述
为什么需要自动化?
| 问题 | 说明 |
|---|---|
| 手动操作容易出错 | 人为因素导致配置不一致 |
| 部署效率低 | 重复劳动耗时耗力 |
| 环境不一致 | 开发、测试、生产环境差异 |
| 灾难恢复慢 | 手动恢复时间长 |
基础设施即代码
将基础设施配置以代码形式管理
版本控制、自动化部署、可重复
Ansible入门
安装Ansible
bash
# 安装Ansible
pip install ansible
# 验证安装
ansible --version
主机清单
ini
# inventory.ini
[web_servers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[db_servers]
db1 ansible_host=192.168.1.20
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa
简单Playbook
yaml
---
- name: 配置Web服务器
hosts: web_servers
become: true
tasks:
- name: 安装Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: 启动Nginx
service:
name: nginx
state: started
enabled: yes
- name: 复制配置文件
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: 重启Nginx
handlers:
- name: 重启Nginx
service:
name: nginx
state: restarted
Playbook进阶
变量和模板
yaml
---
- name: 配置应用服务器
hosts: app_servers
become: true
vars:
app_name: myapp
app_version: 1.0.0
node_env: production
tasks:
- name: 创建应用目录
file:
path: /opt/{{ app_name }}
state: directory
owner: appuser
group: appuser
- name: 复制应用配置
template:
src: templates/app.conf.j2
dest: /opt/{{ app_name }}/config.json
条件判断
yaml
---
- name: 根据操作系统配置
hosts: all
become: true
tasks:
- name: 安装Nginx (Debian)
apt:
name: nginx
state: present
when: ansible_os_family == 'Debian'
- name: 安装Nginx (RedHat)
yum:
name: nginx
state: present
when: ansible_os_family == 'RedHat'
循环
yaml
---
- name: 安装多个软件包
hosts: all
become: true
tasks:
- name: 安装基础工具
apt:
name: "{{ item }}"
state: present
loop:
- git
- curl
- vim
- htop
实战案例:部署Web应用
yaml
---
- name: 部署Node.js应用
hosts: app_servers
become: true
vars:
app_repo: https://github.com/myorg/myapp.git
app_dir: /opt/myapp
node_version: 18.x
tasks:
- name: 安装Node.js
shell: |
curl -sL https://deb.nodesource.com/setup_{{ node_version }} | bash -
apt-get install -y nodejs
- name: 克隆代码仓库
git:
repo: "{{ app_repo }}"
dest: "{{ app_dir }}"
version: main
- name: 安装依赖
npm:
path: "{{ app_dir }}"
ci: yes
- name: 构建应用
npm:
path: "{{ app_dir }}"
run: build
- name: 创建systemd服务
template:
src: templates/myapp.service.j2
dest: /etc/systemd/system/myapp.service
- name: 启动服务
systemd:
name: myapp
state: started
enabled: yes
daemon_reload: yes
最佳实践
1. 模块化设计
yaml
# roles/webserver/tasks/main.yml
---
- include: install.yml
- include: configure.yml
- include: deploy.yml
2. 版本控制
bash
# 将Playbook放入Git仓库
git init
git add .
git commit -m "Initial Ansible configuration"
3. 测试验证
bash
# 使用check模式验证
ansible-playbook site.yml --check
# 测试特定主机
ansible-playbook site.yml -l web1
总结
自动化运维是现代DevOps的核心。通过Ansible和基础设施即代码,可以实现高效、可靠的运维流程。
我的鬃狮蜥Hash对自动化也有自己的理解------它总是用固定的方式捕捉蟋蟀,这也许就是自然界的"自动化运维"吧!
如果你对自动化运维有任何问题,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!
技术栈:Ansible · 自动化运维 · 基础设施即代码