run.yml


immortal -c run.yml

A configuration file for running/logging/supervising:

cmd: bundle exec unicorn -c unicorn.rb
cwd: /arena/app-1
env:
    DEBUG: 1
    ENVIRONMENT: production
pid:
    follow: /arena/app-1/unicorn.pid
    parent: /arena/app-1/parent.pid
    child: /arena/app-1/child.pid
log:
    file: /var/log/app-1.log
    age: 86400 # seconds
    num: 7     # int
    size: 1    # MegaBytes
    timestamp: true # will add timesamp to log
logger: logger -t unicorn
user: www
wait: 1
require:
  - foo
  - bar

One of the main ideas behind the run.yml is to eliminate an operations/devops dependency while deploying.

The application “micro service” can be shipped with a run.yml and when doing a CI & CD flow, by simple updating the run.yml file, the immortal supervisor could stop, restart, pause, resume the service without need to logging the server and execute does steps.

See the ansible playbook example

require

The require option helps to verify that other services are running before starting, for example, having this services:

/usr/local/etc/immortal
|--foo.yml
|--bar.yml
`--www.yml

if www.yml contains:

require:
  - foo
  - bar

If service foo and bar are not running, the service will not start.

require_cmd

The require_cmd option will execute a command and if the exit status is 0 it will start the service, example:

require_cmd:  test -f /tmp/foo

If file /tmp/foo exists it will start the service otherwise not.

require & require_cmd only apply when starting the process.

example using su

In some cases the full environment of a user is required to be loaded before running the command, therefore the use of the command su user -c becomes handy, example:

cmd: su ec2_user -c "/path/to/bin"
env:
    ENVIRONMENT: production
    AWS_ACCESS_KEY_ID: access
    AWS_SECRET_ACCESS_KEY: secret
    AWS_ACCESS_KEY: access
    AWS_SECRET_KEY: secret
log:
    file: /var/log/bin.log
    age: 86400 # seconds
    num: 7     # int
    size: 1    # MegaBytes

timestamp

By default the option timestamp within the log is set to false, this is in favor of applications that follow the 12 factor and in cases where log is structured “JSON”, it could be parsed easily.

In case a time stamp is required simple set timestamp, example:

log:
    file: /var/log/bin.log
    age: 86400 # seconds
    num: 7     # int
    size: 1    # MegaBytes
    timestamp: true

This will prefix each line with a RFC3339Nano time stamp:

2017-08-03T12:10:31.040165255Z your log ...
comments powered by Disqus