Added role bootstrap
parent
04b571f59c
commit
596c03fe22
@ -0,0 +1,21 @@
|
||||
# Ansible Bootstrap Role
|
||||
|
||||
This role will manage to use another user to connect to the server,
|
||||
if your server hoster configures another root / sudo user as you want to use.
|
||||
This allows you to build one simple playbook and execute it
|
||||
no matter if your server is already configured or not.
|
||||
|
||||
## Example
|
||||
|
||||
My server hoster allows me to define a password for root while configuring the server,
|
||||
then I can connect via SSH using this password to this new server,
|
||||
however I prefer to use another account with sudo privileges.
|
||||
|
||||
Now you can use this role to etablish this workflow to Ansible.
|
||||
Configure Ansible's `remote_user` to be the user you want to give sudo privileges to.
|
||||
Define this role to be the first executed and set the variable `bootstrap_sudo_user`
|
||||
to the user your hoster configures for you.
|
||||
Ansible will try to log in as `remote_user` at first,
|
||||
if this fails, then it will try to log in as `bootstrap_sudo_user`.
|
||||
As long as one of both connection attempts succeeds,
|
||||
the execution of the playbook will continue using the privileges of the first succeeded login.
|
@ -0,0 +1,4 @@
|
||||
bootstrap_used: false
|
||||
|
||||
bootstrap_user: root
|
||||
bootstrap_become_pass: ""
|
@ -0,0 +1,9 @@
|
||||
---
|
||||
|
||||
- user:
|
||||
name: "{{ bootstrap_user }}"
|
||||
state: absent
|
||||
become: yes
|
||||
when:
|
||||
- bootstrap_user != "root"
|
||||
- bootstrap_user != bootstrap_expected_user
|
@ -0,0 +1,19 @@
|
||||
---
|
||||
|
||||
- name: Store facts given by configuration
|
||||
set_fact:
|
||||
bootstrap_expected_user: "{{ ansible_user }}"
|
||||
bootstrap_expected_become_pass: "{{ ansible_become_pass }}"
|
||||
|
||||
- name: Bootstrap shift if required
|
||||
include_tasks: try_else_shift.yml
|
||||
|
||||
- name: Privilege expected user
|
||||
include_tasks: privilege.yml
|
||||
|
||||
- name: Bootstrap shift back if was shifted
|
||||
include_tasks: shift_back.yml
|
||||
when: bootstrap_used
|
||||
|
||||
- name: Deprivilege bootstrap user
|
||||
include_tasks: deprivilege.yml
|
@ -0,0 +1,37 @@
|
||||
---
|
||||
|
||||
- name: Create new user {{ bootstrap_expected_user }}
|
||||
user:
|
||||
state: present
|
||||
name: "{{ bootstrap_expected_user }}"
|
||||
groups:
|
||||
- sudo
|
||||
append: yes
|
||||
password: "{{ bootstrap_expected_become_pass | password_hash('sha512', LOCAL_SALT) }}"
|
||||
update_password: on_create
|
||||
register: bootstrap_expected_user_data
|
||||
|
||||
- name: Copy SSH Keys if bootstraped now
|
||||
when: bootstrap_used
|
||||
block:
|
||||
- name: Retrieve data from user {{ bootstrap_user }}
|
||||
user:
|
||||
name: "{{ bootstrap_user }}"
|
||||
state: present
|
||||
register: bootstrap_user_data
|
||||
- name: Create .ssh directory for user {{ bootstrap_expected_user }}
|
||||
file:
|
||||
path: "{{ bootstrap_expected_user_data.home }}/.ssh"
|
||||
state: directory
|
||||
owner: "{{ bootstrap_expected_user }}"
|
||||
group: "{{ bootstrap_expected_user }}"
|
||||
become: yes
|
||||
- name: Transfer SSH keys to new user
|
||||
copy:
|
||||
remote_src: yes
|
||||
src: "{{ bootstrap_user_data.home }}/.ssh/authorized_keys"
|
||||
dest: "{{ bootstrap_expected_user_data.home }}/.ssh/authorized_keys"
|
||||
owner: "{{ bootstrap_expected_user }}"
|
||||
group: "{{ bootstrap_expected_user }}"
|
||||
mode: u=rw,g=r
|
||||
become: yes
|
@ -0,0 +1,8 @@
|
||||
---
|
||||
|
||||
- set_fact:
|
||||
bootstrap_used: no
|
||||
ansible_user: '{{ bootstrap_expected_user }}'
|
||||
ansible_become_pass: '{{ bootstrap_expected_become_pass }}'
|
||||
|
||||
- meta: reset_connection
|
@ -0,0 +1,12 @@
|
||||
---
|
||||
|
||||
- action: ping
|
||||
ignore_unreachable: true
|
||||
ignore_errors: yes
|
||||
register: pingtest
|
||||
- meta: clear_host_errors
|
||||
- set_fact:
|
||||
bootstrap_used: yes
|
||||
ansible_user: '{{ bootstrap_user }}'
|
||||
ansible_become_pass: '{{ bootstrap_become_pass }}'
|
||||
when: pingtest.failed | d(pingtest.unreachable) | d(false)
|
Loading…
Reference in New Issue