< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
< title > Introducing Ansible — Ansible - SSH-Based Configuration Management & Deployment< / title >
< link rel = "stylesheet" href = "_static/default.css" type = "text/css" / >
< link rel = "stylesheet" href = "_static/pygments.css" type = "text/css" / >
< link rel = "stylesheet" href = "_static/bootstrap.css" type = "text/css" / >
< link rel = "stylesheet" href = "_static/bootstrap-sphinx.css" type = "text/css" / >
< script type = "text/javascript" >
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.01',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: false
};
< / script >
< script type = "text/javascript" src = "_static/jquery.js" > < / script >
< script type = "text/javascript" src = "_static/underscore.js" > < / script >
< script type = "text/javascript" src = "_static/doctools.js" > < / script >
< script type = "text/javascript" src = "_static/bootstrap-dropdown.js" > < / script >
< script type = "text/javascript" src = "_static/bootstrap-scrollspy.js" > < / script >
< link rel = "top" title = "Ansible - SSH-Based Configuration Management & Deployment" href = "#" / >
< link rel = "next" title = "Downloads & Getting Started" href = "gettingstarted.html" / >
< script type = "text/javascript" >
(function () {
/**
* Patch TOC list.
*
* Will mutate the underlying span to have a correct ul for nav.
*
* @param $span: Span containing nested UL's to mutate.
* @param minLevel: Starting level for nested lists. (1: global, 2: local).
*/
var patchToc = function ($span, minLevel) {
var $tocList = $("< ul / > ").attr('class', "dropdown-menu"),
findA;
// Find all a "internal" tags, traversing recursively.
findA = function ($elem, level) {
var level = level || 0,
$items = $elem.find("> li > a.internal, > ul, > li > ul");
// Iterate everything in order.
$items.each(function (index, item) {
var $item = $(item),
tag = item.tagName.toLowerCase(),
pad = 10 + ((level - minLevel) * 10);
if (tag === 'a' & & level >= minLevel) {
// Add to existing padding.
$item.css('padding-left', pad + "px");
// Add list element.
$tocList.append($("< li / > ").append($item));
} else if (tag === 'ul') {
// Recurse.
findA($item, level + 1);
}
});
};
// Start construction and return.
findA($span);
// Wipe out old list and patch in new one.
return $span.empty("ul").append($tocList);
};
$(document).ready(function () {
// Patch the global and local TOC's to be bootstrap-compliant.
patchToc($("span.globaltoc"), 1);
patchToc($("span.localtoc"), 2);
// Activate.
$('#topbar').dropdown();
});
}());
< / script >
< script type = "text/javascript" >
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-29861888-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type =
'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
< / script >
< / head >
< body >
< div class = "topbar" data-scrollspy = "scrollspy" >
< div class = "topbar-inner" >
< div class = "container" >
< a class = "brand" href = "#" > Ansible< / a >
< ul class = "nav" >
< li class = "dropdown" data-dropdown = "dropdown" >
< a href = "#"
class="dropdown-toggle">Site< / a >
< span class = "globaltoc" > < ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "gettingstarted.html" > Downloads & Getting Started< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "patterns.html" > The Inventory File, Patterns, and Groups< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "examples.html" > Command Line Examples< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "modules.html" > Ansible Modules< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "YAMLSyntax.html" > YAML Syntax< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "playbooks.html" > Playbooks< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "api.html" > Using the Python API< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "faq.html" > Frequently Asked Questions< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "man.html" > Man Pages< / a > < / li >
< / ul >
< / span >
< / li >
< li class = "dropdown" data-dropdown = "dropdown" >
< a href = "#"
class="dropdown-toggle">Page< / a >
< span class = "localtoc" > < ul >
< li > < a class = "reference internal" href = "#" > Introducing Ansible< / a > < ul >
< li > < a class = "reference internal" href = "#architecture" > Architecture< / a > < / li >
< li > < a class = "reference internal" href = "#design-goals" > Design Goals< / a > < / li >
< li > < a class = "reference internal" href = "#resources" > Resources< / a > < / li >
< / ul >
< / li >
< li > < a class = "reference internal" href = "#contents" > Contents< / a > < ul >
< li > < a class = "reference internal" href = "#about-the-author" > About the Author< / a > < / li >
< / ul >
< / li >
< / ul >
< / span >
< / li >
< li > < a href = "gettingstarted.html"
title="next chapter">Downloads & Getting Started » < / a > < / li >
< / ul >
< ul class = "nav secondary-nav" >
< form class = "pull-left" action = "search.html" method = "get" >
< input type = "text" name = "q" placeholder = "Search" / >
< input type = "hidden" name = "check_keywords" value = "yes" / >
< input type = "hidden" name = "area" value = "default" / >
< / form >
< / ul >
< / div >
< / div >
< / div >
< a href = "https://github.com/ansible/ansible" > < img
style="position: absolute; top: 40px; right: 0; border: 0;"
src="https://a248.e.akamai.net/assets.github.com/img/71eeaab9d563c2b3c590319b398dd35683265e85/687474703a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
alt="Fork me on GitHub"
alt="Fork me on GitHub">< / a >
< div class = "container" >
< a class = "reference external image-reference" href = "http://photos.michaeldehaan.net/infrared/h3d850bdf#h3d850bdf" > < img alt = """" src = "http://ansible.github.com/mpd_rings.jpg" style = "width: 300px; height: 225px;" / > < / a >
< a class = "reference external image-reference" href = "http://photos.michaeldehaan.net/favorites/h2428aca7#h2428aca7" > < img alt = """" src = "http://ansible.github.com/mpd_tunnel.jpg" style = "width: 337px; height: 225px;" / > < / a >
< a class = "reference external image-reference" href = "http://photos.michaeldehaan.net/ncsu/h3b63b68e#h3b63b68e" > < img alt = """" src = "http://ansible.github.com/mpd_tubes.jpg" style = "width: 225px; height: 225px;" / > < / a >
< div class = "section" id = "introducing-ansible" >
< h1 > Introducing Ansible< a class = "headerlink" href = "#introducing-ansible" title = "Permalink to this headline" > ¶< / a > < / h1 >
< p > Ansible is a radically simple deployment, configuration, and command
execution framework. Other similar tools have been too
complicated for too long, require too much bootstrapping, and have too
much learning curve. Ansible is dead simple and painless to extend.
For comparison, Puppet and Chef have about 60k lines of code.
Ansible’ s core is a little over 1000 lines.< / p >
< p > Ansible isn’ t just for configuration – it’ s also great for Ad-Hoc
tasks, quickly firing off commands against nodes. See < a class = "reference internal" href = "examples.html" > < em > Command Line Examples< / em > < / a > .
Where Ansible excels though, is expressing complex multi-node
deployment processes, executing complex sequences of commands on
different hosts through < a class = "reference internal" href = "playbooks.html" > < em > Playbooks< / em > < / a > .< / p >
< p > Extending ansible does not require programming in any particular
language – you can write < a class = "reference internal" href = "modules.html" > < em > Ansible Modules< / em > < / a > as scripts or programs that return
simple JSON. It’ s also trivially easy to just execute useful shell
commands.< / p >
< p > Why use Ansible versus something else? (Puppet, Chef, Fabric,
Capistrano, mCollective, Func, SaltStack, etc?) Ansible will have far
less code, it will be (by extension) more correct, and it will be the
easiest thing to hack on and use you’ ll ever see – regardless of your
favorite language of choice.< / p >
< p > Systems management doesn’ t have to be complicated. Ansible’ s docs
will remain short & simple, and the source will be blindingly obvious.< / p >
< div class = "section" id = "architecture" >
< h2 > Architecture< a class = "headerlink" href = "#architecture" title = "Permalink to this headline" > ¶< / a > < / h2 >
< img alt = ""Architecture Diagram"" src = "http://ansible.github.com/ansible_arch.jpg" style = "width: 648px; height: 464px;" / >
< / div >
< div class = "section" id = "design-goals" >
< h2 > Design Goals< a class = "headerlink" href = "#design-goals" title = "Permalink to this headline" > ¶< / a > < / h2 >
< ul class = "simple" >
< li > Dead simple setup< / li >
< li > Super fast & parallel by default< / li >
< li > No server or client daemons; use existing SSHd out of the box< / li >
< li > No additional software required on client boxes< / li >
< li > Modules can be written in ANY language< / li >
< li > Awesome API for creating very powerful distributed scripts< / li >
< li > Be very usable as non-root< / li >
< li > Create the easiest config management system to use, ever.< / li >
< / ul >
< / div >
< div class = "section" id = "resources" >
< h2 > Resources< a class = "headerlink" href = "#resources" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > Your ideas and contributions are welcome. We’ re also happy to help
you with questions about Ansible.< / p >
< ul class = "simple" >
< li > Join the < a class = "reference external" href = "http://groups.google.com/group/ansible-project" > ansible-project mailing list< / a > on Google Groups< / li >
< li > Join < a class = "reference external" href = "irc://irc.freenode.net/#ansible" > #ansible< / a > on the < a class = "reference external" href = "http://freenode.net/" > freenode IRC network< / a > < / li >
< li > Visit the < a class = "reference external" href = "https://github.com/ansible/ansible" > project page< / a > on Github< ul >
< li > View the < a class = "reference external" href = "https://github.com/ansible/ansible/issues" > issue tracker< / a > < / li >
< / ul >
< / li >
< / ul >
< / div >
< / div >
< div class = "section" id = "contents" >
< h1 > Contents< a class = "headerlink" href = "#contents" title = "Permalink to this headline" > ¶< / a > < / h1 >
< div class = "toctree-wrapper compound" >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "gettingstarted.html" > Downloads & Getting Started< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "gettingstarted.html#requirements" > Requirements< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "gettingstarted.html#developer-requirements" > Developer Requirements< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "gettingstarted.html#getting-ansible" > Getting Ansible< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "gettingstarted.html#python-distutils" > Python Distutils< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "gettingstarted.html#via-rpm" > Via RPM< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "gettingstarted.html#your-first-commands" > Your first commands< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "patterns.html" > The Inventory File, Patterns, and Groups< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "patterns.html#inventory-file-format" > Inventory File Format< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "patterns.html#selecting-targets" > Selecting Targets< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "examples.html" > Command Line Examples< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "examples.html#parallelism-and-shell-commands" > Parallelism and Shell Commands< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "examples.html#file-transfer-templating" > File Transfer & Templating< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "examples.html#managing-packages" > Managing Packages< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "examples.html#deploying-from-source-control" > Deploying From Source Control< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "examples.html#managing-services" > Managing Services< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "examples.html#time-limited-background-operations" > Time Limited Background Operations< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "modules.html" > Ansible Modules< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#command" > command< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#copy" > copy< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#facter" > facter< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#git" > git< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#ohai" > ohai< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#ping" > ping< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#service" > service< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#setup" > setup< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#shell" > shell< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#template" > template< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#yum" > yum< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "modules.html#writing-your-own-modules" > Writing your own modules< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "YAMLSyntax.html" > YAML Syntax< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "YAMLSyntax.html#yaml-basics" > YAML Basics< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "playbooks.html" > Playbooks< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#playbook-example" > Playbook Example< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#hosts-line" > Hosts line< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#user-line" > User line< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#vars-section" > Vars section< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#tasks-list" > Tasks list< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#task-name-and-action" > Task name and action< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#notify-statements" > Notify statements< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#handlers" > Handlers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#power-tricks" > Power Tricks< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "playbooks.html#external-variables-and-sensitive-data" > External Variables And Sensitive Data< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "playbooks.html#include-files-and-reuse" > Include Files And Reuse< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "playbooks.html#using-includes-to-assign-classes-of-systems" > Using Includes To Assign Classes of Systems< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "playbooks.html#asynchronous-actions-and-polling" > Asynchronous Actions and Polling< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "playbooks.html#executing-a-playbook" > Executing A Playbook< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "api.html" > Using the Python API< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "api.html#detailed-api-example" > Detailed API Example< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "faq.html" > Frequently Asked Questions< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "faq.html#what-inspired-ansible" > What inspired Ansible?< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "faq.html#comparisons" > Comparisons< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#vs-func" > vs Func?< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#vs-puppet" > vs Puppet?< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#vs-chef" > vs Chef?< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#vs-capistrano-fabric" > vs Capistrano/Fabric?< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "faq.html#other-questions" > Other Questions< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#how-does-ansible-scale" > How does Ansible scale?< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#are-transports-other-than-ssh-supported" > Are transports other than SSH supported?< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "faq.html#what-are-some-ideal-uses-for-ansible" > What are some ideal uses for Ansible?< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "man.html" > Man Pages< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "man.html#ansible-1" > ansible(1)< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "man.html#ansible-playbook-1" > ansible-playbook(1)< / a > < / li >
< / ul >
< / li >
< / ul >
< / div >
< div class = "section" id = "about-the-author" >
< h2 > About the Author< a class = "headerlink" href = "#about-the-author" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > Ansible was originally developed by < a class = "reference external" href = "http://michaeldehaan.net" > Michael DeHaan< / a > (< a class = "reference external" href = "http://twitter.com/#!/laserllama" > @ laserllama< / a > ), a Raleigh, NC
based software developer and architect. He created other popular
DevOps programs such as < a class = "reference external" href = "http://cobbler.github.com/" > Cobbler< / a > , the popular Linux install server.
Cobbler is used to deploy mission critical systems all over the
planet, in industries ranging from massively multiplayer gaming, core
internet infrastructure, finance, chip design, and more. Michael also
helped co-author of < a class = "reference external" href = "http://fedorahosted.org/func/" > Func< / a > , a precursor to Ansible, which is used to
orchestrate systems in lots of diverse places. He’ s worked on systems
software for IBM, Motorola, Red Hat’ s Emerging Technologies Group,
Puppet Labs, and rPath. Reach Michael by email < a class = "reference external" href = "mailto:michael.dehaan%40gmail.com" > here< / a > .< / p >
< / div >
< / div >
< / div >
< footer class = "footer" >
< div class = "container" >
< p class = "pull-right" > < a href = "#" > Back to top< / a > < / p >
< p >
© Copyright 2012 Michael DeHaan.< br / >
Last updated on Mar 14, 2012.< br / >
Created using < a href = "http://sphinx.pocoo.org/" > Sphinx< / a > 1.0.8.< br / >
< / p >
< / div >
< / footer >
< / body >
< / html >