--- - name: init_login hosts: servers # @NOTE for IPv6, switch to 'servers6' instead of 'servers4'--for both, 'servers' vars_files: # @NOTE if second line is uncommented with its variables actively in use, first line should too be uncommented # - vars/ssh_keys_vault.yml - vars/ssh_keys.yml vars: ansible_user: "{{ passwords[0].username }}" ansible_ssh_user: "{{ passwords[0].username }}" # @NOTE one of below two lines should be commented/uncommented in a mutually exclusive fashion # ansible_ssh_private_key_file: "{{ chosen_native_ssh_private_key_file | default(chosen_local_ssh_private_key_file, true) }}" # @NOTE only works with soft-coded SSH key list building ansible_ssh_private_key_file: "{{ chosen_local_ssh_private_key_file }}" # @NOTE below three lines should only be uncommented when above two are commented and vice versa; key-based authentication should have already been enabled prior to running this playbook # ansible_password: "{{ passwords[0].password }}" # ansible_ssh_pass: "{{ passwords[0].username }}" # ansible_ssh_password: "{{ passwords[0].username }}" ansible_python_interpreter: “{{ ansible_playbook_python }}” personal_computers: locals # @NOTE can change to *_households group or {{ name }}_{{ surname }} group name vars_prompt: - name: gpg_import_passwords prompt: Enter space-wrapped colon -separated list of GPG private key passwords unsafe: yes private: yes - name: gpg_or_ssh_git_signing prompt: Enter preferred signing key type (e.g., ssh or gpg) unsafe: yes private: no default: "ssh" - name: gpg_preferred_signing prompt: Enter index or number of preferred signing key (negative number for random) unsafe: yes private: no default: -1 - name: git_config_name prompt: Enter name for your git configuration unsafe: yes private: no - name: git_config_email prompt: Enter email for your git configuration unsafe: yes private: no tasks: - name: Disable shell access for root ansible.builtin.include_role: name: lockdown defaults_from: main vars_from: main handlers_from: main tasks_from: deshell apply: become: yes tags: - default - name: Create global bash aliases become: yes ansible.builtin.copy: src: files/all/bash/bash_aliases dest: /etc/bash_aliases owner: root group: root follow: yes force: yes backup: yes mode: "0644" state: present tags: - default - source_sys_bashrc - name: Create global bash functions become: yes ansible.builtin.copy: src: files/all/bash/bash_functions dest: /etc/bash_functions owner: root group: root follow: yes force: yes backup: yes mode: "0644" state: present tags: - default - source_sys_bashrc - name: Register bash aliases and functions to global bashrc become: yes ansible.builtin.blockinfile: block: | if [ -f /etc/bash_aliases ]; then . /etc/bash_aliases fi if [ -f /etc/bash_functions ]; then . /etc/bash_functions fi path: /etc/bash.bashrc prepend_newline: yes marker: "# {mark} ANSIBLE MANAGED SYSTEM-WIDE BASH ALIASES AND FUNCTIONS BLOCK" insertafter: EOF create: yes owner: root group: root backup: yes state: present tags: - default - source_sys_bashrc - name: Start XDG configuration tasks if in servers group when: "'servers' in group_names and ansible_connection != 'local'" become: yes block: - name: Create XDG user home directory environment variables ansible.builtin.copy: src: files/servers/xdg/user-dirs.defaults dest: /etc/xdg/user-dirs.defaults owner: root group: root follow: yes force: yes backup: yes mode: "0644" state: present - name: Create XDG user home directory environment variables ansible.builtin.copy: src: "files/servers/{{ ansible_facts['user_id'] }}/xdg/user-dirs.dirs" dest: "{{ ansible_facts['user_dir'] }}/.config/user-dirs.dirs" owner: root group: root follow: yes force: yes backup: yes mode: "0644" state: present tags: - default - create_xdg_config - servers_exclusive - name: Start XDG configuration tasks if current host in specified group when: "personal_computers in group_names or ansible_connection == 'local'" become: yes block: - name: Create XDG user home directory environment variables ansible.builtin.copy: src: files/locals/xdg/user-dirs.defaults dest: /etc/xdg/user-dirs.defaults owner: root group: root follow: yes force: yes backup: yes mode: "0644" state: present - name: Create XDG user home directory environment variables ansible.builtin.copy: src: "files/locals/{{ ansible_facts['user_id'] }}/xdg/user-dirs.dirs" dest: "{{ ansible_facts['user_dir'] }}/.config/user-dirs.dirs" owner: root group: root follow: yes force: yes backup: yes mode: "0644" state: present tags: - default - create_xdg_config - locals_exclusive - name: Start SSH configuration tasks if current host in specified group when: "personal_computers in group_names or ansible_connection == 'local'" become: yes block: - name: Create user SSH configuration ansible.builtin.copy: src: "files/locals/ssh/{{ ansible_facts['user_id'] }}/config" dest: "{{ ansible_facts['user_dir'] }}/.ssh/config" follow: yes force: yes backup: yes owner: "{{ ansible_facts['user_id'] }}" group: "{{ ansible_facts['user_id'] }}" mode: "0600" state: present tags: - default - create_ssh_config - locals_exclusive - name: Import GPG private keys ansible.builtin.include_role: name: lockdown defaults_from: main vars_from: main handlers_from: main tasks_from: gpg vars: gpg_keys_origin_host: localhost gpg_origin_private_key_passwords: "{{ gpg_import_passwords | split(' : ') }}" tags: - default - import_gpg_privkeys # @TODO separate below task as lockdown role task, and maybe associated variables to lockdown role defaults/vars dirs # @NOTE below depends on variable 'gpg_signing_key' and 'gpg_or_ssh_git_signing' from 'vars_prompt' playbook field # @NOTE below depends on variable 'gpg_origin_private_keyids' and 'files_mode' found in lockdown role defaults/vars dirs - name: Install and configure git block: - name: Install git package ansible.builtin.package: name: git state: latest - name: Configure git installation block: - name: Configure git name community.general.git_config: name: user.name scope: global state: present value: "{{ git_config_name }}" - name: Configure git email community.general.git_config: name: user.email scope: global state: present value: "{{ git_config_email }}" - name: Configure git signing key block: - name: Configure git signing GPG key when: gpg_or_ssh_git_signing == "gpg" block: - name: Configure specified git signing GPG key when: gpg_preferred_signing > -1 community.general.git_config: name: user.signingkey scope: global state: present value: "{{ gpg_origin_private_keyids[gpg_preferred_signing] }}" - name: Configure random git signing GPG key when: gpg_preferred_signing <= -1 community.general.git_config: name: user.signingkey scope: global state: present value: "{{ gpg_origin_private_keyids | random }}" register: randomized_gpg_key_preference - name: Configure git signing SSH key when: gpg_or_ssh_git_signing == "ssh" block: - name: Acquire SSH key-pairs from other system when: not files_mode block: - name: Acquire private SSH keys from other system delegate_to: "{{ ssh_keypairs_origin_host }}" # @TODO variable needs declaration/definition ansible.builtin.command: argv: - cat - ~/.ssh/"{{ item }}.ppk" loop: "{{ ssh_origin_keypairs_paths }}" # @TODO variable needs declaration/definition--should have max 2 items each without file extension, with private and then public keys having same basename register: ssh_secrets - name: Find SSH public keys in other system delegate_to: "{{ ssh_keypairs_origin_host }}" # @TODO variable needs declaration/definition ansible.builtin.command: argv: - cat - ~/.ssh/"{{ item }}.pub" loop: "{{ ssh_origin_keypairs_paths }}" # @TODO variable needs declaration/definition--should have max 2 items each without file extension, with private and then public keys having same basename register: ssh_nonsecrets - name: Create private SSH keys ansible.builtin.copy: content: "{{ item }}" dest: "{{ ansible_facts['user_dir'] }}/.ssh/id_ed25519_git.ppk" force: yes backup: yes mode: "0600" state: present loop: "{{ ssh_secrets.results }}" register: created_ssh_private_keys - name: Create public SSH keys ansible.builtin.copy: content: "{{ item }}" dest: "{{ ansible_facts['user_dir'] }}/.ssh/id_ed25519_git.pub" force: yes backup: yes mode: "0644" state: present loop: "{{ ssh_nonsecrets.results }}" register: created_ssh_public_keys - name: Acquire SSH key-pairs when: files_mode block: - name: Transfer private SSH keys ansible.builtin.copy: src: files/all/ssh/id_ed25519_git.ppk # @TODO change path if and when moved into lockdown role task file and create corresponding file in lockdown role files dir dest: "{{ ansible_facts['user_dir'] }}/.ssh/id_ed25519_git.ppk" force: yes backup: yes mode: "0600" state: present register: created_ssh_private_key - name: Transfer public SSH keys ansible.builtin.copy: src: files/all/ssh/id_ed25519_git.pub # @TODO change path if and when moved into lockdown role task file and create corresponding file in lockdown role files dir dest: "{{ ansible_facts['user_dir'] }}/.ssh/id_ed25519_git.pub" force: yes backup: yes mode: "0644" state: present register: created_ssh_public_key - name: Configure acquired, specified SSH public key as git signing key when: ssh_preferred_signing > -1 and not files_mode community.general.git_config: name: user.signingkey scope: global state: present value: "{{ created_ssh_public_keys.results[ssh_preferred_signing] }}" # @TODO this variable needs declaration/definition - name: Configure acquired, random SSH public key as git signing key when: ssh_preferred_signing <= -1 and not files_mode community.general.git_config: name: user.signingkey scope: global state: present value: "{{ created_ssh_public_keys.results | random }}" # @TODO this variable needs declaration/definition register: randomized_ssh_pubkey_preference - name: Configure transferred SSH public key as git signing key when: ssh_preferred_signing <= -1 and files_mode community.general.git_config: name: user.signingkey scope: global state: present value: "{{ created_ssh_public_key.dest }}"