Giter VIP home page Giter VIP logo

infra's Introduction

SFS Infrastructure

Work-in-progress Ansible setup for Seattle Flu Study infrastructure. Our intent is to describe our infrastructure setup with Ansible (and/or other tools) over time, piece by piece.

Requirements for using this repository:

  • A local copy of the repository, e.g. checked out with git

  • Ansible 2.9+, installed with your preferred installation method

  • Dependencies from Ansible Galaxy installed locally, using ansible-galaxy install -r requirements.yaml

  • For production deployments: credentials for our infrastructure, e.g. an authorized SSH keypair for backoffice.seattleflu.org

  • For local development: a Multipass instance named backoffice (see below)

Organization

The layout of this repository is:

ansible.cfg     — Global Ansible configuration options.

*.yaml          — Playbooks (e.g. backoffice.yaml)

hosts/          — Inventories of hosts
  development   —   …in development
  production    —   …in production

tasks/          — Conceptual groupings of tasks for use by playbooks
  …

files/          — Static configuration files used by playbooks/tasks
  …

Each playbook is intended to (eventually) capture the whole setup of a host or group of hosts. If the playbook for a host becomes unwieldy, we can refactor it into multiple files grouped by functionality.

Future additions should generally follow the example setup in Ansible's documentation.

Running playbooks

To run a playbook in development:

ansible-playbook a-playbook.yaml

To run a playbook in production, change the inventory used:

ansible-playbook a-playbook.yaml -i hosts/production

Writing playbooks

Each playbook is intended to (eventually) capture the whole setup of a host or group of hosts. To share tasks between playbooks, write a role.

Declarative configuration and idempotency are a key feature of Ansible (and other similar tools). When naming plays and tasks, keep this in mind by using statements that declare the desired state ("service X is started") instead of actions ("start service X").

Secrets

Secrets such as passwords and API tokens are encrypted using Ansible Vault and stored in this repo. Ansible Vault uses strong symmetric encryption with a single decryption password shared by all secrets stored in a logical "vault". Ansible automatically decrypts the secrets as necessary when they're referenced by playbooks but must be told how to obtain the vault password (e.g. by asking you, by reading a file, or by running another program). This vault password is stored outside of Ansible, such as in your password manager of choice.

We currently use a single seattleflu vault, which should be used for all secrets except in the very rare case of when the whole team should not have access to a secret. Use the --vault-id seattleflu@prompt option when running ansible, ansible-playbook, or ansible-vault to both specify the seattleflu vault and be asked for the vault password.

Please use encrypted files in preference to encrypted variables, as files are easier to re-encrypt later with a new password (e.g. when someone departs the team).

To encrypt a file:

ansible-vault encrypt --vault-id seattleflu@prompt path/to/file

To check an encrypted file's contents:

ansible-vault view --vault-id seattleflu@prompt path/to/file

Multipass

Multipass is a really nice CLI and GUI tool to spin up Ubuntu VMs on your computer no matter your host OS. The idea is that for local development and testing, this Ansible setup can target a local VM that closely matches production. For now "closely matches" means only the same Ubuntu version, but this will naturally become higher fidelity as we describe more of our infrastructure using Ansible!

Create a backoffice instance:

multipass launch --name backoffice 18.04    # Ubuntu 18.04 LTS

Add your SSH public keys so that Ansible can login via SSH:

ssh-add -L | multipass exec backoffice -- tee -a /home/ubuntu/.ssh/authorized_keys

Now test that Ansible can login by issuing an ad-hoc ping:

ansible backoffice --user ubuntu --module-name ping

This specifies the backoffice host group, which will be found in the default inventory (hosts/development). You should see green text saying something like:

backoffice.multipass | SUCCESS => {
    "ping": "pong",

}

If Ansible cannot login and you recieve a message like:

backoffice.multipass | UNREACHABLE! => {
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname backoffice.multipass: nodename nor servname provided, or not known",
    …
}

Then you should try running

multipass info backoffice

and use the IPv4 address printed out in lieu of the hostname provided in hosts/development

For other troubleshooting, you can get a shell on your new instance at any point with:

multipass shell backoffice

If you want to start from a clean slate, delete the backoffice instance and SSH's remembered host key (to avoid errors about the new instance's different host key):

multipass delete --purge backoffice
ssh-keygen -R backoffice.multipass

Then re-create the instance as above.

infra's People

Contributors

bencap avatar kairstenfay avatar kschwabefry avatar seidelma avatar tsibley avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.