Added info about ignore_errors: True and added a user to the who uses page

This commit is contained in:
Michael DeHaan 2012-08-02 22:08:00 -04:00
parent b9d8ca4f30
commit fa6aa5ef98
18 changed files with 90 additions and 68 deletions

View file

@ -289,7 +289,7 @@ languages:
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -465,7 +465,7 @@ e.g.
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -318,7 +318,7 @@ This way you have an audit trail describing when and why you changed the rules a
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -396,7 +396,7 @@ a simplified syntax for this.</p>
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -409,7 +409,7 @@ tasks &#8211; whether for a QA sytem, build system, or anything you can think of
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -204,7 +204,7 @@ s.parentNode.insertBefore(ga, s);
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -391,7 +391,7 @@ explore, but you already have a fully working infrastructure!</p>
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -410,7 +410,7 @@ Puppet Labs, and is now with <a class="reference external" href="http://rpath.co
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -509,7 +509,7 @@ the program. Stop by the mailing list to inquire about requirements.</p>
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -1568,7 +1568,7 @@ yum name=httpd state=installed</pre>
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -380,7 +380,7 @@ a <a class="reference external" href="https://github.com/ansible/ansible/blob/de
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -422,13 +422,13 @@ a group of systems into multiple roles. Let&#8217;s see what this looks like...
action: command /bin/bar</pre>
</div>
<p>Include directives look like this, and can be mixed in with regular tasks in a playbook:</p>
<div class="highlight-python"><pre>- tasks:
- include: tasks/foo.yml</pre>
<div class="highlight-python"><pre>tasks:
- include: tasks/foo.yml</pre>
</div>
<p>You can also pass variables into includes. We call this a &#8216;parameterized include&#8217;.</p>
<p>For instance, if deploying multiple wordpress instances, I could
contain all of my wordpress tasks in a single wordpress.yml file, and use it like so:</p>
<div class="highlight-python"><pre>- tasks:
<div class="highlight-python"><pre>tasks:
- include: wordpress.yml user=timmy
- include: wordpress.yml user=alice
- include: wordpress.yml user=bob</pre>
@ -535,7 +535,7 @@ package is installed. Try it!</p>
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -150,7 +150,8 @@ s.parentNode.insertBefore(ga, s);
<span class="localtoc"><ul>
<li><a class="reference internal" href="#">Advanced Playbooks</a><ul>
<li><a class="reference internal" href="#tags">Tags</a></li>
<li><a class="reference internal" href="#playbooks-including-playbooks">Playbooks Including Playbooks</a><ul>
<li><a class="reference internal" href="#playbooks-including-playbooks">Playbooks Including Playbooks</a></li>
<li><a class="reference internal" href="#ignoring-failed-commands">Ignoring Failed Commands</a></li>
<li><a class="reference internal" href="#accessing-complex-variable-data">Accessing Complex Variable Data</a></li>
<li><a class="reference internal" href="#accessing-information-about-other-hosts">Accessing Information About Other Hosts</a></li>
<li><a class="reference internal" href="#variable-file-seperation">Variable File Seperation</a></li>
@ -168,8 +169,6 @@ s.parentNode.insertBefore(ga, s);
</ul>
</li>
</ul>
</li>
</ul>
</span>
</li>
@ -234,8 +233,18 @@ reconfigure all of your systems like this:</p>
</div>
<p>This concept works great with tags to rapidly select exactly what plays you want to run, and exactly
what parts of those plays.</p>
</div>
<div class="section" id="ignoring-failed-commands">
<h2>Ignoring Failed Commands<a class="headerlink" href="#ignoring-failed-commands" title="Permalink to this headline"></a></h2>
<p>(New in 0.6) Generally playbooks will stop executing any more steps on a host that has a failure.
Sometimes, though, you want to continue on. To do so, write a task that looks like this:</p>
<div class="highlight-python"><pre>- name: this will not be counted as a failure
action: command /bin/false
ignore_errors: True</pre>
</div>
</div>
<div class="section" id="accessing-complex-variable-data">
<h3>Accessing Complex Variable Data<a class="headerlink" href="#accessing-complex-variable-data" title="Permalink to this headline"></a></h3>
<h2>Accessing Complex Variable Data<a class="headerlink" href="#accessing-complex-variable-data" title="Permalink to this headline"></a></h2>
<p>Some provided facts, like networking information, are made available as nested data structures. To access
them a simple &#8216;$foo&#8217; is not sufficient, but it is still easy to do. Here&#8217;s how we get an IP address:</p>
<div class="highlight-python"><pre>${ansible_eth0.ipv4.address}</pre>
@ -250,7 +259,7 @@ that is preferred:</p>
</div>
</div>
<div class="section" id="accessing-information-about-other-hosts">
<h3>Accessing Information About Other Hosts<a class="headerlink" href="#accessing-information-about-other-hosts" title="Permalink to this headline"></a></h3>
<h2>Accessing Information About Other Hosts<a class="headerlink" href="#accessing-information-about-other-hosts" title="Permalink to this headline"></a></h2>
<p>If your database server wants to check the value of a &#8216;fact&#8217; from another node, or an inventory variable
assigned to another node, it&#8217;s easy to do so within a template or even an action line:</p>
<div class="highlight-python"><pre>${hostvars.hostname.factname}</pre>
@ -276,7 +285,7 @@ period.</p>
<p>Don&#8217;t worry about any of this unless you think you need it. You&#8217;ll know when you do.</p>
</div>
<div class="section" id="variable-file-seperation">
<h3>Variable File Seperation<a class="headerlink" href="#variable-file-seperation" title="Permalink to this headline"></a></h3>
<h2>Variable File Seperation<a class="headerlink" href="#variable-file-seperation" title="Permalink to this headline"></a></h2>
<p>It&#8217;s a great idea to keep your playbooks under source control, but
you may wish to make the playbook source public while keeping certain
important variables private. Similarly, sometimes you may just
@ -305,7 +314,7 @@ password: magic</pre>
<p>NOTE: It&#8217;s also possible to keep per-host and per-group variables in very similar files, this is covered in <a class="reference internal" href="patterns.html#patterns"><em>Inventory &amp; Patterns</em></a>.</p>
</div>
<div class="section" id="prompting-for-sensitive-data">
<h3>Prompting For Sensitive Data<a class="headerlink" href="#prompting-for-sensitive-data" title="Permalink to this headline"></a></h3>
<h2>Prompting For Sensitive Data<a class="headerlink" href="#prompting-for-sensitive-data" title="Permalink to this headline"></a></h2>
<p>You may wish to prompt the user for certain input, and can
do so with the similarly named &#8216;vars_prompt&#8217; section. This has uses
beyond security, for instance, you may use the same playbook for all
@ -334,7 +343,7 @@ some other options, but otherwise works equivalently:</p>
</div>
</div>
<div class="section" id="passing-variables-on-the-command-line">
<h3>Passing Variables On The Command Line<a class="headerlink" href="#passing-variables-on-the-command-line" title="Permalink to this headline"></a></h3>
<h2>Passing Variables On The Command Line<a class="headerlink" href="#passing-variables-on-the-command-line" title="Permalink to this headline"></a></h2>
<p>In addition to <cite>vars_prompt</cite> and <cite>vars_files</cite>, it is possible to send variables over
the ansible command line. This is particularly useful when writing a generic release playbook
where you may want to pass in the version of the application to deploy:</p>
@ -352,7 +361,7 @@ ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"</pre>
</div>
</div>
<div class="section" id="conditional-execution">
<h3>Conditional Execution<a class="headerlink" href="#conditional-execution" title="Permalink to this headline"></a></h3>
<h2>Conditional Execution<a class="headerlink" href="#conditional-execution" title="Permalink to this headline"></a></h2>
<p>Sometimes you will want to skip a particular step on a particular host. This could be something
as simple as not installing a certain package if the operating system is a particular version,
or it could be something like performing some cleanup steps if a filesystem is getting full.</p>
@ -387,7 +396,7 @@ there will be accessible to future tasks:</p>
</div>
</div>
<div class="section" id="conditional-imports">
<h3>Conditional Imports<a class="headerlink" href="#conditional-imports" title="Permalink to this headline"></a></h3>
<h2>Conditional Imports<a class="headerlink" href="#conditional-imports" title="Permalink to this headline"></a></h2>
<p>Sometimes you will want to do certain things differently in a playbook based on certain criteria.
Having one playbook that works on multiple platforms and OS versions is a good example.</p>
<p>As an example, the name of the Apache package may be different between CentOS and Debian,
@ -430,7 +439,7 @@ in more streamlined &amp; auditable configuration rules &#8211; especially becau
minimum of decision points to track.</p>
</div>
<div class="section" id="loop-shorthand">
<h3>Loop Shorthand<a class="headerlink" href="#loop-shorthand" title="Permalink to this headline"></a></h3>
<h2>Loop Shorthand<a class="headerlink" href="#loop-shorthand" title="Permalink to this headline"></a></h2>
<p>To save some typing, repeated tasks can be written in short-hand like so:</p>
<div class="highlight-python"><pre>- name: add user $item
action: user name=$item state=present groups=wheel
@ -451,7 +460,7 @@ minimum of decision points to track.</p>
manager transactions.</p>
</div>
<div class="section" id="selecting-files-and-templates-based-on-variables">
<h3>Selecting Files And Templates Based On Variables<a class="headerlink" href="#selecting-files-and-templates-based-on-variables" title="Permalink to this headline"></a></h3>
<h2>Selecting Files And Templates Based On Variables<a class="headerlink" href="#selecting-files-and-templates-based-on-variables" title="Permalink to this headline"></a></h2>
<p>Sometimes a configuration file you want to copy, or a template you will use may depend on a variable.
The following construct selects the first available file appropriate for the variables of a given host,
which is often much cleaner than putting a lot of if conditionals in a template.</p>
@ -465,7 +474,7 @@ CentOS and Debian:</p>
</div>
</div>
<div class="section" id="asynchronous-actions-and-polling">
<h3>Asynchronous Actions and Polling<a class="headerlink" href="#asynchronous-actions-and-polling" title="Permalink to this headline"></a></h3>
<h2>Asynchronous Actions and Polling<a class="headerlink" href="#asynchronous-actions-and-polling" title="Permalink to this headline"></a></h2>
<p>By default tasks in playbooks block, meaning the connections stay open
until the task is done on each node. If executing playbooks with
a small parallelism value (aka <tt class="docutils literal"><span class="pre">--forks</span></tt>), you may wish that long
@ -515,7 +524,7 @@ tasks even faster. This also increases the efficiency of polling.</p>
</div>
</div>
<div class="section" id="local-playbooks">
<h3>Local Playbooks<a class="headerlink" href="#local-playbooks" title="Permalink to this headline"></a></h3>
<h2>Local Playbooks<a class="headerlink" href="#local-playbooks" title="Permalink to this headline"></a></h2>
<p>It may be useful to use a playbook locally, rather than by connecting over SSH. This can be useful
for assuring the configuration of a system by putting a playbook on a crontab. This may also be used
to run a playbook inside a OS installer, such as an Anaconda kickstart.</p>
@ -529,7 +538,7 @@ connection: local</pre>
</div>
</div>
<div class="section" id="turning-off-facts">
<h3>Turning Off Facts<a class="headerlink" href="#turning-off-facts" title="Permalink to this headline"></a></h3>
<h2>Turning Off Facts<a class="headerlink" href="#turning-off-facts" title="Permalink to this headline"></a></h2>
<p>If you know you don&#8217;t need any fact data about your hosts, and know everything about your systems centrally, you
can turn off fact gathering. This has advantages in scaling ansible in push mode with very large numbers of
systems, mainly, or if you are using Ansible on experimental platforms. In any play, just do this:</p>
@ -538,7 +547,7 @@ systems, mainly, or if you are using Ansible on experimental platforms. In any
</div>
</div>
<div class="section" id="pull-mode-playbooks">
<h3>Pull-Mode Playbooks<a class="headerlink" href="#pull-mode-playbooks" title="Permalink to this headline"></a></h3>
<h2>Pull-Mode Playbooks<a class="headerlink" href="#pull-mode-playbooks" title="Permalink to this headline"></a></h2>
<p>The use of playbooks in local mode (above) is made extremely powerful with the addition of <cite>ansible-pull</cite>.
A script for setting up ansible-pull is provided in the examples/playbooks directory of the source
checkout.</p>
@ -550,7 +559,7 @@ the cron frequency, logging locations, and parameters to ansible-pull.</p>
logs from ansible-pull runs would be an excellent way to gather and analyze remote logs from ansible-pull.</p>
</div>
<div class="section" id="style-points">
<h3>Style Points<a class="headerlink" href="#style-points" title="Permalink to this headline"></a></h3>
<h2>Style Points<a class="headerlink" href="#style-points" title="Permalink to this headline"></a></h2>
<p>Ansible playbooks are colorized. If you do not like this, set the ANSIBLE_NOCOLOR=1 environment variable.</p>
<p>Ansible playbooks also look more impressive with cowsay installed, and we encourage installing this package.</p>
<div class="admonition-see-also admonition seealso">
@ -576,7 +585,6 @@ logs from ansible-pull runs would be an excellent way to gather and analyze remo
</div>
</div>
</div>
</div>
<br/>
@ -606,7 +614,7 @@ logs from ansible-pull runs would be an excellent way to gather and analyze remo
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

View file

@ -46,8 +46,18 @@ reconfigure all of your systems like this::
This concept works great with tags to rapidly select exactly what plays you want to run, and exactly
what parts of those plays.
Ignoring Failed Commands
````````````````````````
(New in 0.6) Generally playbooks will stop executing any more steps on a host that has a failure.
Sometimes, though, you want to continue on. To do so, write a task that looks like this::
- name: this will not be counted as a failure
action: command /bin/false
ignore_errors: True
Accessing Complex Variable Data
+++++++++++++++++++++++++++++++
```````````````````````````````
Some provided facts, like networking information, are made available as nested data structures. To access
them a simple '$foo' is not sufficient, but it is still easy to do. Here's how we get an IP address::
@ -66,7 +76,7 @@ that is preferred::
{{ ansible_eth0["ipv4"]["address"] }}
Accessing Information About Other Hosts
+++++++++++++++++++++++++++++++++++++++
```````````````````````````````````````
If your database server wants to check the value of a 'fact' from another node, or an inventory variable
assigned to another node, it's easy to do so within a template or even an action line::
@ -99,7 +109,7 @@ period.
Don't worry about any of this unless you think you need it. You'll know when you do.
Variable File Seperation
++++++++++++++++++++++++
````````````````````````
It's a great idea to keep your playbooks under source control, but
you may wish to make the playbook source public while keeping certain
@ -133,7 +143,7 @@ The contents of each variables file is a simple YAML dictionary, like this::
NOTE: It's also possible to keep per-host and per-group variables in very similar files, this is covered in :ref:`patterns`.
Prompting For Sensitive Data
++++++++++++++++++++++++++++
````````````````````````````
You may wish to prompt the user for certain input, and can
do so with the similarly named 'vars_prompt' section. This has uses
@ -166,7 +176,7 @@ some other options, but otherwise works equivalently::
Passing Variables On The Command Line
+++++++++++++++++++++++++++++++++++++
`````````````````````````````````````
In addition to `vars_prompt` and `vars_files`, it is possible to send variables over
the ansible command line. This is particularly useful when writing a generic release playbook
@ -187,7 +197,7 @@ Example::
ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"
Conditional Execution
+++++++++++++++++++++
`````````````````````
Sometimes you will want to skip a particular step on a particular host. This could be something
as simple as not installing a certain package if the operating system is a particular version,
@ -228,7 +238,7 @@ there will be accessible to future tasks::
- action: command echo ${my_custom_fact_can_be_used_now}
Conditional Imports
+++++++++++++++++++
```````````````````
Sometimes you will want to do certain things differently in a playbook based on certain criteria.
Having one playbook that works on multiple platforms and OS versions is a good example.
@ -278,7 +288,7 @@ in more streamlined & auditable configuration rules -- especially because there
minimum of decision points to track.
Loop Shorthand
++++++++++++++
``````````````
To save some typing, repeated tasks can be written in short-hand like so::
@ -304,7 +314,7 @@ manager transactions.
Selecting Files And Templates Based On Variables
++++++++++++++++++++++++++++++++++++++++++++++++
````````````````````````````````````````````````
Sometimes a configuration file you want to copy, or a template you will use may depend on a variable.
The following construct selects the first available file appropriate for the variables of a given host,
@ -321,7 +331,7 @@ CentOS and Debian::
Asynchronous Actions and Polling
++++++++++++++++++++++++++++++++
````````````````````````````````
By default tasks in playbooks block, meaning the connections stay open
until the task is done on each node. If executing playbooks with
@ -372,7 +382,7 @@ Alternatively, if you do not need to wait on the task to complete, you may
tasks even faster. This also increases the efficiency of polling.
Local Playbooks
+++++++++++++++
```````````````
It may be useful to use a playbook locally, rather than by connecting over SSH. This can be useful
for assuring the configuration of a system by putting a playbook on a crontab. This may also be used
@ -389,7 +399,7 @@ use the default remote connection type::
connection: local
Turning Off Facts
+++++++++++++++++
`````````````````
If you know you don't need any fact data about your hosts, and know everything about your systems centrally, you
can turn off fact gathering. This has advantages in scaling ansible in push mode with very large numbers of
@ -399,7 +409,7 @@ systems, mainly, or if you are using Ansible on experimental platforms. In any
gather_facts: False
Pull-Mode Playbooks
+++++++++++++++++++
```````````````````
The use of playbooks in local mode (above) is made extremely powerful with the addition of `ansible-pull`.
A script for setting up ansible-pull is provided in the examples/playbooks directory of the source
@ -414,7 +424,7 @@ This is useful both for extreme scale-out as well as periodic remediation. Usag
logs from ansible-pull runs would be an excellent way to gather and analyze remote logs from ansible-pull.
Style Points
++++++++++++
````````````
Ansible playbooks are colorized. If you do not like this, set the ANSIBLE_NOCOLOR=1 environment variable.

View file

@ -3,18 +3,19 @@ Who Uses Ansible
Ansible is used by all sorts of organizations from hosted web applications, media companies, universities, consultancies, and ISVs -- all over the world. Some of these users include:
================================================== ===================================================
Who They Are What They Do
================================================== ===================================================
`Basho <http://basho.com>`_ makers of NoSQL key-value store Riak
`Cygate AB <http://cygate.se>`_ IT solutions from Malmö, Sweden
`Dag IT Solutions <http://dagit.net>`_ "Enterprise Linux and Beyond"
`Fedora Project <http://fedoraproject.org>`_ produces the popular Linux distribution
`Four Kitchens <http://fourkitchens.com>`_ "the Drupal Experts"
`Schmooze Com <http://www.schmoozecom.com/>`_ Creators of Industry-Leading PBX Platforms
`Skyline.es <http://skylin.es>`_ Realtime Photo Search Engine
`Steelhouse <http://steelhouse.com>`_ Behavioral Commerce
================================================== ===================================================
============================================================ ===================================================
Who They Are What They Do
============================================================ ===================================================
`Basho <http://basho.com>`_ Makers of NoSQL key-value store Riak
`Cygate AB <http://cygate.se>`_ IT solutions from Malmö, Sweden
`Dag IT Solutions <http://dagit.net>`_ "Enterprise Linux and Beyond"
`Fedora Project <http://fedoraproject.org>`_ Produces the popular Linux distribution
`Four Kitchens <http://fourkitchens.com>`_ "The Drupal Experts"
`Schmooze Com <http://www.schmoozecom.com/>`_ Creators of Industry-Leading PBX Platforms
`Skyline.es <http://skylin.es>`_ Realtime Photo Search Engine
`Steelhouse <http://steelhouse.com>`_ Behavioral Commerce
`Tomorrow Focus Technologies GmbH <http://www.t-f-t.net/>`_ Running some of the biggest web sites in Europe
============================================================ ===================================================
and lots of other people (you should see our Google Analytics data). Tweet at `Michael DeHaan <http://twitter.com/laserllama>`_ or `email him <mailto:michael.dehaan@gmail.com>`_ to get your company or project listed here. (It's free!)

View file

@ -221,7 +221,7 @@ s.parentNode.insertBefore(ga, s);
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>

File diff suppressed because one or more lines are too long

View file

@ -178,8 +178,8 @@ s.parentNode.insertBefore(ga, s);
<p>Ansible is used by all sorts of organizations from hosted web applications, media companies, universities, consultancies, and ISVs &#8211; all over the world. Some of these users include:</p>
<table border="1" class="docutils">
<colgroup>
<col width="50%" />
<col width="50%" />
<col width="54%" />
<col width="46%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Who They Are</th>
@ -188,7 +188,7 @@ s.parentNode.insertBefore(ga, s);
</thead>
<tbody valign="top">
<tr><td><a class="reference external" href="http://basho.com">Basho</a></td>
<td>makers of NoSQL key-value store Riak</td>
<td>Makers of NoSQL key-value store Riak</td>
</tr>
<tr><td><a class="reference external" href="http://cygate.se">Cygate AB</a></td>
<td>IT solutions from Malmö, Sweden</td>
@ -197,10 +197,10 @@ s.parentNode.insertBefore(ga, s);
<td>&#8220;Enterprise Linux and Beyond&#8221;</td>
</tr>
<tr><td><a class="reference external" href="http://fedoraproject.org">Fedora Project</a></td>
<td>produces the popular Linux distribution</td>
<td>Produces the popular Linux distribution</td>
</tr>
<tr><td><a class="reference external" href="http://fourkitchens.com">Four Kitchens</a></td>
<td>&#8220;the Drupal Experts&#8221;</td>
<td>&#8220;The Drupal Experts&#8221;</td>
</tr>
<tr><td><a class="reference external" href="http://www.schmoozecom.com/">Schmooze Com</a></td>
<td>Creators of Industry-Leading PBX Platforms</td>
@ -211,6 +211,9 @@ s.parentNode.insertBefore(ga, s);
<tr><td><a class="reference external" href="http://steelhouse.com">Steelhouse</a></td>
<td>Behavioral Commerce</td>
</tr>
<tr><td><a class="reference external" href="http://www.t-f-t.net/">Tomorrow Focus Technologies GmbH</a></td>
<td>Running some of the biggest web sites in Europe</td>
</tr>
</tbody>
</table>
<p>and lots of other people (you should see our Google Analytics data). Tweet at <a class="reference external" href="http://twitter.com/laserllama">Michael DeHaan</a> or <a class="reference external" href="mailto:michael&#46;dehaan&#37;&#52;&#48;gmail&#46;com">email him</a> to get your company or project listed here. (It&#8217;s free!)</p>
@ -257,7 +260,7 @@ s.parentNode.insertBefore(ga, s);
</p>
<p>
&copy; Copyright 2012 Michael DeHaan.<br/>
Last updated on Aug 01, 2012.<br/>
Last updated on Aug 02, 2012.<br/>
</p>
</div>
</footer>