Site logo

Ansible Playbooks Phần 2: Tasks, Variables và Handlers

5:00 read

Phần 2 của series Ansible Playbooks tập trung vào các thành phần quan trọng: Tasks, Variables và Handlers.

Phần 2: Tasks, Variables và Handlers:

  • Tasks và cách tổ chức tasks
  • Variables: khai báo, sử dụng, precedence
  • Variables từ external files
  • Register để lưu output
  • Handlers và notifications
  • Ví dụ deploy với variables và handlers

Tasks

Là từng bước Ansible sẽ thực thi. Mỗi task gọi một module và truyền parameters.

Cấu trúc task cơ bản

- name: Cài nginx
  apt:
    name: nginx
    state: present
  become: yes

Task với nhiều parameters

- name: Copy nginx config
  copy:
    src: files/nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes
  become: yes
  notify: restart nginx

Multiple tasks trong một play

tasks:
  - name: Update apt cache
    apt:
      update_cache: yes
      cache_valid_time: 3600
    become: yes

  - name: Install packages
    apt:
      name: "{{ item }}"
      state: present
    loop:
      - nginx
      - git
      - vim
    become: yes

  - name: Start nginx service
    service:
      name: nginx
      state: started
      enabled: yes
    become: yes

Task organization best practices

Dictionary format vs Inline

# BAD - Inline format khó đọc
- name: Install nginx
  apt: name=nginx state=present update_cache=yes

# GOOD - Dictionary format dễ đọc
- name: Install nginx
  apt:
    name: nginx
    state: present
    update_cache: yes

Descriptive names

# BAD - Không rõ ràng
- apt:
    name: nginx

# GOOD - Mô tả chi tiết
- name: Install nginx web server for production environment
  apt:
    name: nginx
    state: present

Variables (Biến)

Biến giúp tái sử dụng giá trị và customize behavior.

Khai báo trong Playbook

- name: Deploy application
  hosts: web
  become: yes
  
  vars:
    package_name: nginx
    http_port: 80
    server_name: example.com
    app_user: www-data
    
  tasks:
    - name: Install {{ package_name }}
      apt:
        name: "{{ package_name }}"
        state: present

Sử dụng biến

tasks:
  - name: Install {{ package_name }}
    apt:
      name: "{{ package_name }}"
      state: present

  - name: Configure nginx
    template:
      src: nginx.conf.j2
      dest: /etc/nginx/nginx.conf
    vars:
      port: "{{ http_port }}"
      domain: "{{ server_name }}"

Variables từ file external

- name: Deploy application
  hosts: web
  vars_files:
    - vars/common.yml
    - vars/{{ env }}.yml  # dev.yml, staging.yml, prod.yml
  tasks:
    # ... tasks using variables

vars/common.yml:

app_name: myapp
app_port: 8080
log_level: info
timezone: Asia/Ho_Chi_Minh

vars/prod.yml:

env: production
debug: false
workers: 8
max_connections: 1000

vars/dev.yml:

env: development
debug: true
workers: 2
max_connections: 100

Variable types

String variables

vars:
  app_name: "myapp"
  server_name: example.com

Numeric variables

vars:
  http_port: 80
  max_workers: 4

Boolean variables

vars:
  enable_ssl: true
  debug_mode: false

List variables

vars:
  packages:
    - nginx
    - git
    - vim
  
  allowed_ips:
    - "192.168.1.0/24"
    - "10.0.0.0/8"

Dictionary variables

vars:
  database:
    host: localhost
    port: 5432
    name: myapp_db
    user: dbuser
  
  nginx:
    port: 80
    workers: 4
    keepalive_timeout: 65

Variable precedence (thứ tự ưu tiên)

Ansible có 22 levels of variable precedence, một số quan trọng:

  1. Extra vars (-e trong command line) - Cao nhất
  2. Task vars (trong task)
  3. Block vars (trong block)
  4. Play vars (trong play)
  5. Play vars_files
  6. Host vars (host_vars/hostname.yml)
  7. Group vars (group_vars/groupname.yml)
  8. Inventory vars (trong inventory file)
  9. Role defaults - Thấp nhất
# Extra vars override mọi thứ khác
ansible-playbook site.yml -e "env=production http_port=8080"

# Multiple extra vars
ansible-playbook site.yml -e "env=production" -e "debug=false"

# Extra vars từ file
ansible-playbook site.yml -e "@vars/override.yml"

Using variables in templates

Template file: nginx.conf.j2

server {
    listen {{ http_port }};
    server_name {{ server_name }};
    root {{ document_root }};
    
    access_log {{ log_dir }}/access.log;
    error_log {{ log_dir }}/error.log;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

Playbook:

- name: Configure nginx
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/sites-available/default
  vars:
    http_port: 80
    server_name: example.com
    document_root: /var/www/html
    log_dir: /var/log/nginx

Register - Lưu output của task

- name: Check nginx version
  command: nginx -v
  register: nginx_version
  ignore_errors: yes

- name: Display nginx version
  debug:
    var: nginx_version.stderr

- name: Check if config file exists
  stat:
    path: /etc/nginx/nginx.conf
  register: config_file

- name: Backup config if exists
  copy:
    src: /etc/nginx/nginx.conf
    dest: /etc/nginx/nginx.conf.backup
    remote_src: yes
  when: config_file.stat.exists

- name: Run application
  shell: /opt/app/start.sh
  register: app_start

- name: Show app output
  debug:
    msg: |
      Return code: {{ app_start.rc }}
      Stdout: {{ app_start.stdout }}
      Stderr: {{ app_start.stderr }}

Register output fields

Field Mô tả
stdout Output standard
stderr Error output
rc Return code (0 = success)
changed Task có thay đổi không
failed Task có fail không
skipped Task có bị skip không

Yêu cầu đăng nhập

Vui lòng đăng nhập để truy cập nội dung này

Additional Resources

Course Guide

Comprehensive PDF guide with examples

GitHub Repository

Example code for all lessons

Discussion

Have a question about this lesson? Post it here and get answers from instructors and peers.