Automate ByJG 2.0.0
A very simple script management for automate tasks and run scripts (recipes) across a multiple servers
How it works?
Automate run scripts called “recipes” across a multiple servers. Each recipe is created in your local machine and the it is spreaded to all the servers.
Why this is better than ansible, chef and others?
The answer is not “BETTER THAN SOMETHING” but “DIFFERENT WAY TO DO THINGS”. Ansible and Chef have your own syntax. You have to learn it. Automate just use BASH SCRIPT and there is no other commands.
During this document we’ll highlighting the differences and similarity with the ansible and chef.
Install
The first step is to install ‘automate.sh’
curl -sS https://raw.githubusercontent.com/byjg/automate/master/automate.sh | sudo tee /usr/local/bin/automate > /dev/null
sudo chmod a+x /usr/local/bin/automate
Define the servers list
Once installed the ‘automate’ you need to create the ‘IPs’ file with a list of all servers you want to automate.
Each line must have on IP following the format below:
[username@]IP[:PORT] THE-SERVER-NAME-WITHOUT-SPACE
Example:
10.10.1.1:2200 connection-name
10.10.1.2 other-name
;10.10.1.3 commented
ubuntu@10.10.1.4 with-user-name
server.name.com:1100 with-port
Comments starts with a ‘;’. This file cannot have white spaces. The comments after the server are ignored. They can be used as filter
It is important named carefully because you can filter the execution by this name.
Note for Ansible Users
Ansible have the inventory and groups of servers.
For example, the ansible inventory is:
[webservers]
www1.example.com
www2.example.com
[dbservers]
db0.example.com
db1.example.com
and the AUTOMATE IPs list is:
www1.example.com webservers
www2.example.com webservers
db0.example.com dbservers
db1.example.com dbservers
In fact automate comments is more flexible when we want to mix different groups. For example, imagine we have webservers and dbservers for homolog and live systems? Using automate we could do it:
www1.example.com live-webservers
www2.example.com test-webservers
db0.example.com live-dbservers
db1.example.com test-dbservers
and we could call the recipe like:
automate recipe live
automate recipe webservers
Create your first RECIPE
A recipe is a regular bash script with the extension “.recipe”. This file must reside inside your current folder alongside with the IPs file.
See below an example of the a recipe file called ‘showip.recipe’:
#RECIPE Show the IP server is currently running and the current ubuntu version
echo "$ID: $USER $SERVER $PORT"
lsb_release --all
Note that the line started with “#RECIPE” is a comment of your recipe.
Each script also have five pre-defined variable:
- $ID: The server ID is the position of the server in the IPs file.
- $USER: The ssh username
- $SERVER: The server address
- $PORT: The SSH server port
- $EXTRA1: The extra parameter 1
- $EXTRA2: The extra parameter 2
- $EXTRA3: The extra parameter 3
Note for Ansible Users
The Automate Recipe looks like to a Ansible Playbook. Ansible Playbook are a YAML file and are more rich with a lot of useful plugins. Some functions like start a service, notify commands, etc are well defined. As stated in the ansible documentation: “Reading an ansible playbook is easy”. Automate recipes are just scripts. Do what you scripted. There is no magic.
RECIPE commands
The recipe is PURE bash with some comments and environment variables pre-defined.
The commands are:
#RECIPE comment
It is used only for document your recipe. The syntax is:
#RECIPE This is the comment
(Your recipe here)
#COPY-BEFORE local remote
Copy-Before will copy a file or directory using “scp” before start the recipe. Use the variable $REMOTESERVER to define the remote server.
#COPY-BEFORE locafile $REMOTESERVER:remotepath
#COPY-AFTER local remote
Copy-After will copy a file or directory using “scp” after the end of the recipe execution.
#COPY-AFTER $REMOTESERVER:remotefile localfile
#ONLY-IF-MATCH string
This recipe only will be executed if the current server match with the string. This is ideal for avoid running scripts in other servers.
#SSH-ARGS arguments
Ssh-args will add extra arguments do the SSH command used to connect to the server.
#SSH-ARGS -t
#SSH-KEY /path/to/key
Ssh-key will use the key provided as argument instead to use the system ssh-agent
#SSH-KEY ~/.ssh/id.rsa
#TIMEOUT argument
Defines how much time (in seconds) the SSH will try to connect to the SSH server.
#TIMEOUT 5
Other options
Auto-generate IP from AWS and Digital Ocean
If your servers are from AWS or Digital Ocean, automate 2.0.x can create the IPs file for you.
Amazon EC2
Just type:
automate get-ip aws > IPs
It is necessary you have the AWS CLI
installed and run the command aws configure
in order the this working
Digital Ocean
Just type:
automate get-ip digitalocean > IPs
It is necessary you have the Doctl
installed and run the command doctl auth init
in order the this working
Running
To run just type:
automate showip
where ‘showip’ is the name of the recipe.
After each execution a file ‘/tmp/automate-result.txt’ will be generated with each server as executed and the exit status code. If the exit status code is ‘0’ the execution was successfull.
Example:
server, status
10.10.1.1, 0
10.10.1.2, 0
[email protected], 0
server.name.com, 255
Running a specific line matching with the comment in the file
automate showip GROUP
Running ALL servers and passing EXTRA parameters
automate showip ALL extra1 extra2
Inside the recipe you can use the extra parameters accessing the variables $EXTRA1 and $EXTRA2
Setting up environment variable
Automate by default locate the “*.recipe” files at your current directory. You can specify a directory by setting up the
environment variable AUTOMATE_WORKDIR
like this:
AUTOMATE_WORKDIR=/opt/recipedir