6

More Ansible on AWS for Sidekiq

 3 years ago
source link: https://fuzzyblog.io/blog/aws/2016/12/03/more-ansible-on-aws-for-sidekiq.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

More Ansible on AWS for Sidekiq

Dec 3, 2016

So, much like the Godfather, just when I think I'm out, Ansible pulls me back in… Yesterday I tackled using Ansible to manage Sidekiq. Today I'm going to bring you:

  • Installing Sidekiq as a service
  • Viewing the status of the service

Let's start with installing Sidekiq as a service. Happily Mike Perham has built Sidekiq to run as a service (and thanks to Mike for the service configuration; noted and appreciated). Here's what you need:

playbook: playbook_service_install_and_start_sidekiq.yml

role: service_install_and_start_sidekiq.yml

---
- name: prevent sidekiq init from running if it has already been done
  stat: path=/etc/init/sidekiq.conf
  register: sidekiq_init_installed

- name: Copy sidekiq init template to init.d dir
  template: src=sidekiq_perham_init.j2 dest=/etc/init/_worker.conf owner=root group=root force=yes
  template: src=sidekiq_perham_init.j2 dest=/etc/init/sidekiq.conf owner=root group=root force=yes
  sudo: yes
  when: sidekiq_init_installed.stat.exists == False

- name: start_sidekiq
  service: name=sidekiq state=started enabled=yes

template: sidekiq_perham_init.js

# /etc/init/sidekiq.conf - Sidekiq config
# source: https://github.com/mperham/sidekiq/blob/master/examples/upstart/sidekiq.conf

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Sidekiq instances with
# Upstart, Ubuntu's native service management tool.
#
# See workers.conf for how to manage all Sidekiq instances at once.
#
# Save this config as /etc/init/sidekiq.conf then manage sidekiq with:
#   sudo start sidekiq index=0
#   sudo stop sidekiq index=0
#   sudo status sidekiq index=0
#
# Hack Upstart's reload command to 'quiet' Sidekiq:
#
#   sudo reload sidekiq index=0
#
# or use the service command:
#   sudo service sidekiq {start,stop,restart,status}
#

description "Sidekiq Background Worker"

# This script is not meant to start on bootup, workers.conf
# will start all sidekiq instances explicitly when it starts.
#start on runlevel [2345]
#stop on runlevel [06]

# change to match your deployment user
setuid 
setgid 
env HOME=

respawn
respawn limit 3 30

# TERM is sent by sidekiqctl when stopping sidekiq. Without declaring these as
# normal exit codes, it just respawns.
normal exit 0 TERM

# Older versions of Upstart might not support the reload command and need
# this commented out.
reload signal USR1

# Upstart waits 5 seconds by default to kill the a process. Increase timeout to
# give sidekiq process enough time to exit.
kill timeout 15

#instance $index
instance 0

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rbenv
exec /bin/bash <<'EOT'
  # Pick your poison :) Or none if you're using a system wide installed Ruby.
  # rbenv
  # source /home/apps/.bash_profile
  # OR
  # source /home/apps/.profile
  # OR system:
  # source /etc/profile.d/rbenv.sh
  #
  # rvm
  # source /home/apps/.rvm/scripts/rvm
  source 

  # Logs out to /var/log/upstart/sidekiq.log by default

  cd 
  #exec bundle exec sidekiq -i ${index} -e production
  exec bundle exec sidekiq -i 0 -e production
EOT
end script

output: 

ansible-playbook -i inventories/production2 playbook_service_install_and_start_sidekiq.yml
 [WARNING]: While constructing a mapping from
/Users/sjohnson/Dropbox/appdatallc/ansible/roles/service_install_and_start_sidekiq/tasks/main.yml, line 6, column 3, found a duplicate dict
key (template). Using last defined value only.

[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default).
This feature will
be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

PLAY [worker] ******************************************************************

TASK [setup] *******************************************************************
ok: [fiworker3]

TASK [service_install_and_start_sidekiq : prevent sidekiq init from running if it has already been done] ***
ok: [fiworker3]

TASK [service_install_and_start_sidekiq : Copy sidekiq init template to init.d dir] ***
skipping: [fiworker3]

TASK [service_install_and_start_sidekiq : start_sidekiq] ***********************
changed: [fiworker3]

PLAY RECAP *********************************************************************
fiworker3                  : ok=3    changed=0    unreachable=0    failed=0

Once you install this as service you do not want to log into N machines and check if its manually running so now you need this:

playbook: playbook_service_status_sidekiq.yml

role: service_status_sidekiq.yml

--- 
  
- name: display sidekiq's status
  shell: "service sidekiq status"
  register: out

- name: view the output
  debug: var=out.stdout_lines

output:

ansible-playbook -i inventories/production2 playbook_service_status_sidekiq.yml

PLAY [worker] ******************************************************************

TASK [setup] *******************************************************************
ok: [fiworker3]

TASK [service_status_sidekiq : display sidekiq's status] ***********************
changed: [fiworker3]
 [WARNING]: Consider using service module rather than running service

TASK [service_status_sidekiq : view the output] ********************************
ok: [fiworker3] => {
    "out.stdout_lines": [
        "sidekiq (0) start/running, process 7759"
    ]
}

As long as you see a process id here then you know its running. Would it be better to have this report out something like "Out of N boxes, sidekiq is running on N-1"? Sure. And I suspect that I will get there at some point but I have critical pressing needs today – all these examples are being written as part of actual devops that I'm doing now. These blog posts are the time stamped documentation that I can refer back to.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK