service.running w/ Multiple Redis Instances:

273 views
Skip to first unread message

Matt Silverlock

unread,
Jan 12, 2014, 7:20:44 PM1/12/14
to salt-...@googlegroups.com
Hi all,

Having a couple of issues running two (2) redis instances on Ubuntu 12.04. I'm installing redis-server from a custom PPA (chris-lea/redis-server) and all is going well on that front. From there:

1. I disable the default redis-server via service.dead and enable: False - this doesn't appear to work (redis-server is still running)
2. I pull in the upstart (to /etc/init.d/redis-*) and conf (to /etc/redis/redis-*) files for the two instances (redis-sessions and redis-ratelimit)
3. I run state.highstate
4. Salt (via -l debug) believes these are running as for some reason the default redis-server instance is still running. I believe it's getting 'confused' as it's looking for the redis-server process via ps, and because this doesn't delineate between the redis-sessions and redis-ratelimit instances (the process is called redis-server), it just continues on. If there was a way (without using cmd.run, but I'll use it if I need to?) get the output of upstart (via service <name> status) instead, it'd be much better.

If I manually start (via sudo service redis-sessions/redis-ratelimit start) the instances, all is well. My state file is below. I need to refactor it a little (i.e. use a Jinja template to remove duplication) but this is a first pass so I'm still debugging. Note that the redis instances run as redis:redis as per convention.

Is there a way to spin up two Redis instances on Ubuntu without leaning on cmd.*?


redis-ppa:
  pkgrepo.managed:
    - ppa: chris-lea/redis-server

# redis server
redis-server:
    pkg:
        - installed
        - require:
            - pkgrepo.managed: redis-ppa
    # remove the default redis aservice
    service:
      - dead
      - enable: False

# redis server #1 (session store) upstart
/etc/init.d/redis-sessions:
  file.managed:
    - source: salt://files/redis-sessions.upstart
    - mode: 655
    - user: root
    - group: root
    - require:
      - pkg: redis-server
      - file.directory: /var/lib/redis-sessions
  service:
    - name: redis-sessions
    - running
    - enable: True
    - require:
      - pkg: redis-server
      - file.directory: /var/log/redis
      - file.directory: /var/run/redis
      - service.dead: redis-server

# redis server #1 (session store) config
/etc/redis/redis-sessions.conf:
  file.managed:
    - source: salt://files/redis-sessions.conf
    - mode: 644
    - user: redis
    - group: redis
    - require:
      - pkg: redis-server
      - file.directory: /var/lib/redis-sessions

# redis server #1 (session store) working dir
/var/lib/redis-sessions:
  file.directory:
    - user: redis
    - group: redis
    - mode: 755
    - require:
      - pkg: redis-server

# redis server #2 (rate-limiting) upstart
/etc/init.d/redis-ratelimit:
  file.managed:
    - source: salt://files/redis-ratelimit.upstart
    - mode: 655
    - user: root
    - group: root
    - requires:
      - pkg: redis-server
      - file.directory: /var/lib/redis-ratelimit
  service:
    - name: redis-ratelimit
    - running
    - enable: True
    - require:
      - pkg: redis-server
      - file.directory: /var/log/redis
      - file.directory: /var/run/redis
      - service.dead: redis-server

# redis server #2 (rate-limiting) config
/etc/redis/redis-ratelimit.conf:
  file.managed:
    - source: salt://files/redis-ratelimit.conf
    - mode: 644
    - user: redis
    - group: redis
    - requires:
      - pkg: redis-server
      - file.directory: /var/lib/redis-ratelimit

# redis server #2 (rate-limiting) working dir
/var/lib/redis-ratelimit:
  file.directory:
    - user: redis
    - group: redis
    - mode: 755
    - require:
      - pkg: redis-server

# redis log dir
/var/log/redis:
  file.directory:
    - user: redis
    - group: redis
    - mode: '3755'
    - require:
      - pkg: redis-server

# redis pid dir
/var/run/redis:
  file.directory:
    - user: redis
    - group: redis
    - mode: '3755'
    - require:
      - pkg: redis-server

Corey Quinn

unread,
Jan 12, 2014, 8:45:53 PM1/12/14
to salt-...@googlegroups.com, salt-...@googlegroups.com
Check into the service state's "sig" term. It'll let you define how each service is determined to be running. 
--
You received this message because you are subscribed to the Google Groups "Salt-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to salt-users+...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Matt Silverlock

unread,
Jan 12, 2014, 8:56:51 PM1/12/14
to salt-...@googlegroups.com
I took a quick look at that: my understanding is that sig (http://docs.saltstack.com/ref/states/all/salt.states.service.html#salt.states.service.running) only changes the string used to search for the process with ps

Because the redis process is always called redis-server, this won't solve the problem (I did try it in an earlier iteration). 

It looks like I might be able to use something like:

redis-sessions:
    ...
    module.run:
        - func: upstart.restart (or upstart.restart)
        - m_name: redis-sessions

redis-ratelimit:
    ...
    module.run:
        - func: upstart.restart (or upstart.restart)
        - m_name: redis-ratelimit

I think this might do the trick? It's a bit hacky (it'll restart it on every state.highstate) but I assume it should return a "false" if the restart fails? Would be nice if I could parse the output of upstart.status and only call upstart.start if the former returns False.

Open to other ideas however!

Colton Myers

unread,
Jan 15, 2014, 12:26:32 PM1/15/14
to salt-...@googlegroups.com
I'm thinking it would be fairly trivial to write a custom state which parsed the output of `upstart.status` and restarted if needed.  Beauty of custom states/modules is that you get the full power of python *and* salt, without having to fight jinja.

--
Colton Myers
Reply all
Reply to author
Forward
0 new messages