<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>the second phase &#187; Work</title>
	<atom:link href="http://www.phase2.net/category/work/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phase2.net</link>
	<description>confessions of a geek</description>
	<lastBuildDate>Wed, 04 Aug 2010 07:11:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Thoughts on configuration management</title>
		<link>http://www.phase2.net/2010/03/05/thoughts-on-configuration-management/</link>
		<comments>http://www.phase2.net/2010/03/05/thoughts-on-configuration-management/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 01:06:02 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[config management]]></category>
		<category><![CDATA[opsware]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=1076</guid>
		<description><![CDATA[Someone recently asked me &#8211; &#8216;What would your perfect configuration management tool look like?&#8217;.  It took awhile to come up with the answer for the question; after all, configuration management is a large and complex subject.  On top of that, who can ever really say what the perfect anything would be?  I [...]]]></description>
			<content:encoded><![CDATA[<p>Someone recently asked me &#8211; &#8216;What would your perfect configuration management tool look like?&#8217;.  It took awhile to come up with the answer for the question; after all, configuration management is a large and complex subject.  On top of that, who can ever really say what the perfect anything would be?  I can ask you to describe the perfect girl and you&#8217;d probably list off a bunch of traits but you would always fail to name everything.</p>
<p>In any case, I thought I&#8217;d go ahead and share what I told the person who asked.</p>
<h2>Philosophy</h2>
<p>The first thing behind a configuration management needs to be the thought of how it is supposed to interact with the admin.  Is the admin supposed to be using this tool everyday? Once a week?  Do they login just to check their compliance or do they login to perform tasks, modifications and installs with the tool?  The answer for me is obvious &#8211; the tool needs to take over how I do my job.  Let&#8217;s face it, half the day of a normal admin is fixing stuff that other people have mucked with, adding users, installing software, building systems &#8211; all that jazz.</p>
<p>In order to take over my job, the tool needs to be able to accomplish the things I can do on a terminal in a simple manner.  If I need to install a package, the tool needs to know how to do that.  If I want to add a user, it needs to know how to do that.  Add a route or cronjob, edit host files or configurations, the list goes on and on.  However, you can break it down, for 90% of the use cases, to two simple things &#8211; interacting with files and issuing commands.  Windows is a little more difficult, because of its registry and .COM objects and other hidden magic, but in the world of unix derivatives, it largely holds true.</p>
<p>The second part of the philosophy is that no matter what I do in the tool, the tool knows how to make sure my changes stay.  Just like a source version control system, changes that are made outside of the tool are invalid.  If I edit a piece of code and forget to submit it into the SVC system, the next time I sync out the code, my changes are gone.  The same should hold true for any configuration management system &#8211; if I add a user, the tool needs to make sure that user stays.  If I remove a user, it should make sure that user stays deleted.  Any change I would make through the tool would follow suit.  The perfect tool does this automatically; by telling the tool to make a change, it automatically starts checking for and verifying that the change is in place and stays in place.  I shouldn&#8217;t have to tell the tool to always check for my changes or write extra scripts and schedule them to verify my changes still exist.  It&#8217;d be nice if the tool allowed me to detail how it should verify the change still exists but it should have default methods as well.</p>
<p>By enforcing the concept that changes done outside of the tool are invalid and will be removed, you force the admin into using the tool to make his changes, which I stated before, should be the goal of every configuration management system. </p>
<h2>Abstraction</h2>
<p>The next important part a configuration management tool needs to bring to the table is the idea of abstracting the change from the implementation of the change.   The idea of the change, or the resource if you will, needs to be free from how it is implemented on the operating system.  Face it, every OS we deal with does something in a different way &#8211; but why should I need to care about that?  My task is to get the change on the system &#8211; not deal with the different flags and commands each system wants to force me to use.  If I want to add a user, I just want to say &#8216;Add this user to this system&#8217;.  I don&#8217;t want to have to tell the tool &#8216;Well for Linux, use the useradd command.  For AIX, use the mkuser command.  For Windows, do it through this COM object&#8217;.  The same goes for things like packages, scheduled tasks, routes, network mounts, directories, files and many more.</p>
<p>Sure, there will be cases where a resource is OS specific ( again, Windows registry ), but for the most part, the change ( the resource I want configured on the system ) needs to be presented to the user of the tool as a singular entity and method.  To do that, it needs to be abstracted from how the resource is actually configured on the system.  An additional plus would be an API or plugin architecture that allows the admin to develop his own implementations of resources if he needs to.</p>
<h2>Node Hierarchy</h2>
<p>The next goal a configuration management tool needs to strive towards is some type of modularization or node hierarchy.  Every system ever built can be broken into smaller pieces.  The main advantage of this concept is that by breaking a system into smaller pieces, those pieces become units that you can reuse to build other hosts.</p>
<p>With the ability to reuse configured units ( or resources ) and by combining them into bigger units that can also be reused, you create a wonderful opportunity for a sys admin to customize and endless combinations to configure hosts with.  My configuration management tool becomes a big box of legos that I can quickly use to build my systems with.  And hey, every admin loves to play with legos. <img src='http://www.phase2.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Automatic Assignment and Grouping</h2>
<p>The last tool I used accomplished this task well and it&#8217;s something that I think every configuration management tool would benefit greatly from.  The idea behind this is the creation of groups that have a set of criteria defined.  These criteria are used to match against nodes and if a node matches it is automatically assigned as a member to the group.</p>
<p>While this isn&#8217;t anything special in and of itself, when you combine the ability to assign resources and static information to the group, you instantly create a useful way of quickly getting the right resources onto the right systems.  Imagine a group that pulls in all your web servers and makes sure they have the right httpd package or apache user.  It&#8217;s undeniably useful.</p>
<h2>Templating</h2>
<p>One of the main goals of a configuration management system is just that &#8211; manage configurations.  In order to do that, it needs to be able to modify the contents of files in a smart manner.  Being able to create a template of a configuration file gets rid of the horror of duplication.</p>
<p>Imagine a scenario where you have 20 different networks to administer.  That&#8217;s possibly 20 different /etc/resolv.confs to administer.  I don&#8217;t want to keep 20 separate and distinct versions of the file laying around that get deployed ( do you? ) &#8211; instead, a template is a great idea.  What&#8217;s even better is the idea of being able to fill in the variables of the template with information that&#8217;s stored in the management server.  Imagine if I defined a group for each network ( a dynamic one that&#8217;s auto-populated! ) and attached some variables to the group, such as my DNS servers, NTP servers, file server hostnames and other such goodness.  I could then have the agent deploy the template and generate the real config files based off the templates and the variables assigned to the system and/or groups the system belongs to.  I&#8217;m simply providing the recipe that bakes in all my configs.</p>
<h2>Always More!</h2>
<p>I could go on and on and describe each of these things in detail but to sum up the rest of what I would consider necessary in a great configuration management tool, here&#8217;s a list of mostly self-explanatory items.</p>
<ul>
<li>A software repository for storing packages/files to deploy</li>
<li>Good reporting mechanisms to detect drift and keep your manager happy</li>
<li>The ability to quickly deploy/run/schedule scripts and obtain output for certain tasks across your systems</li>
<li>Support for multiple platforms ( read: Windows &#038; Unix )
<li>An API and plugin architecture</li>
</ul>
<p>Additionally, here are some things that I think of &#8216;Nice to Have&#8217; in a tool but not completely necessary.  Why? Because they&#8217;re getting away from the main goal &#8211; management of configurations.</p>
<ul>
<li>Snapshots &#8211; good for comparison of systems</li>
<li>Patching</li>
<li>Build Infrastructure ( running your PXE/DHCP/BOOTP/GHOST systems out of the tool )</li>
<li>Non-java based agents</li>
</ul>
<h2>Perfect? Not quite</h2>
<p>Like I said, there&#8217;s always more that the perfect configuration management tool could use and more specific details for actual implementation of some of the goals and philosophies I&#8217;ve described that I feel are the most important.</p>
<p>I do think many of the tools out there are well on their way to accomplishing these goals &#8211; I just don&#8217;t think any are quite there yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2010/03/05/thoughts-on-configuration-management/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Opsware Custom Attributes and You.</title>
		<link>http://www.phase2.net/2010/03/03/opsware-custom-attributes-and-you/</link>
		<comments>http://www.phase2.net/2010/03/03/opsware-custom-attributes-and-you/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 22:01:36 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[opsware]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=1027</guid>
		<description><![CDATA[I realize most of the time I end up complaining about Opsware &#8211; that&#8217;s generally because it&#8217;s part of the human condition.  We say stuff when we&#8217;re upset or angry or don&#8217;t like something.  How many times have you ever called up the phone company to tell them &#8216;Great job!&#8217;
Yeah, I thought so.
So I figured [...]]]></description>
			<content:encoded><![CDATA[<p>I realize most of the time I end up complaining about Opsware &#8211; that&#8217;s generally because it&#8217;s part of the human condition.  We say stuff when we&#8217;re upset or angry or don&#8217;t like something.  How many times have you ever called up the phone company to tell them &#8216;Great job!&#8217;</p>
<p>Yeah, I thought so.</p>
<p>So I figured I&#8217;d write an article on one of the great things I love about Opsware &#8211; Custom Attributes! Combined with Dynamic Groups, these puppies provide the ability to create scripts that I don&#8217;t have to duplicate for different hosts.  </p>
<p>First, however, I should explain what Dynamic Groups are.  Dynamic Groups allow the user to group systems based on certain criteria.  For instance, you want all the systems in a certain network to be grouped together.  Whenever you add a system from that network into Opsware, it automatically becomes a member of that group.  Neat by itself but nothing extraordinary.</p>
<p>However, you can assign Custom Attributes ( further known as CAs ) to the Dynamic Group.  So for my new dynamic group that I created ( for example, a group that pulls in all hosts in the 192.168.0.0/24 network ), I can assign some CAs to the group and the CAs get assigned to each host within the group.</p>
<p>You may ask yourself, &#8216;Why is this useful?&#8217;.  It&#8217;s not yet.  There&#8217;s one more piece that&#8217;s missing from the puzzle.  The piece that is missing is a software package that Opsware comes with &#8211; Agent Tools.  When you install the Agent Tools, it comes with a set of python Opsware APIs and small scripts that use the API to make calls back to the master Opsware system and get information &#8211; including those CAs!</p>
<p>Armed with these 3 pieces, it becomes easy to create a script that uses the CAs that are dynamically assigned to your host to do all sorts of things.  For example, let&#8217;s say you want to create a script that checks your /etc/resolv.conf on any system in that 192.168.0.0/24 network.  First, we&#8217;ll create the dynamic group and assign it the correct device membership.</p>
<p>Next, edit the group and add a CA named something like &#8216;DNS_SERVERS&#8217;.  For the value, put in a DNS server on separate lines and then save your group.  Make sure you&#8217;ve got the agent tools package installed and we can run a simple test.</p>
<blockquote class='terminal'><p>
[root@frenzy1a.star.dev:~]# /opt/opsware/agent_tools/get_cust_attr.sh DNS_SERVERS<br />
192.168.0.20<br />
192.168.0.21
</p></blockquote>
<p>With that information, we can create a pretty simple shell or python script ( pick your poison ) to make sure that our /etc/resolv.conf has those servers defined.  For kicks, here&#8217;s an example script that checks to make sure the IPs in the DNS_SERVER CA are set in /etc/resolv.conf.  You could easily modify this so that it actually inserts the values.</p>
<pre class="brush: python;">
#!/opt/opsware/agent/bin/python
import sys
import re
from string import split

sys.path.append('/opt/opsware/agent_tools/')
import agenttools_common
from pytwist.com.opsware.custattr import NoSuchFieldException

def searchFile(file,pattern):
	found = 0
	search = re.compile(pattern)
	try:
		f = open(file, &quot;r&quot;)
	except IOError:
		sys.stderr.write(&quot;Could not open file %s.\n&quot; % (file))
		sys.exit(3)

	for line in f.readlines():
		if search.match(line):
			found = 1
			break
	return found

def main(args):
	ts = agenttools_common.ts
	servers = {}
	result = 0
	hostref = agenttools_common.getServerRef()

	try:
		custattr = ts.server.ServerService.getCustAttr(hostref, &quot;DNS_SERVERS&quot;, 1)
	except NoSuchFieldException:
		sys.stderr.write(&quot;Could not find custom attribute DNS_SERVERS.\n&quot;)
		sys.exit(3)

	servers = split(custattr)
	for s in servers:
		found = searchFile(&quot;/etc/resolv.conf&quot;,&quot;^nameserver\s+&quot; + s)
		if not found:
			sys.stderr.write(&quot;The server %s was not configured in /etc/resolv.conf\n&quot; % (s))
			result = 1

	return result

if __name__ == '__main__':
	sys.exit(main(sys.argv[1:]))
</pre>
<p>Now if I have another network, say, 192.168.120.0/24, I can do the same thing.  Make the group, assign the membership, create the DNS_SERVERS CA and assign the script and presto &#8211; it&#8217;s done! No duplication of work involved here and I can control the contents of the file from the Opsware console.</p>
<p>One last thing about CAs &#8211; they do support overrides.  For instance, I can override the CA by creating the same named CA on the host itself.  This will override the CA at the group level.  One thing you need to be careful, however, is that you don&#8217;t assign a host into two groups that define the same CA &#8211; there&#8217;s no priority between the groups and they don&#8217;t combine the contents of the CA to make one CA, so you&#8217;ll get random results.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2010/03/03/opsware-custom-attributes-and-you/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Back to work! Opsware and other things.</title>
		<link>http://www.phase2.net/2010/03/02/back-to-work-opsware-and-other-things/</link>
		<comments>http://www.phase2.net/2010/03/02/back-to-work-opsware-and-other-things/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 00:30:08 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[opsware]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=1019</guid>
		<description><![CDATA[I&#8217;ve been getting back into the swing of things and trying to organize my life in an effort to regain my sanity.  One of those things that I&#8217;ve been trying to do is get back into Opsware.  You can find a couple articles of mine where I express my.. dislike.. for certain aspects [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been getting back into the swing of things and trying to organize my life in an effort to regain my sanity.  One of those things that I&#8217;ve been trying to do is get back into Opsware.  You can find a couple articles of mine where I express my.. dislike.. for certain aspects of the product.</p>
<p>I had forgotten about those dislikes and while I&#8217;ve got a much cooler head on now, there are a few things I really would like to see Opsware implement.</p>
<p><strong>#1. The option to remediate an audit by applying/remediating a software policy</strong></p>
<p>Let&#8217;s say I want to install a piece of software called &#8216;p4&#8242;.  I package p4 up into a zip file and create a script that creates the proper p4.sh file.  All is wonderful.  I can apply the software package and remediate it and presto, a system has p4 installed.</p>
<p>However, I want to make sure that p4 file stays in compliance, so I create an audit to check on that.  I create a little script that verifies p4.sh is set correctly and the p4 binary exists.  I have to use an audit because the software compliance only uses the system&#8217;s default package management software ( RPM for RedHat, for example ) to verify that the package is installed.  I&#8217;ve got my audit working and again, all is well.</p>
<p>Well, let&#8217;s say I run my audit and find that on a system I installed p4 on, someone changed the p4.sh.  I want to fix that!  The problem is, the audit has no knowledge of the software policy that can do just that.  Instead, I either need to know ( ie &#8211; have knowledge that the policy exists ) or I have to duplicate the scripts that are in the software policy and put them in the audit, creating a management headache if the script were ever to change.</p>
<p>So, please implement the ability to remediate an audit by attaching and remediating a software policy.</p>
<p><strong>#2. The option to attach an audit from a software policy</strong></p>
<p>Along the lines of #1, once I install that piece of software, I want to make sure that it stays compliant.  To do this, I&#8217;d like to attach an audit.  I can&#8217;t depend on the software policy to determine compliance because, again, it only uses the package manager on the system.  However, in order to do this, I have to manually attach the audit.</p>
<p><strong>#3. Provide the ability to customize how the software policy determines compliance.</strong></p>
<p>Some of these complaints would go away if the software policy module had a more robust way of determining compliance.  In essence, the module simply does a package check to see if the package exists.  If someone removed the binary or changed something else underneath the package manager, the software policy module has no way of determining that.  It&#8217;d be nice if you could specify certain scripts that would enable the software policy to determine it&#8217;s compliance and not just depend on such a blanket statement.</p>
<p>Those 3 things have to be, at the moment, my biggest complaints.  I still don&#8217;t like the CML language and I think they should have gone with just a normal templating system, but that&#8217;s a future discussion.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2010/03/02/back-to-work-opsware-and-other-things/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Opsware joys and headaches</title>
		<link>http://www.phase2.net/2009/06/23/more-opsware-joys-and-headaches/</link>
		<comments>http://www.phase2.net/2009/06/23/more-opsware-joys-and-headaches/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 22:51:50 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=1017</guid>
		<description><![CDATA[The more I work with Opsware, the more I think the tool was just designed with a much different philosophy than my own.  To translate &#8211; the product isn&#8217;t bad, I just don&#8217;t agree with it ( I didn&#8217;t agree with BMC alot more tho&#8217; ).  I&#8217;m much more of a hardcore Puppet [...]]]></description>
			<content:encoded><![CDATA[<p>The more I work with Opsware, the more I think the tool was just designed with a much different philosophy than my own.  To translate &#8211; the product isn&#8217;t bad, I just don&#8217;t agree with it ( I didn&#8217;t agree with BMC alot more tho&#8217; ).  I&#8217;m much more of a hardcore Puppet user than I am anything and while Puppet has it&#8217;s problems, I believe in it&#8217;s methodology completely and I think that is causing some issues as I try and implement Opsware in a more &#8216;puppet&#8217;-ish way.</p>
<p>For instance, OS installs.  Opsware has some OS installation/sequence stuff that&#8217;s neat but nothing that we are seriously looking at using ( for many reasons, such as source control of the ks files and more complicated scripting ).  Instead, we are trying to implement in such a manner that we can do the following:</p>
<p>* Install minimal OS<br />
* Install Opsware agent<br />
* Remediate policies</p>
<p>Once the opsware agent is installed, the system will automatically be put into some dynamic device groups.  These dynamic groups have membership based off certain criteria; they also have software policies attached to them.  That way, when a system is placed into a group or meets a certain criteria and automatically becomes a member of a group, it automatically is assigned to certain software policies that need to be remediated.  This is really cool and can be extremely helpful for organizing your hosts.</p>
<p>The problem here is that the software policies have subpar methods for checking whether the policy is compliant or not.  You can add quite a few items to software policies ( scripts, other policies, packages, app configs ) &#8211; but it basically only checks whether a package is installed ( and it doesn&#8217;t even do that in a satisfactory manner ).  Therefore, you have to take any work that you&#8217;ve done via your software policy and then duplicate that work into an Audit that can check and verify that the work stays in place ( or is in fact, needed at all ).</p>
<p>This brings you to the next issue &#8211; that once an audit figures out that something is wrong, it can&#8217;t fix it by applying the software policy, so once again, you have to duplicate the software policy script into the remediation section of the audit &#8211; that or document the audit somehow to inform the operator to fix the issues by remediating a software policy onto the host.</p>
<p>In the Puppet world, this is an example of *one* thing.  You have a resource.  If you assign that resource to a host, it checks to see if that resource exists.  If it doesn&#8217;t, it adds it.  If someone changes the resource on the host ( not thru Puppet ), then Puppet changes it back.  I don&#8217;t need to define my resource 3 times &#8211; once to install it, once to verify it and once to fix any changes; it&#8217;s all taken care of by the one resource.</p>
<p>I&#8217;ve heard through the rumor-mill that the new 7.8 release of Opsware SA is supposed to have a much better A&#038;R module for auditing and remediating, so I&#8217;m eager to see what changes it brings along.  Hopefully, it and I will agree with each other a little better on how things should be done in the world of configuration management. <img src='http://www.phase2.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Till then, I&#8217;ll keep on truckin&#8217; on.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/06/23/more-opsware-joys-and-headaches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restarting Cisco VPN Subsystem on OS X</title>
		<link>http://www.phase2.net/2009/06/09/restarting-cisco-vpn-subsystem-on-os-x/</link>
		<comments>http://www.phase2.net/2009/06/09/restarting-cisco-vpn-subsystem-on-os-x/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 06:39:14 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[cisco vpn mac]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=1014</guid>
		<description><![CDATA[If you&#8217;re like me and you use your MacBook Pro for work, it might stand to reason that you have to VPN into your work network.  If so, it also may be a good chance that you use the Cisco VPN client and have run into this annoying message:
Error 51: Unable to communicate with [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re like me and you use your MacBook Pro for work, it might stand to reason that you have to VPN into your work network.  If so, it also may be a good chance that you use the Cisco VPN client and have run into this annoying message:</p>
<p><strong>Error 51: Unable to communicate with the VPN subsystem</strong></p>
<p>Thankfully, the solution is rather simple.  Open up your favorite terminal client and simply type:</p>
<pre class='console'>
sudo /System/Library/StartupItems/CiscoVPN/CiscoVPN restart
</pre>
<p>Enter your password and it&#8217;ll restart the subsystem.  Then just re-open the Cisco VPN client and you&#8217;re golden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/06/09/restarting-cisco-vpn-subsystem-on-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formatting fixes incoming</title>
		<link>http://www.phase2.net/2009/06/03/formatting-fixes-incoming/</link>
		<comments>http://www.phase2.net/2009/06/03/formatting-fixes-incoming/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 18:34:43 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Website]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[blog gitorious]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=985</guid>
		<description><![CDATA[So I&#8217;ve found some issues with this theme &#8211; namely it doesn&#8217;t have any concept of pre text for code/console display for tech docs and it doesn&#8217;t like to bold text.
I&#8217;ll be fixing some of the formatting issues hopefully tonight and then will post my Gitorious on RHEL5 setup tutorial and the pains I went [...]]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;ve found some issues with this theme &#8211; namely it doesn&#8217;t have any concept of pre text for code/console display for tech docs and it doesn&#8217;t like to bold text.</p>
<p>I&#8217;ll be fixing some of the formatting issues hopefully tonight and then will post my Gitorious on RHEL5 setup tutorial and the pains I went through to get there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/06/03/formatting-fixes-incoming/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gitorious setup: RSTRING_LEN in rdiscount</title>
		<link>http://www.phase2.net/2009/06/02/gitorious-setup-rstring_len-in-rdiscount/</link>
		<comments>http://www.phase2.net/2009/06/02/gitorious-setup-rstring_len-in-rdiscount/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 22:29:20 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=983</guid>
		<description><![CDATA[Ran into an issue recently where I was trying to install gitorious on a local RHEL5 system.  The site would crash every time I tried to view a repo with the error:
ruby: symbol lookup error: /usr/lib64/ruby/gems/1.8/gems/rdiscount-1.3.1.1/lib/rdiscount.so: undefined symbol: RSTRING_LEN
The solution ended up being the following &#8211; In the file /usr/lib64/ruby/1.8/x86_64-linux/ruby.h ( note I&#8217;m running [...]]]></description>
			<content:encoded><![CDATA[<p>Ran into an issue recently where I was trying to install gitorious on a local RHEL5 system.  The site would crash every time I tried to view a repo with the error:</p>
<pre class='console'>ruby: symbol lookup error: /usr/lib64/ruby/gems/1.8/gems/rdiscount-1.3.1.1/lib/rdiscount.so: undefined symbol: RSTRING_LEN</pre>
<p>The solution ended up being the following &#8211; In the file <strong>/usr/lib64/ruby/1.8/x86_64-linux/ruby.h</strong> ( note I&#8217;m running on 64bit, on 32bit it&#8217;d be /usr/lib/ruby/1.8/i386-linux/ ), add these lines somewhere near the top:</p>
<pre class='console'>
#define RSTRING_LEN(s) (RSTRING(s)->len)
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
</pre>
<p>After that, uninstall and reinstall rdiscount</p>
<pre class='console'>
gem uninstall rdiscount
gem install rdiscount -v 1.3.1.1
</pre>
<p>And you should be good to go.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/06/02/gitorious-setup-rstring_len-in-rdiscount/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Score one for Opsware</title>
		<link>http://www.phase2.net/2009/05/12/score-one-for-opsware/</link>
		<comments>http://www.phase2.net/2009/05/12/score-one-for-opsware/#comments</comments>
		<pubDate>Wed, 13 May 2009 04:41:06 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=963</guid>
		<description><![CDATA[I know I&#8217;ve said some bad things about the tool in some past posts but I&#8217;ll give credit where credit is due &#8211; the global shell in Opsware is amazing &#8211; especially when you&#8217;re dealing with Windows hosts.  To be able to quickly write bash scripts to go across all my Windows hosts to [...]]]></description>
			<content:encoded><![CDATA[<p>I know I&#8217;ve said some bad things about the tool in some past posts but I&#8217;ll give credit where credit is due &#8211; the global shell in Opsware is amazing &#8211; especially when you&#8217;re dealing with Windows hosts.  To be able to quickly write bash scripts to go across all my Windows hosts to get registry keys is pure win.</p>
<p>I&#8217;ve also got to say &#8211; the further I dig into the tool, the more I enjoy how much you can customize with it.  True &#8211; it&#8217;s not always the easiest thing to do and the interface leaves *alot* to be desired ( the Custom Script section in A&#038;R is on top of my list right now.. ) but they do provide tools for you to do alot of what you can&#8217;t do with the interface.</p>
<p>For instance, there is a python API that you can install on your hosts that lets you pull down certain data &#8211; things like custom attributes.  This is a big win because it means you can write a single script for checking something out and have it pull in some of those custom attributes.   Maybe they&#8217;ll deploy a newer version of python with it next time &#8211; 1.5.2 is pretty old.  ( hint, hint )</p>
<p>Don&#8217;t get me wrong &#8211; things aren&#8217;t all peachy yet &#8211; the custom scripts section still needs alot of work ( fixed width font, tab widths, ability to link or import scripts from the library, passing arguments to the remediation script, etc ) but as I go deeper into the tool, I also see that things aren&#8217;t quite as bad as I thought.  I&#8217;m still not sold on some of the philosophy behind how they do things like managing certain resources as whole resources with methods, rather than as individual bits of config files that you have to manage separately but with some of the stuff I&#8217;ve been getting into, things seem to be getting better and will make the tool a bit easier to use.</p>
<p>Hopefully I&#8217;ll have more to say in the near future but I don&#8217;t want to ruin anything. <img src='http://www.phase2.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/05/12/score-one-for-opsware/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bad press is bad press, even if it&#8217;s old.</title>
		<link>http://www.phase2.net/2009/05/04/bad-press-is-bad-press-even-if-its-old/</link>
		<comments>http://www.phase2.net/2009/05/04/bad-press-is-bad-press-even-if-its-old/#comments</comments>
		<pubDate>Tue, 05 May 2009 07:24:22 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Interesting Links]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=958</guid>
		<description><![CDATA[One of the things we struggle with at work is the allocation of resources.  We&#8217;re all working on so many projects at once that it&#8217;s hard to tell when we&#8217;ve been assigned more work than we can really accomplish.  Since we use traditional waterfall project management this often means that we have to [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things we struggle with at work is the allocation of resources.  We&#8217;re all working on so many projects at once that it&#8217;s hard to tell when we&#8217;ve been assigned more work than we can really accomplish.  Since we use traditional waterfall project management this often means that we have to push back task deadlines because someone didn&#8217;t realize that I couldn&#8217;t do 3 days worth of work in 5 hours.</p>
<p>In that vein, to help, I&#8217;ve been researching online project management tools.  One of the more well-known products is <a href="http://www.basecamphq.com">Basecamp</a> by 37 Signals.  It&#8217;s a subscription based service so before I signed up, I figured I&#8217;d do a little researching on them and .. wow.  About 3 years ago there was a rather large altercation where one of the 37 signal members decided to fleece a few customers by posting their support emails.  Although he pleaded innocent, simply because he didn&#8217;t use some specific words, the intent was plainly obvious.  ( Most of the blogs are linked from <a href="http://www.whybasecampsux.org/">here</a> )</p>
<p>In any case, after about a 1 hour reading session of scouring blogs and other comments and reading the responses of the 37 Signal employees and CEO in their defense of their asinine move, I decided to move on and not bother with the product.  I don&#8217;t even really care if their product could offer us what we need &#8211; their arrogance leaves a bad taste.</p>
<p>Yeah, I might have been just a small puny customer and they&#8217;ve got millions and an endorsement by the NY Times &#8211; It just goes to show that even after several years, bad press is still bad press and can lose customers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/05/04/bad-press-is-bad-press-even-if-its-old/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grrrrrr.  More Opsware troubles.</title>
		<link>http://www.phase2.net/2009/04/29/grrrrrr-more-opsware-troubles/</link>
		<comments>http://www.phase2.net/2009/04/29/grrrrrr-more-opsware-troubles/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 06:27:38 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Photography]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[opsware]]></category>

		<guid isPermaLink="false">http://www.phase2.net/?p=952</guid>
		<description><![CDATA[The more I use Opsware, the more I don&#8217;t understand about this product.
I finally dove into the application configurations which try and use CML ( an Opsware templating language ) to model how a file should look.  It&#8217;s not the best language by any means but we&#8217;ll skip over that small detail for now. [...]]]></description>
			<content:encoded><![CDATA[<p>The more I use Opsware, the more I don&#8217;t understand about this product.</p>
<p>I finally dove into the application configurations which try and use CML ( an Opsware templating language ) to model how a file should look.  It&#8217;s not the best language by any means but we&#8217;ll skip over that small detail for now.  The area of pain tonight is the use of configuration templates between audits and actually assigning the application configuration to a host.</p>
<p>So, for example, let&#8217;s say I want to model the /etc/yum.conf file &#8211; I create a template in CML and lets just say ( after 5 hours.. ) it works and can read a perfectly good /etc/yum.conf file.  Now, I&#8217;ve got two options what to do with this template.  I can create an Application Configuration and attach the yum.conf template to that, then attach the application config to a host.  Once I do that, I can input values for the template and &#8216;push&#8217; the template ( filled in with values ) down to the host.  This would be the ideal thing to do if the Application compliance actually told you which application configuration was out of compliance but no luck there!  In other words, if someone ever mucked with my yum.conf file, the host would show as not being compliant but it wouldn&#8217;t tell me that it was yum that wasn&#8217;t compliant.</p>
<p>So, my second option is to use an Audit.  Audit&#8217;s can make use of the configuration template without the need to attach it to a host or create an application configuration object.  It works with the files a bit differently however.  To use the config template, I attach it to my audit and then have it pull in that file from the host and parse it.  Now, unless that config is already perfect, my config template will fail.  I usually have to end up going to the host I&#8217;m using as a source and modify the /etc/yum.conf till the template will read the file in.</p>
<p>Once that&#8217;s accomplished, we can move to the next step.  All the items in /etc/yum.conf that the template understands show up as links.  I can click one of these items and set a value.  For example ( because that was a vague explanation ), the config value &#8216;tolerant=1&#8242; shows up in the audit.  I can click on the &#8216;1&#8242; and say &#8216;Make sure in /etc/yum.conf that the value for tolerant is equal to 1&#8242;.  Once I&#8217;ve sorted out all the config items and set them to their appropriate values, I can save the audit.</p>
<p>Next, I ran my audit against the host I had been using for the audit and all went fine.  I tried to test changing a value on the host; I went over to the host and changed &#8216;tolerant=0&#8242; in /etc/yum.conf.  I reran the audit and sure enough, it spotted the error and asked me to remediate.  So far, so good.  My next test, I wanted to see what would happen if someone put something into the config that the template didn&#8217;t know about ( let&#8217;s say someone accidentally catted some characters into the file ).  So I went to the end of the file and wrote &#8216;blah=123&#8242; and saved it.</p>
<p>Another run of the audit and again, it tells me that the /etc/yum.conf has failed.  This time, however, it&#8217;s at a loss to exactly say what&#8217;s wrong.  Instead, when I diff the two files in Opsware it gives me a completely blank file for what the file currently is ( which is wrong ) and then it gives me what the file should look like ( which looks perfectly fine ).  So I figured I&#8217;d try and remediate it.  However, when I try and do that, Opsware complains that it can&#8217;t remediate the file because it doesn&#8217;t know about &#8216;blah=123&#8242;.  In other words, it can&#8217;t fix the file, even though it gave me a good example of what it should be, because there is an item that it doesn&#8217;t know about that is causing the issue.</p>
<p>Huh?</p>
<p>I mean, it knows that the file is bad.  It knows what the file should look like &#8211; it even showed me!  So why in the dang-farnit-name-of-all-that-is-holy why doesn&#8217;t it just recreate the file with what it showed me?  Why does it even care about &#8216;blah=123&#8242;?  It&#8217;s not in the template, it&#8217;s invalid data, smite it! Kill it! Just rewrite my damn file.</p>
<p>The more ironic thing is that if I do the same tests with an Application Configuration, it works fine!  I can go add &#8216;blah=123&#8242; to the file, it tells me that &#8217;something&#8217; is out of compliance, so I push the yum.conf back down and it recreates the file on the host perfectly.  Bad data gone.  So again, another example where two modules of this product just do NOT work together.  The audit didn&#8217;t even recognize that I have a application configuration already attached to the host.  Why doesn&#8217;t it just detect that and say &#8216;Oh, the file isn&#8217;t like what you said it should be and you&#8217;ve got the application configuration already assigned, do you want me to repush the config down?&#8217;</p>
<p>At the minimum, the audit should just recreate the file how it&#8217;s specified in the audit and how it&#8217;s displayed to me in the diff &#8211; but it won&#8217;t and so now I&#8217;m stuck again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phase2.net/2009/04/29/grrrrrr-more-opsware-troubles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
