linux-sre-handbook

02-Ansible Playbook实战

Playbook 示例:部署 Web 应用

---
# site.yml
- name: Deploy web application
  hosts: web
  become: yes
  vars:
    app_user: myapp
    app_dir: /opt/myapp
    app_version: "1.2.3"

  tasks:
    - name: Create app user
      user:
        name: ""
        shell: /sbin/nologin
        create_home: no

    - name: Create app directory
      file:
        path: ""
        state: directory
        owner: ""

    - name: Deploy application binary
      copy:
        src: "files/myapp-.jar"
        dest: "/myapp.jar"
        owner: ""

    - name: Deploy configuration
      template:
        src: templates/config.yaml.j2
        dest: /etc/myapp/config.yaml
      notify: restart myapp

    - name: Deploy systemd unit
      template:
        src: templates/myapp.service.j2
        dest: /etc/systemd/system/myapp.service
      notify: restart myapp

    - name: Start and enable service
      systemd:
        name: myapp
        state: started
        enabled: yes
        daemon_reload: yes

  handlers:
    - name: restart myapp
      systemd:
        name: myapp
        state: restarted

模板 (Jinja2)

# templates/config.yaml.j2
server:
  port: 
  host: 0.0.0.0

database:
  host: 
  port: 
  name: 


  pool_size: 10

Role 目录结构

roles/
└── myapp/
    ├── tasks/
    │   └── main.yml        # 入口 tasks
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   ├── config.yaml.j2
    │   └── myapp.service.j2
    ├── files/
    │   └── myapp.jar
    ├── vars/
    │   └── main.yml
    ├── defaults/
    │   └── main.yml        # 默认变量 (优先级最低)
    └── meta/
        └── main.yml        # Role 依赖

常用模式

滚动更新

- name: Rolling update
  hosts: web
  serial: 1                 # 一次只更新一台
  tasks:
    - name: Drain from LB
      # ...
    - name: Update app
      # ...
    - name: Add back to LB
      # ...

条件执行

- name: Install EPEL on RHEL
  yum:
    name: epel-release
  when: ansible_os_family == "RedHat"

延伸阅读