Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

[Ansible] Kiểm tra port trên Linux


Để thực hiện kiểm tra và tăng giá trị cổng (port) cho 1 dịch vụ cho đến khi tìm được một cổng không sử dụng, bạn có thể sử dụng vòng lặp trong Ansible. Dưới đây là một ví dụ playbook mẫu để thực hiện điều này:

- name: Update port if it's not available
  shell: |
    port_available={{ item }}
    while nc -z localhost $port_available; do
      port_available=$((port_available+1))
    done
    echo $port_available
  loop:
    - "{{ prometheus_port }}"
    - "{{ pushgateway_port }}"
    - "{{ alertmanager_port1 }}"
    - "{{ alertmanager_port2 }}"
    - "{{ alertmanager_bot_port }}"
    - "{{ snmp_exporter_port_tcp }}"
    - "{{ snmp_exporter_port_udp }}"
    - "{{ grafana_port }}"
  register: port_available_result

- name: Set fact for port values
  set_fact:
    "port_{{ item.item }}_available": "{{ item.stdout }}"
  with_items: "{{ port_available_result.results }}"

- name: Set new fact for port availability
  set_fact:
    prometheus_port: "{{ port_available_result.results[0].stdout }}"
    pushgateway_port: "{{ port_available_result.results[1].stdout }}"
    alertmanager_port1: "{{ port_available_result.results[2].stdout }}"
    alertmanager_port2: "{{ port_available_result.results[3].stdout }}"
    alertmanager_bot_port: "{{ port_available_result.results[4].stdout }}"
    snmp_exporter_port_tcp: "{{ port_available_result.results[5].stdout }}"
    snmp_exporter_port_udp: "{{ port_available_result.results[6].stdout }}"
    grafana_port: "{{ port_available_result.results[7].stdout }}"

- name: Print registered port values
  debug:
    var: item
  with_items:
    - "{{ prometheus_port }}"
    - "{{ pushgateway_port }}"
    - "{{ alertmanager_port1 }}"
    - "{{ alertmanager_port2 }}"
    - "{{ alertmanager_bot_port }}"
    - "{{ snmp_exporter_port_tcp }}"
    - "{{ snmp_exporter_port_udp }}"
    - "{{ grafana_port }}"

Đoạn playbook trên có các task sau:

  1. Task 1: “Update port if it’s not available”

  2. Sử dụng module shell để chạy lệnh update port cho các service.

  3. Vòng lặp loop sẽ lặp qua các biến được lưu trữ trong các biến jinja được định nghĩa, bao gồm prometheus_port, pushgateway_port, alertmanager_port1, alertmanager_port2, alertmanager_bot_port, snmp_exporter_port_tcp, snmp_exporter_port_udp và grafana_port.
  4. Task này cũng sử dụng module register để lưu trữ kết quả của các lệnh update port trong biến port_available_result.

  5. Task 2: “Set fact for port values”

  6. Sử dụng module set_fact để tạo một fact mới với tên được định dạng theo dạng “port_{{ item.item }}_available” và giá trị của nó là kết quả stdout của task trước đó.

  7. Vòng lặp with_items được sử dụng để lặp qua các phần tử trong biến port_available_result.results.

  8. Task 3: “Set new fact for port availability”

  9. Sử dụng module set_fact để tạo một fact mới cho mỗi port đã được cập nhật bằng cách sử dụng giá trị stdout của các task trước đó trong biến port_available_result.results.

  10. Giá trị của các port này được đặt lại cho các biến jinja đã được định nghĩa trong task trước đó.

  11. Task 4: “Print registered port values”

  12. Sử dụng module debug để in ra giá trị của các biến jinja prometheus_port, pushgateway_port, alertmanager_port1, alertmanager_port2, alertmanager_bot_port, snmp_exporter_port_tcp, snmp_exporter_port_udp và grafana_port.

  13. Vòng lặp with_items được sử dụng để lặp qua các phần tử trong danh sách các biến jinja này.