diff options
author | Aaron LI <aly@aaronly.me> | 2018-02-14 00:18:24 +0800 |
---|---|---|
committer | Aaron LI <aly@aaronly.me> | 2018-02-14 00:20:47 +0800 |
commit | 7a63ffd9493b0a8b636de26b8f0954cf08a2b9d9 (patch) | |
tree | ba9e2c9005f630814681b3a10bfc9a00a2e3bac4 | |
download | ansible-dfly-vps-7a63ffd9493b0a8b636de26b8f0954cf08a2b9d9.tar.bz2 |
Init ansible playbook for DFly VPS bootstrap
-rw-r--r-- | .gitignore | 7 | ||||
-rw-r--r-- | LICENSE | 21 | ||||
-rw-r--r-- | README.md | 10 | ||||
-rw-r--r-- | ansible.cfg | 20 | ||||
-rwxr-xr-x | bootstrap.sh | 35 | ||||
-rw-r--r-- | bootstrap.yml | 16 | ||||
-rw-r--r-- | group_vars/all | 5 | ||||
-rw-r--r-- | host_vars/vultr | 6 | ||||
-rw-r--r-- | hosts.yml | 16 | ||||
-rw-r--r-- | roles/bootstrap/handlers/main.yml | 3 | ||||
-rw-r--r-- | roles/bootstrap/tasks/main.yml | 59 | ||||
-rw-r--r-- | roles/bootstrap/templates/sudoers.d_ansible.j2 | 2 |
12 files changed, 200 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68fe279 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*~ +*.swp +*.bak +*.old +*.retry + +/ssh/ @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Aaron LI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..448573a --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +DragonFly BSD Configuration Ansible Playbook +============================================ + +Aaron LI +2017-12-28 + +References +---------- +* Securing a Server with Ansible + https://ryaneschinger.com/blog/securing-a-server-with-ansible/ diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..5ad3e6e --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,20 @@ +# +# Ansible local config file +# See `/etc/ansible/ansible.cfg' for the global config file. +# +# Aaron LI +# 2018-02-12 +# + +[defaults] +inventory = ./hosts.yml + +# uncomment this to disable SSH key host checking +#host_key_checking = False + +[ssh_connection] +pipelining = True + +# SSH arguments to use +# Add 'IdentitiesOnly=yes' +ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o IdentitiesOnly=yes diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..cc0a6a3 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Copyright (c) 2018 Aaron LI +# MIT License +# +# 2018-01-25 +# + +ROOTDIR="${0%/*}" +PLAYBOOK="${ROOTDIR}/bootstrap.yml" +echo "Playbook directory: ${ROOTDIR}" +echo "Playbook: ${PLAYBOOK}" + +SSHDIR="${ROOTDIR}/ssh" +SSHKEY="${SSHDIR}/ansible.key" +if [ -f "${SSHKEY}" ]; then + echo "ERROR: SSH key already exists: ${SSHKEY}" + echo "Target machine already been bootstrapped?" +else + [ ! -d "${SSHDIR}" ] && mkdir -v "${SSHDIR}" + echo "Generating SSH key ..." + ssh-keygen -t ed25519 -C "ansible" -f "${SSHKEY}" + echo "Generated SSH key: ${SSHKEY}" + echo "Bootstrap target by installing Python2.7 ..." + ansible vultr -u root \ + -m raw -a "pkg install -y python27" + ansible-playbook \ + --verbose --diff \ + --ask-pass --ask-become-pass \ + "${PLAYBOOK}" + echo "Bootstrapped the target machine!" + ansible vultr -u ansible -m ping + ansible vultr -u ansible -m command -a whoami + ansible vultr -u ansible -m command -a whoami -b +fi diff --git a/bootstrap.yml b/bootstrap.yml new file mode 100644 index 0000000..d01d38e --- /dev/null +++ b/bootstrap.yml @@ -0,0 +1,16 @@ +--- +# To override the bootstrapping host: +# $ ansible-playbook bootstrap.yml --extra-vars "host=<host>" +# +- name: Bootstrap hosts for Ansible deployment :-) + hosts: "{{ host | default('all') }}" + user: root + gather_facts: false + + vars: + deploy_user: ansible + + roles: + - bootstrap + +# vim: set ft=yaml sw=2: # diff --git a/group_vars/all b/group_vars/all new file mode 100644 index 0000000..9c078f2 --- /dev/null +++ b/group_vars/all @@ -0,0 +1,5 @@ +--- +deploy_user: ansible +ansible_ssh_private_key_file: ./ssh/ansible.key + +# vim: set ft=yaml sw=2: # diff --git a/host_vars/vultr b/host_vars/vultr new file mode 100644 index 0000000..324b8c1 --- /dev/null +++ b/host_vars/vultr @@ -0,0 +1,6 @@ +--- +ansible_ssh_host: vultr.liwt.net +ansible_ssh_port: 8864 +ansible_python_interpreter: /usr/local/bin/python2.7 + +# vim: set ft=yaml sw=2: # diff --git a/hosts.yml b/hosts.yml new file mode 100644 index 0000000..b973ee1 --- /dev/null +++ b/hosts.yml @@ -0,0 +1,16 @@ +--- +# +# Ansible inventory +# +# Aaron LI +# 2018-02-12 +# + +# Use the YAML format +# https://docs.ansible.com/ansible/latest/intro_inventory.html + +all: + hosts: + vultr: + +# vim: set ft=yaml sw=2: # diff --git a/roles/bootstrap/handlers/main.yml b/roles/bootstrap/handlers/main.yml new file mode 100644 index 0000000..6ecf94f --- /dev/null +++ b/roles/bootstrap/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart-sshd + command: service sshd restart diff --git a/roles/bootstrap/tasks/main.yml b/roles/bootstrap/tasks/main.yml new file mode 100644 index 0000000..52eae5d --- /dev/null +++ b/roles/bootstrap/tasks/main.yml @@ -0,0 +1,59 @@ +--- +- debug: var=ansible_play_hosts +- debug: var=deploy_user +- debug: var=ansible_ssh_host +- debug: var=ansible_ssh_port +- debug: var=ansible_ssh_private_key_file + +- name: User - create deployment user account (group) + command: pw groupadd "{{ deploy_user }}" -g 999 + ignore_errors: true + +- name: User - create deployment user account (user) + command: > + pw useradd "{{ deploy_user }}" + -u 999 -g "{{ deploy_user }}" + -m -d "/var/{{ deploy_user }}" + -C "Ansible Deployment" + ignore_errors: true + +- name: SSH - authorized_keys for the deployment user + authorized_key: + user: "{{ deploy_user }}" + state: present + key: "{{ lookup('file', item+'.pub') }}" + with_items: + - "{{ ansible_ssh_private_key_file }}" + +- name: sudo - no password for the deployment user + template: + src: sudoers.d_ansible.j2 + dest: /usr/local/etc/sudoers.d/ansible + mode: 0440 + validate: "visudo -cf %s" + +- name: SSH - disable password auth for the deployment user + blockinfile: + path: /etc/ssh/sshd_config + block: | + Match User {{ deploy_user }} + PasswordAuthentication no + backup: true + validate: "sshd -t -f %s" + notify: restart-sshd + +- name: SSH - disable empty password login + lineinfile: + path: /etc/ssh/sshd_config + regexp: "^#?PermitEmptyPasswords" + line: "PermitEmptyPasswords no" + validate: "sshd -t -f %s" + notify: restart-sshd + +- name: SSH - disable root login + lineinfile: + path: /etc/ssh/sshd_config + regexp: "^#?PermitRootLogin" + line: "PermitRootLogin no" + validate: "sshd -t -f %s" + notify: restart-sshd diff --git a/roles/bootstrap/templates/sudoers.d_ansible.j2 b/roles/bootstrap/templates/sudoers.d_ansible.j2 new file mode 100644 index 0000000..6bd73ec --- /dev/null +++ b/roles/bootstrap/templates/sudoers.d_ansible.j2 @@ -0,0 +1,2 @@ +# Allow user `{{ deploy_user }}` do deployment without password +{{ deploy_user }} ALL=(ALL) NOPASSWD: ALL |