ansible-for-devops实战指南:核心技术与实战案例
ansible-for-devops是一系列Ansible角色和剧本集合,旨在展示如何使用Ansible进行DevOps自动化运维工作,包括服务器配置、应用部署等内容。本文将从基础入门、核心功能到实战案例,全面介绍ansible-for-devops的使用方法,帮助普通用户及运营人员快速掌握自动化运维技能。
基础入门:Ansible Playbook初体验
Ansible Playbook(剧本)是Ansible的核心功能之一,用于定义一系列任务,实现自动化部署和配置。以下是一个最基础的Playbook示例,用于安装并启动时间同步服务chronyd。
基础Playbook示例
first-ansible-playbook/playbook.yml:
---
- hosts: all
become: yes
tasks:
- name: Ensure chrony (for time synchronization) is installed.
dnf:
name: chrony
state: present
- name: Ensure chrony is running.
service:
name: chronyd
state: started
enabled: yes
Playbook核心组成部分
- hosts: 指定要执行任务的目标主机或主机组。
- become: 是否以管理员权限执行任务,
yes表示使用sudo。 - tasks: 任务列表,每个任务包含
name(任务描述)和具体模块(如dnf用于安装软件,service用于管理服务)。
核心功能:Ansible自动化部署与配置
1. 多服务部署与集成
以Docker+Flask应用部署为例,展示如何使用Ansible实现多容器应用的自动化部署。该案例包含Web应用、数据库等多个服务,并通过Docker容器化部署。
docker-flask/provisioning/main.yml是整个部署流程的入口,主要包含以下步骤:
---
- hosts: all
become: true
vars:
build_root: /vagrant/provisioning
pre_tasks:
- name: Update apt cache if needed.
apt: update_cache=yes cache_valid_time=3600
roles:
- role: geerlingguy.docker
tasks:
- import_tasks: setup.yml
- import_tasks: docker.yml
其中,setup.yml负责环境准备,docker.yml负责Docker镜像构建和容器启动。部署完成后,可通过docker-flask/provisioning/www/templates/index.html访问应用页面:
<!DOCTYPE html>
<html>
<head>
<title>Flask + MySQL Docker Example</title>
<style>* { font-family: Helvetica, Arial, sans-serif }</style>
</head>
<body>
<h1>Flask + MySQL Docker Example</h1>
<p>MySQL Connection: {{ result }}</p>
</body>
</html>
2. 安全加固自动化
安全是运维工作的重中之重,ansible-for-devops提供了全面的安全加固方案。security/main.yml包含多项安全配置任务,如:
- 禁用SSH密码登录,仅允许密钥登录
- 安装并配置防火墙(firewalld)
- 自动更新系统安全补丁
- 配置SELinux(Security-Enhanced Linux)策略
以下是禁用SSH密码登录的关键配置:
- name: Update SSH configuration to be more secure.
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
state: present
validate: 'sshd -t -f %s'
with_items:
- regexp: "^PasswordAuthentication"
line: "PasswordAuthentication no"
- regexp: "^PermitRootLogin"
line: "PermitRootLogin no"
notify: restart ssh
3. HTTPS证书自动化管理
使用Let's Encrypt免费证书可以为网站提供HTTPS加密。https-letsencrypt/main.yml实现了证书的自动申请、部署和续期:
---
- hosts: letsencrypt
become: true
vars_files:
- vars/main.yml
roles:
- geerlingguy.firewall
- geerlingguy.nginx
- geerlingguy.certbot
tasks:
- name: Copy Nginx server configuration in place.
template:
src: templates/https-letsencrypt.conf.j2
dest: /etc/nginx/sites-enabled/https-letsencrypt.conf
notify: restart nginx
该Playbook使用geerlingguy.certbot角色自动获取证书,并通过Nginx配置实现HTTPS访问。
实战案例:企业级应用部署
1. LAMP架构自动化部署
LAMP(Linux+Apache+MySQL+PHP)是经典的Web应用架构。lamp-infrastructure/playbooks/www/main.yml实现了LAMP环境的自动化部署,包括Apache、PHP、MySQL等服务的安装配置:
---
- hosts: lamp_www
become: yes
vars_files:
- vars.yml
roles:
- geerlingguy.firewall
- geerlingguy.repo-epel
- geerlingguy.apache
- geerlingguy.php
- geerlingguy.php-mysql
- geerlingguy.php-memcached
tasks:
- name: Copy our fancy server-specific home page.
template:
src: templates/index.php.j2
dest: /var/www/html/index.php
2. Kubernetes集群应用部署
随着容器编排技术的普及,Kubernetes已成为容器管理的事实标准。kubernetes/examples/k8s-module.yml展示了如何使用Ansible的Kubernetes模块部署应用:
---
- hosts: k8s-master
become: yes
tasks:
- name: Apply Nginx definition from Ansible controller file system.
k8s:
state: present
definition: "{{ lookup('file', 'files/nginx.yml') | from_yaml }}"
- name: Expose the Nginx service with an inline Service definition.
k8s:
state: present
definition:
apiVersion: v1
kind: Service
metadata:
name: a4d-nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
该Playbook使用k8s模块创建Nginx Deployment和Service,实现应用的容器化部署和访问。
3. 滚动更新与零停机部署
在生产环境中,零停机部署至关重要。deployments/playbooks/deploy.yml实现了Ruby on Rails应用的滚动更新:
---
- hosts: all
become: yes
tasks:
- name: Ensure demo application is at correct release.
git:
repo: https://gitcode.com/gh_mirrors/an/demo-rails-app.git
version: "{{ app_version }}"
dest: "{{ app_directory }}"
register: app_updated
- name: Perform deployment-related rake tasks.
command: "{{ item }} chdir={{ app_directory }}"
with_items:
- bundle exec rake db:migrate
- bundle exec rake assets:precompile
when: app_updated.changed == true
通过Git版本控制和Rake任务,实现了应用的平滑更新,避免服务中断。
总结与展望
ansible-for-devops提供了丰富的自动化运维示例,涵盖了从基础服务配置到企业级应用部署的各个方面。通过本文介绍的核心技术和实战案例,用户可以快速掌握Ansible的使用方法,实现运维工作的自动化和标准化。
官方文档:README.md 项目教程:tests/ 更多示例:dynamic-inventory/、docker-hubot/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



