- From:
- To:
- Subject: [chef] Re: Re: setting node attr if certain process is running
- Date: Wed, 4 Sep 2013 00:26:10 +0000
ruby_block! That's right, I knew execute didn't feel right.
I'll give your advice a try. Thanks Daniel.
kallen
On Tue, 03 Sep 2013, Daniel DeLeo wrote:
>
>
>
On Tuesday, September 3, 2013 at 2:42 PM,
>
>
wrote:
>
>
>
>
> Hiya,
>
>
>
> I'm creating an internal CI service for my group, and there's this bit I'm
>
> trying to implement, but it's not working yet. I'm hoping someone could
>
> provide
>
> tips. It is possible I'm going about this in an anti-pattern way. Feedback
>
> appreciated:
>
>
>
> When a "worker" node is launched (ec2), a master CI node waits for the
>
> worker
>
> node to finish running chef and become ready to take commands from the
>
> master CI
>
> node. My idea is, the master CI node polls the chef API looking for a
>
> certain
>
> node attribute of this particular worker node.
>
>
>
> On the worker node, in the first chef run, I want to have it set for
>
> itself an
>
> attribute that indicates it's "ready". If it's not ready, it's "pending".
>
> For
>
> now, let's just say node's readiness is satisfied if mysql is running. If
>
> it's
>
> running, the node should set this attr within the recipe:
>
>
>
> node.set['macabre']['salad']['bacon']['state'] = "ready"
>
>
>
> But I'm failing at getting the node to set this correctly.
>
>
>
> This code below was my first try, but it doesn't work at all in that it
>
> falsely
>
> sets "ready" every chef run, regardless if mysql is running or not.
>
> Should this
>
> work the way I've written it?
>
>
>
> # This is falsely setting "ready" every time
>
> if `/sbin/pidof mysql >/dev/null 2>&1`
>
>
>
>
>
>
This returns a string which is a "truthy" value in ruby. You can use
>
system("command") instead.
>
>
> Chef::Log.debug("HIGGS-BOSON: setting bacon state ready")
>
> node.set['macabre']['salad']['bacon']['state'] = "ready"
>
> else
>
> Chef::Log.debug("HIGGS-BOSON: setting bacon state pending")
>
> node.set['macabre']['salad']['bacon']['state'] = "pending"
>
> end
>
>
>
>
>
> And here's my second try. It's failing in that it takes 2 chef client
>
> runs to
>
> actually get the correct state reported: if current node attr state is
>
> "ready",
>
> I stop mysql, then run chef again, the state gets set to "ready" again.
>
> But upon
>
> a second chef run, with mysql still stopped, the state correctly gets set
>
> to
>
> "pending". When I see this kind of thing happening, it tells me I need to
>
> think
>
> about the chef client run in compile time vs run time. I tried the
>
> following,
>
> but it takes 2 chef client runs to see the correct state:
>
>
>
> e = execute "is mysql running" do
>
> action :nothing
>
> command "sleep 0"
>
> user "root"
>
> pidfile="/var/lib/mysql/#{node['fqdn']}.pid"
>
> if File.exists?("#{pidfile}")
>
> Chef::Log.debug("HIGGS-BOSON: setting bacon state ready. pidfile:
>
> #{pidfile}")
>
> node.set['macabre']['salad']['bacon']['state'] = "ready"
>
> else
>
> Chef::Log.debug("HIGGS-BOSON: setting bacon state pending")
>
> node.set['macabre']['salad']['bacon']['state'] = "pending"
>
> end
>
>
>
> end
>
>
>
> e.run_action(:run)
>
You probably want a ruby_block resource here. The part of a resource
>
declaration inside the `do???end` is evaluated immediately at compile time.
>
>
>
>
>
>
> So, yeah. Any advice?
>
>
>
> TIA,
>
> kallen
>
>
>
>
>
>
HTH,
>
>
--
>
Daniel DeLeo
>
>
Archive powered by MHonArc 2.6.16.