diff --git a/playbooks/ssh-certs/deploy-user-certs.yml b/playbooks/ssh-certs/deploy-user-certs.yml index d1493d8..2f7debb 100644 --- a/playbooks/ssh-certs/deploy-user-certs.yml +++ b/playbooks/ssh-certs/deploy-user-certs.yml @@ -5,40 +5,27 @@ local_ssh_user_ca_pub_path: "/etc/step-ca/ssh_user_ca_key.pub" pre_tasks: - - name: Динамический сбор и мерж пользователей изо всех групп хоста + - name: Инициализация пустых списков перед сбором set_fact: - # Ищем переменные вида *_users (alpha_users, beta_users) для групп текущего хоста - project_users: >- - {{ - group_names - - | map('extract', hostvars[inventory_hostname]) - | select('defined') - | map('dict2items') | flatten - | selectattr('key', 'match', '.*_users$') - - | map(attribute='value') | flatten - | unique - }} - - # Ищем переменные вида *_projects (alpha_projects, beta_projects) и склеиваем в один список принципалов - allowed_projects: >- - {{ - group_names - - | map('extract', hostvars[inventory_hostname]) - | select('defined') - | map('dict2items') | flatten - | selectattr('key', 'match', '.*_projects$') - - | map(attribute='value') | flatten - | unique - }} - - - name: Проверка на случай отсутствия переменных + _raw_users: [] + _raw_projects: [] + + - name: Сбор пользователей из всех активных групп хоста set_fact: - project_users: "{{ project_users | default([]) }}" - allowed_projects: "{{ allowed_projects | default([]) }}" + _raw_users: "{{ _raw_users + (hostvars[inventory_hostname][item ~ '_users'] | default([])) }}" + loop: "{{ group_names }}" + when: hostvars[inventory_hostname][item ~ '_users'] is defined + + - name: Сбор проектов из всех активных групп хоста + set_fact: + _raw_projects: "{{ _raw_projects + (hostvars[inventory_hostname][item ~ '_projects'] | default([])) }}" + loop: "{{ group_names }}" + when: hostvars[inventory_hostname][item ~ '_projects'] is defined + + - name: Фиксация уникальных массивов + set_fact: + project_users: "{{ _raw_users | unique }}" + allowed_projects: "{{ _raw_projects | unique }}" - name: Дебаг получившейся матрицы доступов (Опционально) debug: @@ -104,6 +91,21 @@ marker: "# {mark} ANSIBLE MANAGED USER CERTIFICATE BLOCK #" notify: Restart SSH + + - name: Получить список всех файлов принципалов на машине + find: + paths: /etc/ssh/auth_principals + file_type: file + register: found_principals_files + + - name: Удаление файлов принципалов для пользователей, которые выбыли из проекта + file: + path: "{{ item.path }}" + state: absent + loop: "{{ found_principals_files.files }}" + # Фильтр проверяет: если имя файла на диске НЕ входит в текущий список project_users, файл удаляется + when: item.path | basename not in (project_users | map(attribute='name') | list) + handlers: - name: Restart SSH service: