Merge pull request #21 from soulshake/master

Cleanup, mostly
This commit is contained in:
Jérôme Petazzoni
2016-05-28 19:49:33 -07:00
5 changed files with 78 additions and 120 deletions

View File

@@ -1,52 +1,30 @@
FROM debian:jessie
MAINTAINER AJ Bowen <aj@soulshake.net>
RUN apt-get update
RUN apt-get install -y ca-certificates
RUN apt-get install -y groff
RUN apt-get install -y less
RUN apt-get install -y python python-pip
RUN apt-get install -y python-docutils
RUN apt-get install -y sudo
RUN apt-get install -y \
RUN apt-get update && apt-get install -y \
wkhtmltopdf \
bsdmainutils \
ca-certificates \
curl \
groff \
jq \
less \
man \
pssh \
ssh
python \
python-pip \
python-docutils \
ssh \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
RUN pip install awscli
RUN pip install \
awscli \
pdfkit \
PyYAML \
termcolor
RUN apt-get install -y wkhtmltopdf
ENV HOME /home/user
RUN useradd --create-home --home-dir $HOME user \
&& mkdir -p $HOME/.config/gandi \
&& chown -R user:user $HOME
RUN echo "user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Replace 1000 with your user / group id
#RUN export uid=1000 gid=1000 && \
# mkdir -p /home/user && \
# mkdir -p /etc/sudoers.d && \
# echo "user:x:${uid}:${gid}:user,,,:/home/user:/bin/bash" >> /etc/passwd && \
# echo "user:x:${uid}:" >> /etc/group && \
# echo "user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/user && \
# chmod 0440 /etc/sudoers.d/user && \
# chown ${uid}:${gid} -R /home/user
WORKDIR $HOME
RUN echo "alias ll='ls -lahF'" >> /home/user/.bashrc
RUN echo "export PATH=$PATH:/home/user/bin" >> /home/user/.bashrc
RUN mkdir -p /home/user/bin
RUN ln -s /home/user/prepare-vms/scripts/trainer-cli /home/user/bin/trainer-cli
USER user
RUN echo "alias ll='ls -lahF'" >> /root/.bashrc
ENTRYPOINT ["/root/prepare-vms/scripts/trainer-cli"]

View File

@@ -1,27 +1,18 @@
# Trainer tools to prepare VMs for Docker workshops
There are several options for using these tools:
## 1. Prerequisites
### Clone the repo
* [Docker](https://docs.docker.com/engine/installation/)
* [Docker Compose](https://docs.docker.com/compose/install/)
$ git clone https://github.com/soulshake/prepare-vms.git
$ cd prepare-vms
## 2. Clone the repo
$ git clone https://github.com/jpetazzo/orchestration-workshop.git
$ cd orchestration-workshop/prepare-vms
$ docker-compose build
$ mkdir $HOME/bin && ln -s `pwd`/trainer $HOME/bin/trainer
$ ./trainer <commands> # See "Summary of commands" section below
### Via the image
$ docker pull soulshake/prepare-vms
### Submodule
This repo can be added as a submodule in the repo of the Docker workshop:
$ git submodule add https://github.com/soulshake/prepare-vms.git
## Setup
### Export needed envvars
## 3. Preparing the environment
Required environment variables:
@@ -29,46 +20,53 @@ Required environment variables:
* `AWS_SECRET_ACCESS_KEY`
* `AWS_DEFAULT_REGION`
### Update settings.yaml
### 4. Update settings.yaml
If you have more than one workshop:
$ cp settings.yaml settings/YOUR_WORKSHOP_NAME-settings.yaml
$ ln -s settings/YOUR_WORKSHOP_NAME-settings.yaml `pwd`/settings.yaml
$ cp settings/default.yaml settings/YOUR_WORKSHOP_NAME-settings.yaml
Update the `settings.yaml` as needed. This is the file that will be used to generate cards.
Then pass `settings/YOUR_WORKSHOP_NAME-settings.yaml` as an argument to `deploy`, `cards`, etc.
## Usage
### Summary
Summary of steps to launch a batch of instances for a workshop:
* Export the environment variables needed by the AWS CLI (see **Requirements** below)
* `trainer start NUMBER_OF_VMS` to create AWS instances
* `trainer deploy TAG` to run `scripts/postprep.rc` via parallel-ssh
* `trainer pull-images TAG` to pre-pull a bunch of Docker images
* `trainer test TAG`
* `trainer cards TAG` to generate a PDF and an HTML file you can print
### Summary of commands
The `trainer` script can be executed directly.
Summary of steps to launch a batch of instances for a workshop:
* Export the environment variables needed by the AWS CLI (see **2. Preparing the environment** above)
* `./trainer start N` (where `N` is the number of AWS instances to create)
* `./trainer list` to view the list of tags
* `./trainer list TAG` to view the instances with a given `TAG`
* `./trainer deploy TAG settings/somefile.yaml` to run `scripts/postprep.rc` via parallel-ssh
* `./trainer pull-images TAG` to pre-pull a bunch of Docker images to the instances
* `./trainer test TAG`
* `./trainer cards TAG settings/somefile.yaml` to generate a PDF and an HTML file you can print and cut to hand out cards with connection information to attendees
`./trainer` will run locally if all its dependencies are fulfilled; otherwise it will run in a Docker container.
It will check for the necessary environment variables. Then, if all its dependencies are installed
locally, it will execute `trainer-cli`. If not, it will look for a local Docker image
tagged `soulshake/trainer-tools`. If found, it will run in a container. If not found,
the user will be prompted to either install the missing dependencies or download
the Docker image.
tagged `preparevms_prepare-vms` (created automatically when you run `docker-compose build`).
If found, it will run in a container. If not found, the user will be prompted to
either install the missing dependencies or run `docker-compose build`.
## Detailed usage
### Start some VMs
$ trainer start 10
$ ./trainer start 10
A few things will happen:
* Your local SSH key will be synced
* AWS instances will be created and tagged
* A directory will be created
Details below.
#### Sync of SSH keys
When the `start` command is run, your local RSA SSH public key will be added to your AWS EC2 keychain.
@@ -93,31 +91,31 @@ If you create new VMs, the symlinked file will be overwritten.
Instances can be deployed manually using the `deploy` command:
$ trainer deploy TAG
$ ./trainer deploy TAG settings/somefile.yaml
The `postprep.rc` file will be copied via parallel-ssh to all of the VMs and executed.
### Pre-pull images
$ trainer pull-images TAG
$ ./trainer pull-images TAG
### Generate cards
$ trainer cards TAG
$ ./trainer cards TAG settings/somefile.yaml
### List tags
$ trainer list
$ ./trainer list
### List VMs
$ trainer list TAG
$ ./trainer list TAG
This will print a human-friendly list containing some information about each instance.
### Stop and destroy VMs
$ trainer stop TAG
$ ./trainer stop TAG
## ToDo

View File

@@ -1,38 +1,23 @@
prepare-vms:
build: .
container_name: prepare-vms
working_dir: /home/user/prepare-vms
working_dir: /root/prepare-vms
volumes:
- $HOME/.aws/:$HOME.aws/
- $HOME/.ssh/:/home/user/.ssh/
- $HOME/.aws/:/root/.aws/
- /etc/localtime:/etc/localtime:ro
#- /home:/home
- /tmp/.X11-unix:/tmp/.X11-unix
- $SSH_AUTH_DIRNAME:$SSH_AUTH_DIRNAME
- $SCRIPT_DIR/:/home/user/prepare-vms/
#- $SCRIPT_DIR/:$HOME/prepare-vms/
#- $HOME/trainer-tools/
#- $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK)
#- /etc/passwd:/etc/passwd:ro
#- /etc/group:/etc/group:ro
#- /run/user:/run/user
- $PWD/:/root/prepare-vms/
environment:
HOME: /home/user
#SCRIPT_DIR: /home/aj/git/prepare-vms
SCRIPT_DIR: /home/user/prepare-vms
HOME: /home/user
SCRIPT_DIR: /root/prepare-vms
DISPLAY: ${DISPLAY}
SSH_AUTH_SOCK: ${SSH_AUTH_SOCK}
SSH_AGENT_PID: ${SSH_AGENT_PID}
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
DISPLAY: ${DISPLAY}
USER: ${USER}
AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}
AWS_DEFAULT_OUTPUT:
AWS_DEFAULT_OUTPUT: json
AWS_INSTANCE_TYPE: ${AWS_INSTANCE_TYPE}
AWS_VPC_ID: ${AWS_VPC_ID}
entrypoint: /home/user/prepare-vms/scripts/trainer-cli
#entrypoint: trainer
#AWS_DEFAULT_PROFILE: ${AWS_DEFAULT_PROFILE}
#command: /home/user/prepare-vms/trainer-cli
USER: ${USER}
entrypoint: /root/prepare-vms/scripts/trainer-cli

View File

@@ -7,7 +7,7 @@ export AWS_DEFAULT_OUTPUT=text
greet() {
hello=$(aws iam get-user --query 'User.UserName')
echo "Greetings, $hello!"
echo "Greetings, $hello/${USER}!"
}
deploy_hq(){
@@ -53,8 +53,8 @@ deploy_tag(){
source scripts/postprep.rc
echo "Finished deploying $TAG."
echo "You may want to run one of the following commands:"
echo "trainer pull-images $TAG"
echo "trainer cards $TAG"
echo "./trainer pull-images $TAG"
echo "./trainer cards $TAG <settings/somefile.yaml>"
}
link_tag() {
@@ -69,7 +69,6 @@ pull_tag(){
TAG=$1
need_tag $TAG
link_tag $TAG
cards_file=ips.html
if [ ! -s $IPS_FILE ]; then
echo "Nonexistent or empty IPs file $IPS_FILE"
fi
@@ -90,7 +89,7 @@ pull_tag(){
echo "Finished pulling images for $TAG"
echo "You may now want to run:"
echo "trainer cards $TAG"
echo "./trainer cards $TAG <settings/somefile.yaml>"
}
wait_until_tag_is_running() {
@@ -129,7 +128,7 @@ test_tag(){
ip=$(shuf -n 1 $ips_file)
test_vm $ip
echo "Tests complete. You may want to run one of the following commands:"
echo "trainer cards $TAG"
echo "./trainer cards $TAG <settings/somefile.yaml>"
}
test_vm() {
@@ -149,7 +148,6 @@ test_vm() {
"docker-machine version" \
"docker images" \
"docker ps" \
"which fig" \
"curl --silent localhost:55555" \
"sudo ls -la /mnt/ | grep docker" \
"env" \
@@ -276,7 +274,7 @@ run_cli() {
scripts/find-ubuntu-ami.sh -r $AWS_DEFAULT_REGION $*
echo
echo "Protip:"
echo "trainer ami -a amd64 -v 16.04 -t hvm:ebs -N | grep -v ^REGION | cut -d\" \" -f15"
echo "./trainer ami -a amd64 -v 16.04 -t hvm:ebs -N | grep -v ^REGION | cut -d\" \" -f15"
echo
echo "Suggestions:"
suggest_amis
@@ -333,8 +331,8 @@ run_cli() {
describe_tag $TAG
tag_is_reachable $TAG
echo "You may be interested in running one of the following commands:"
echo "trainer ips $TAG"
echo "trainer deploy $TAG <settings/somefile.yaml>"
echo "./trainer ips $TAG"
echo "./trainer deploy $TAG <settings/somefile.yaml>"
;;
opensg)
aws ec2 authorize-security-group-ingress \
@@ -427,8 +425,8 @@ run_cli() {
echo "$IPS" > tags/$TAG/ips.txt
link_tag $TAG
echo "To deploy or kill these instances, run one of the following:"
echo "trainer deploy $TAG <settings/somefile.yml>"
echo "trainer list $TAG"
echo "./trainer deploy $TAG <settings/somefile.yaml>"
echo "./trainer list $TAG"
;;
status)
greet && echo
@@ -466,7 +464,7 @@ run_cli() {
;;
*)
echo "
trainer COMMAND [n-instances|tag]
./trainer <command> [n-instances|tag] [settings/file.yaml]
Core commands:
start n Start n instances
@@ -485,7 +483,7 @@ Extras:
Beta:
ami Look up Amazon Machine Images
cards Generate cards
cards FILE Generate cards
opensg Modify AWS security groups
"
;;

View File

@@ -1,6 +1,6 @@
#!/bin/bash
TRAINER_IMAGE="soulshake/prepare-vms"
TRAINER_IMAGE="preparevms_prepare-vms"
DEPENDENCIES="
aws
@@ -71,11 +71,10 @@ if check_dependencies; then
elif check_image; then
check_ssh_auth_sock
export SSH_AUTH_DIRNAME=$(dirname $SSH_AUTH_SOCK)
docker-compose -f docker-compose.yml run prepare-vms "$@"
docker-compose run prepare-vms "$@"
else
echo "Some dependencies are missing, and docker image $TRAINER_IMAGE doesn't exist locally."
echo "Please do one of the following: "
echo "- run \`docker build -t soulshake/prepare-vms .\`"
echo "- run \`docker pull soulshake/prepare-vms\`"
echo "- run \`docker-compose build\`"
echo "- install missing dependencies"
fi