ansible从入门到精通 实战场景和完整代码示例篇

#作者:曹付江

在这里插入图片描述

掌握Ansible后,你能够干什么?
1)一键部署数百台服务器
2)自动化应用生命周期管理
3)云环境基础设施即代码
4)安全合规自动化审计
5)持续交付流水线集成
6)数据库自动化运维​
……

第一阶段:基础入门

1.Ansible 核心概念

1.1什么是 Ansible?

Ansible 是一个开源的自动化平台,主要用于配置管理、应用部署、任务执行和 IT 自动化。
特点:

  • 无需代理(Agentless)
  • 使用 SSH 作为默认通信方式
  • 基于 YAML 的 Playbook 编排语言
  • 模块化设计,支持自定义模块

1.2工作原理​​:

基于SSH的无代理架构,Ansible 控制节点通过 SSH 或 WinRM 连接目标机器,不需要安装客户端
Ansible 工作方式:

  • 控制节点:运行 ansible 命令
  • 受管主机:通过 SSH/WinRM 执行任务
  • 模块:任务单位,如 copy, yum
  • 清单文件:定义目标主机
  • Playbook:YAML 编排剧本

1.3核心组件​​:

  • ​​Inventory​​:被管理主机清单
  • ​​Playbook​​:自动化剧本(YAML)
  • ​​Module​​:执行单元(超过3000个内置模块)
  • ​​Role​​:可复用的任务集合
    3# 2.环境搭建

2.1 控制节点

系统要求:建议使用 Linux 发行版,如 CentOS、Ubuntu、Debian

# Ubuntu安装
sudo apt update
sudo apt install ansible -y

# 验证安装

ansible --version

2.2 受管主机

确保以下内容:

  • Linux 系统
  • 已配置 SSH 登录权限
  • 控制节点能 SSH 无密码登录(建议使用 SSH key)

2.3 Windows 受管主机(用的少,此处略过)

2.4 网络设备支持

Ansible 支持 Cisco、Juniper、Arista 等,使用 network_cli 插件连接。

3. 第一个Ad-hoc命令

# 编辑主机清单 /etc/ansible/hosts
[web_servers]
192.168.1.101
192.168.1.102

# 测试连接
ansible web_servers -m ping -u root -k

4. Ansible 常用模块

示例列表:
ansible-doc -l | grep copy
示例 1:copy
ansible all -m copy -a “src=/etc/hosts dest=/tmp/hosts”
示例 2:yum
ansible all -m yum -a “name=httpd state=present”
示例 3:service

5. 基础Playbook示例

示例:安装 nginx 并启动

# site.yml
---
- name: 安装Web服务器
  hosts: web_servers
  become: yes
  tasks:
    - name: 安装Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: 启动Nginx服务
      service:
        name: nginx
        state: started
        enabled: yes
运行Playbook:
ansible-playbook  site.yml

第二阶段:进阶实战

1. 变量管理

# 在Playbook中定义变量
vars:
  http_port: 8080
  admin_email: admin@example.com

# 引用变量
- name: 配置Nginx端口
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf

2. Jinja2模板使用

# templates/nginx.conf.j2
server {
    listen       {{ http_port }};
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

3. 条件与循环

- name: 批量创建用户
  user:
    name: "{{ item }}"
    state: present
    groups: sudo
  loop:
    - alice
    - bob
    - charlie

- name: 条件部署
  apt:
    name: git
    state: present
  when: ansible_os_family == "Debian"

4. 错误处理

Yaml:
- name: 尝试危险操作
  command: /bin/false
  ignore_errors: yes
  register: result
  failed_when: "'critical' in result.stderr"

- name: 错误处理
  debug:
    msg: "操作失败,正在回滚..."
  when: result is failed

第三阶段:高级技巧

1. 角色(Roles)开发

创建角色结构:

Bash:
ansible-galaxy init nginx_role
目录结构:
nginx_role/
├── defaults
│   └── main.yml    # 默认变量
├── tasks
│   └── main.yml    # 主任务
├── templates
│   └── nginx.conf.j2
└── handlers
└── main.yml    # 触发器

2. 自定义模块开发

Python:
#!/usr/bin/python3
# library/disk_space.py

def main():
    module = AnsibleModule(
        argument_spec= dict(mount=dict(required=True))
    )
    mount = module.params['mount']
    free_bytes = os.statvfs(mount).f_bfree * os.statvfs(mount).f_bsize
    
    module.exit_json(
        changed=False,
        free_gb=round(free_bytes / (1024**3), 1)
    )

from ansible.module_utils.basic import *
main()

使用模块:

yaml
- name: 检查磁盘空间
  disk_space:
    mount: /var
  register: disk

3. 动态Inventory

# aws_ec2.py
#!/usr/bin/env python
import boto3

ec2 = boto3.resource('ec2')
groups = {'web': [], 'db': []}

for instance in ec2.instances.all():
    if 'WebServer' in instance.tags:
        groups['web'].append(instance.public_ip)
    elif 'Database' in instance.tags:
        groups['db'].append(instance.private_ip)

print(json.dumps(groups))

第四阶段:企业级实践

1. CI/CD集成 (GitLab示例)

Yaml:
# .gitlab-ci.yml
stages:
  - test
  - deploy

ansible_test:
  stage: test
  image: python:3.8
  script:
    - pip install ansible==6.7.0
    - ansible-playbook -i staging site.yml --syntax-check
    - ansible-lint site.yml

prod_deploy:
  stage: deploy
  only:
    - main
  script:
    - ansible-playbook -i production site.yml

2. Ansible Tower/AWX管理

架构:
在这里插入图片描述
核心功能:

  • Web图形化管理
  • RBAC权限控制
  • 审计日志
  • REST API

3. 性能优化

Init:
# ansible.cfg
[defaults]
forks = 50  # 并发数
host_key_checking = False

[ssh_connection]
pipelining = true
control_path = %(directory)s/%%h-%%r

4.实战项目:完整应用部署

# wordpress_deploy.yml
---
- name: 部署WordPress集群
  hosts: all
  vars:
    mysql_root_password: "{{ vault_mysql_root_pass }}"
    wp_db_password: "{{ vault_wp_db_pass }}"
    
  roles:
    - role: base
    - role: nginx
    - role: php
    - role: mysql
    - role: wordpress


post_tasks:
    - name: 验证服务状态
      uri:
        url: http://localhost/wp-admin/install.php
        return_content: yes
      register: result
      until: 'WordPress installation' in result.content
      retries: 10
      delay: 30

角色组织:
roles/
├── base
│ ├── tasks/main.yml # 基础系统配置
├── nginx
│ ├── templates/nginx.conf.j2
├── mysql
│ ├── tasks/configure.yml
├── php
│ └── tasks/install.yml
└── wordpress
├── tasks/download.yml
└── tasks/configure.yml

其他案例:

  • 自动部署 LNMP
  • 多节点服务重启
  • 自动化用户创建
  • 定时备份脚本下发

推荐资源​​:

  • 官方文档:docs.ansible.com
  • 书籍:《Ansible: Up and Running》
  • 实验环境:Play with Docker (labs.play-with-docker.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值