---
# 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
# templates/config.yaml.j2
server:
port:
host: 0.0.0.0
database:
host:
port:
name:
pool_size: 10
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"