148 lines
5.2 KiB
YAML
148 lines
5.2 KiB
YAML
---
|
||
# Сбор системных фактов со всех управляемых хостов и сохранение в JSON-файлы.
|
||
# Результаты публикуются как GitLab Pages через scripts/generate_report.py.
|
||
#
|
||
# Запуск:
|
||
# ansible-playbook -i inventory/prod playbooks/gather_facts.yml
|
||
- name: Gather and save host facts
|
||
hosts: all
|
||
gather_facts: true
|
||
ignore_unreachable: true
|
||
|
||
vars:
|
||
facts_output_dir: "{{ playbook_dir }}/../host_facts"
|
||
|
||
tasks:
|
||
- name: Собрать информацию об установленных пакетах
|
||
ansible.builtin.package_facts:
|
||
manager: auto
|
||
failed_when: false
|
||
|
||
- name: Собрать информацию о системных службах
|
||
ansible.builtin.service_facts:
|
||
failed_when: false
|
||
|
||
- name: Получить открытые TCP/UDP порты
|
||
ansible.builtin.command: ss -tlnup
|
||
register: _ports_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
|
||
- name: Получить правила firewalld (CentOS)
|
||
ansible.builtin.command: firewall-cmd --list-all-zones
|
||
register: _firewalld_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
when: ansible_facts['distribution'] | default('') == 'CentOS'
|
||
|
||
- name: Получить правила ufw (Debian)
|
||
ansible.builtin.command: ufw status verbose
|
||
register: _ufw_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
when: ansible_facts['distribution'] | default('') == 'Debian'
|
||
|
||
- name: Подготовить данные о портах и фаерволе
|
||
ansible.builtin.set_fact:
|
||
_network_security:
|
||
ports_raw: "{{ _ports_raw.stdout | default('') }}"
|
||
firewall_raw: >-
|
||
{{
|
||
_firewalld_raw.stdout | default('')
|
||
if ansible_facts.get('distribution', '') == 'CentOS'
|
||
else _ufw_raw.stdout | default('')
|
||
}}
|
||
|
||
- name: Инициализировать данные о Docker-контейнерах
|
||
ansible.builtin.set_fact:
|
||
_docker_info:
|
||
containers: []
|
||
|
||
- name: Проверить наличие Docker и получить ID запущенных контейнеров
|
||
ansible.builtin.command: docker ps -q
|
||
register: _docker_ids
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
|
||
- name: Получить детали запущенных Docker-контейнеров
|
||
ansible.builtin.command: docker inspect {{ _docker_ids.stdout_lines | join(' ') }}
|
||
register: _docker_inspect_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
when:
|
||
- _docker_ids.rc == 0
|
||
- _docker_ids.stdout | trim | length > 0
|
||
|
||
- name: Обновить данные о Docker-контейнерах
|
||
ansible.builtin.set_fact:
|
||
_docker_info:
|
||
containers: "{{ _docker_inspect_raw.stdout | from_json }}"
|
||
when:
|
||
- _docker_inspect_raw is defined
|
||
- _docker_inspect_raw is not skipped
|
||
- _docker_inspect_raw.rc == 0
|
||
- _docker_inspect_raw.stdout | default('') | trim | length > 0
|
||
|
||
- name: Получить активные TCP-соединения к внешним хостам
|
||
ansible.builtin.command: ss -tnp state established
|
||
register: _connections_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
|
||
- name: Получить список процессов с аргументами
|
||
ansible.builtin.command: ps -eo pid,args --no-headers
|
||
register: _ps_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
|
||
- name: Подготовить данные об активных TCP-соединениях
|
||
ansible.builtin.set_fact:
|
||
_connections_info:
|
||
connections_raw: "{{ _connections_raw.stdout | default('') }}"
|
||
ps_raw: "{{ _ps_raw.stdout | default('') }}"
|
||
|
||
- name: Получить таблицу conntrack (TCP и UDP)
|
||
ansible.builtin.command: conntrack -L 2>/dev/null
|
||
register: _conntrack_raw
|
||
changed_when: false
|
||
failed_when: false
|
||
become: true
|
||
|
||
- name: Подготовить данные conntrack
|
||
ansible.builtin.set_fact:
|
||
_conntrack_info:
|
||
conntrack_raw: "{{ _conntrack_raw.stdout | default('') }}"
|
||
|
||
- name: Создать локальную директорию для хранения фактов
|
||
ansible.builtin.file:
|
||
path: "{{ facts_output_dir }}"
|
||
state: directory
|
||
mode: "0755"
|
||
delegate_to: localhost
|
||
run_once: true
|
||
become: false
|
||
|
||
- name: Сохранить факты хоста в JSON
|
||
ansible.builtin.copy:
|
||
content: >-
|
||
{{
|
||
ansible_facts
|
||
| combine({'inventory_hostname': inventory_hostname})
|
||
| combine(_network_security)
|
||
| combine(_docker_info)
|
||
| combine(_connections_info)
|
||
| combine(_conntrack_info)
|
||
| to_nice_json
|
||
}}
|
||
dest: "{{ facts_output_dir }}/{{ inventory_hostname }}.json"
|
||
mode: "0644"
|
||
delegate_to: localhost
|
||
become: false
|