2012-07-26 05:34:02 +02:00
2012-03-11 09:21:53 +01:00
< !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" / >
2012-07-28 04:16:14 +02:00
< title > Introducing Ansible — Ansible - SSH-Based Configuration Management & Deployment< / title >
2012-03-11 09:21:53 +01:00
< 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: '',
2012-03-13 00:13:19 +01:00
VERSION: '0.01',
2012-03-11 09:21:53 +01:00
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 >
2012-04-01 04:44:02 +02:00
< link rel = "shortcut icon" href = "_static/favicon.ico" / >
2012-03-13 00:13:19 +01:00
< link rel = "top" title = "Ansible - SSH-Based Configuration Management & Deployment" href = "#" / >
2012-05-13 17:00:02 +02:00
< link rel = "next" title = "Getting Started" href = "gettingstarted.html" / >
2012-03-11 09:21:53 +01:00
< 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 >
2012-04-28 16:46:09 +02:00
2012-03-11 09:21:53 +01:00
< 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 >
2012-04-28 16:46:09 +02:00
< script type = "text/javascript" >
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
< / script >
2012-04-28 16:42:32 +02:00
< script > ( f u n c t i o n ( d , s , i d ) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));< / script >
2012-03-11 09:21:53 +01:00
< / head >
< body >
< div class = "topbar" data-scrollspy = "scrollspy" >
< div class = "topbar-inner" >
< div class = "container" >
2012-04-18 02:47:29 +02:00
<!-- <a class="brand" href="#">Ansible</a> -->
2012-03-11 09:21:53 +01:00
< ul class = "nav" >
< li class = "dropdown" data-dropdown = "dropdown" >
< a href = "#"
2012-03-31 15:29:31 +02:00
class="dropdown-toggle">Chapter< / a >
2012-03-11 09:21:53 +01:00
< span class = "globaltoc" > < ul >
2012-05-13 17:00:02 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "gettingstarted.html" > Getting Started< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "patterns.html" > Inventory & Patterns< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "examples.html" > Command Line< / a > < / li >
2012-03-11 09:21:53 +01:00
< 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 >
2012-05-13 17:00:02 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "playbooks2.html" > Advanced Playbooks< / a > < / li >
2012-05-13 17:56:09 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "bestpractices.html" > Best Practices< / a > < / li >
2012-03-31 04:28:30 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "api.html" > API & Integrations< / a > < / li >
2012-05-13 17:00:02 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "moduledev.html" > Module Development< / a > < / li >
2012-05-13 17:56:09 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "faq.html" > FAQ< / a > < / li >
2012-07-26 05:33:32 +02:00
< li class = "toctree-l1" > < a class = "reference internal" href = "who_uses_ansible.html" > Who Uses Ansible< / a > < / li >
2012-03-11 09:21:53 +01:00
< / ul >
< / span >
2012-03-31 15:36:37 +02:00
< / li >
< li class = "dropdown" data-dropdown = "dropdown" >
< a href = "#"
class="dropdown-toggle">Page< / a >
< span class = "localtoc" > < ul >
2012-07-28 04:16:14 +02:00
< li > < a class = "reference internal" href = "#" > Introducing Ansible< / a > < / li >
2012-03-31 15:36:37 +02:00
< li > < a class = "reference internal" href = "#architecture" > Architecture< / a > < / li >
2012-07-28 04:16:14 +02:00
< li > < a class = "reference internal" href = "#documentation" > Documentation< / a > < ul >
2012-03-31 15:36:37 +02:00
< / ul >
< / li >
2012-04-18 02:47:29 +02:00
< / ul >
2012-03-31 15:36:37 +02:00
< / span >
2012-03-11 09:21:53 +01:00
< / 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 >
2012-04-28 17:20:38 +02:00
< a href = "http://github.com/ansible/ansible" > < img style = "position: absolute; right: 0; border: 0;" src = "http://ansible.github.com/github.png" alt = "Fork me on GitHub" > < / a >
2012-03-11 09:21:53 +01:00
< div class = "container" >
2012-04-19 15:24:45 +02:00
< a href = "http://ansible.github.com" > < img src = "http://ansible.github.com/ansible-logo.png" alt = "Ansible" / > < / a > < br / >
2012-04-28 16:42:32 +02:00
< br / >
2012-03-11 09:21:53 +01:00
2012-07-28 04:16:14 +02:00
< div class = "section" id = "introducing-ansible" >
< h1 > Introducing Ansible< a class = "headerlink" href = "#introducing-ansible" title = "Permalink to this headline" > ¶< / a > < / h1 >
2012-04-19 16:13:45 +02:00
< p > Ansible is a radically simple model-driven configuration management, deployment,
2012-07-28 04:16:14 +02:00
and command execution framework. Other tools in this space have been too complicated for too long,
require too much bootstrapping, and have too much learning curve. By comparison, Ansible is dead simple
and painless to extend. Puppet and Chef have about 60k lines of code. Ansible’ s core is a little over 2000 lines.< / p >
2012-07-28 16:18:46 +02:00
< p > Ansible isn’ t just for configuration management – it’ s also great for ad-hoc tasks, quickly firing off commands against nodes, and it excels at complex multi-tier deployment tasks, being designed for that purpose from day one.< / p >
2012-07-28 04:16:14 +02:00
< p > Systems management doesn’ t have to be complicated. We’ ve learned well from the “ Infrastructure is Code” movement.
Infrastructure should be easy and powerful to command, but it should not look like code, lest it acquire the disadvantages of a software project – bugs, complexity, and overhead. Infrastructure configurations should be simple, easy to develop, and easy to audit. This is Ansible’ s philosophy and the main reason it’ s different. Read on, though, and we’ ll tell you more.< / p >
< table border = "1" class = "docutils" >
< colgroup >
< col width = "100%" / >
< / colgroup >
< thead valign = "bottom" >
< tr > < th class = "head" > Key Features< / th >
< / tr >
< / thead >
< tbody valign = "top" >
< tr > < td > Dead simple setup< / td >
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > Can be easily run from a checkout, no installation required< / td >
2012-07-28 04:16:14 +02:00
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > No agents or software to install on managed machines< / td >
2012-07-28 04:16:14 +02:00
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > Ultra-secure; uses existing SSHd out of the box< / td >
2012-07-28 04:16:14 +02:00
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > Connect as any user, not just root, and sudo as needed< / td >
2012-07-28 04:16:14 +02:00
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > Super fast & parallel by default< / td >
< / tr >
< tr > < td > Supports Kerberized SSH, jump hosts, forwarding, etc< / td >
2012-07-28 04:16:14 +02:00
< / tr >
< tr > < td > Modules are idempotent, but you can also easily use shell commands< / td >
< / tr >
< tr > < td > Modules can be written in ANY language< / td >
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > Awesome API for creating very powerful distributed applications< / td >
2012-07-28 04:16:14 +02:00
< / tr >
< tr > < td > Pluggable transports (SSH is just the default)< / td >
< / tr >
2012-07-28 16:18:46 +02:00
< tr > < td > Can draw inventory data from external sources like EC2 and Cobbler< / td >
2012-07-28 04:16:14 +02:00
< / tr >
< tr > < td > The easiest config management system to use, ever.< / td >
< / tr >
< / tbody >
< / table >
2012-04-19 16:45:41 +02:00
< / div >
2012-03-11 09:21:53 +01:00
< div class = "section" id = "architecture" >
2012-04-19 16:45:41 +02:00
< h1 > Architecture< a class = "headerlink" href = "#architecture" title = "Permalink to this headline" > ¶< / a > < / h1 >
2012-03-31 18:08:28 +02:00
< div align = "center" class = "align-center" > < img alt = ""Architecture Diagram"" class = "align-center" src = "http://ansible.github.com/ansible_arch2.jpg" style = "width: 800px;" / > < / div >
2012-07-28 04:16:14 +02:00
< table border = "1" class = "docutils" >
< colgroup >
< col width = "35%" / >
< col width = "65%" / >
< / colgroup >
< thead valign = "bottom" >
< tr > < th class = "head" colspan = "2" > Tell Me More< / th >
< / tr >
< / thead >
< tbody valign = "top" >
< tr > < td > Multi-node control & orchestration< / td >
< td > Ansible is especially strong at expressing complex multi-node
deployment processes, executing ordered sequences on
different sets of nodes through < a class = "reference internal" href = "playbooks.html" > < em > Playbooks< / em > < / a > . Performing
steps on all your webservers, then some steps on your database
servers, and then some steps on monitoring servers – all the
while sharing variables between them is trivial.< / td >
< / tr >
2012-07-28 04:30:36 +02:00
< tr > < td > Doesn’ t choose sides in the
language war< / td >
2012-07-28 04:16:14 +02:00
< td > Modules can be written in Bash, Perl, Python, Ruby, whatever.
Playbooks are not a programming language, but a data format.< / td >
< / tr >
< tr > < td > Infrastructure Is Not Code,
Infrastructure Is Data< / td >
< td > Playbooks are not a programming language, they are designed to be
super-easy to write, and easy to audit by non-developers. You
will be able to skim and very quickly understand your entire
configuration policy.< / td >
< / tr >
< tr > < td > Three In One< / td >
< td > Ansible handles multiple command and control
problems in one tool. You don’ t need to use a config tool, a
deployment tool, and yet another ad-hoc parallel task execution
tool – Ansible will do all three.< / td >
< / tr >
< tr > < td > Lower Attack Surface, No Agents< / td >
< td > Ansible is very secure. Ansible uses SSH as a transport,
resulting in a much lower attack surface, and requires no agents
to be running on managed machines. If a central server
containing your playbooks are comprimised, your nodes are not –
which is NOT the case of most other tools, which can, more or
less, turn into a botnet. Our security approach is to avoid
writing custom crypto code altogether, and rely on the most
secure part of the Linux/Unix subsystem that your machines are
already using – openssh.< / td >
< / tr >
< / tbody >
< / table >
2012-07-28 04:30:36 +02:00
< table border = "1" class = "docutils" >
< colgroup >
< col width = "23%" / >
< col width = "77%" / >
< / colgroup >
< thead valign = "bottom" >
< tr > < th class = "head" colspan = "2" > Community< / th >
< / tr >
< / thead >
< tbody valign = "top" >
< tr > < td colspan = "2" > Your ideas and contributions are welcome. We’ re also happy to help
you with questions about Ansible.< / td >
< / tr >
< tr > < td > Get the source< / td >
< td > Visit the < a class = "reference external" href = "https://github.com/ansible/ansible" > project page< / a > on Github< / td >
< / tr >
< tr > < td > File a bug< / td >
< td > View the < a class = "reference external" href = "https://github.com/ansible/ansible/issues" > issue tracker< / a > < / td >
< / tr >
< tr > < td > Spread the word< / td >
< td > Watch slides on < a class = "reference external" href = "http://speakerdeck.com/u/mpdehaan/p/ansible" > Speakerdeck< / a > < / td >
< / tr >
< tr > < td > Join the mailing list< / td >
< td > Visit the < a class = "reference external" href = "http://groups.google.com/group/ansible-project" > Google Group< / a > < / td >
< / tr >
< tr > < td > Chat< / td >
< td > Visit the channel on < a class = "reference external" href = "http://webchat.freenode.net/?channels=ansible" > FreeNode< / a > < / td >
< / tr >
2012-07-28 04:56:53 +02:00
< tr > < td > Share & Learn< / td >
< td > Share < a class = "reference external" href = "http://bit.ly/NNwUgY" > playbooks, modules, articles, and scripts< / a > < / td >
< / tr >
2012-07-28 04:30:36 +02:00
< / tbody >
< / table >
2012-07-28 04:16:14 +02:00
< table border = "1" class = "docutils" >
< colgroup >
< col width = "100%" / >
< / colgroup >
< thead valign = "bottom" >
< tr > < th class = "head" > What People Are Saying< / th >
< / tr >
< / thead >
< tbody valign = "top" >
< tr > < td > “ I’ ve been trying to grok Chef these last weeks, and really, I don’ t get it. I discovered ansible
yesterday at noon, successfully ran it at 1pm, made my first playbook by 2pm, and pushed two small
[contributions to the project] before the office closed... Do that with any other config management
software!” < / td >
< / tr >
< tr > < td > “ Ansible is much more firewall-friendly. I have a number of hosts that are only accessible via reverse
SSH tunnels, and let me tell you getting puppet or chef to play nice with that is a nightmare.” < / td >
< / tr >
< tr > < td > “ This software has really changed my life as an network admin, the simplicity ansible comes with is
really childs-play and I really adore its design. No more hassle with SSL keys, DNS based ‘ server
entries’ (e.g. puppet and what not). Just plain (secure!) SSH keys and one is good to go.” < / td >
< / tr >
2012-07-28 04:42:07 +02:00
< tr > < td > “ You may get a kick out of the fact that I’ m using ansible to install puppetmaster(s). I’ m starting to
migrate all my stuff to the much more sensical ansible. Nice work.” < / td >
< / tr >
< tr > < td > “ Simple as hell” < / td >
2012-07-28 04:16:14 +02:00
< / tr >
< / tbody >
< / table >
< table border = "1" class = "docutils" >
< colgroup >
< col width = "100%" / >
< / colgroup >
< thead valign = "bottom" >
< tr > < th class = "head" > Presented By...< / th >
< / tr >
< / thead >
< tbody valign = "top" >
< tr > < td > Ansible was created and is run 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
2012-04-19 16:45:41 +02:00
based software developer and architect, who also created the popular
DevOps install server < a class = "reference external" href = "http://cobbler.github.com/" > Cobbler< / a > .
2012-03-11 09:21:53 +01:00
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
2012-07-28 04:16:14 +02:00
helped co-author < 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
2012-03-11 09:21:53 +01:00
software for IBM, Motorola, Red Hat’ s Emerging Technologies Group,
2012-07-28 04:16:14 +02:00
Puppet Labs, and is now with < a class = "reference external" href = "http://rpath.com" > rPath< / a > . Reach Michael by email
< a class = "reference external" href = "mailto:michael.dehaan%40gmail.com" > here< / a > .< / td >
< / tr >
< / tbody >
< / table >
2012-03-11 09:21:53 +01:00
< / div >
2012-07-28 04:30:36 +02:00
< div class = "section" id = "documentation" >
< h1 > Documentation< a class = "headerlink" href = "#documentation" title = "Permalink to this headline" > ¶< / a > < / h1 >
< div class = "toctree-wrapper compound" >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "gettingstarted.html" > Getting Started< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "patterns.html" > Inventory & Patterns< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "examples.html" > Command Line< / 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 = "playbooks2.html" > Advanced Playbooks< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "bestpractices.html" > Best Practices< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "api.html" > API & Integrations< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "moduledev.html" > Module Development< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "faq.html" > FAQ< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "who_uses_ansible.html" > Who Uses Ansible< / a > < / li >
< / ul >
< / div >
< / div >
2012-03-11 09:21:53 +01:00
2012-04-28 16:42:32 +02:00
< br / >
2012-03-11 09:21:53 +01:00
< / div >
2012-04-28 16:53:15 +02:00
< footer class = "footer" >
< div class = "container" >
< div id = "fb-root" > < / div >
2012-04-28 16:50:20 +02:00
< p >
2012-07-31 02:08:13 +02:00
< form action = "https://www.paypal.com/cgi-bin/webscr" method = "post" >
< input type = "hidden" name = "cmd" value = "_donations" >
< input type = "hidden" name = "business" value = "michael.dehaan@gmail.com" >
< input type = "hidden" name = "lc" value = "US" >
< input type = "hidden" name = "item_name" value = "Ansible" >
< input type = "hidden" name = "no_note" value = "0" >
< input type = "hidden" name = "currency_code" value = "USD" >
< input type = "hidden" name = "bn" value = "PP-DonationsBF:btn_donate_LG.gif:NonHostedGuest" >
< input type = "image" src = "https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border = "0" name = "submit" alt = "PayPal - The safer, easier way to pay online!" >
< img alt = "" border = "0" src = "https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width = "1" height = "1" >
< / form >
< / p >
< p >
2012-04-28 16:42:32 +02:00
< a href = "https://twitter.com/share" class = "twitter-share-button" data-text = "ansible.github.com" > Share On Twitter< / a >
< script > ! function ( d , s , id ) { var js , fjs = d . getElementsByTagName ( s ) [ 0 ] ; if ( ! d . getElementById ( id ) ) { js = d . createElement ( s ) ; js . id = id ; js . src = "//platform.twitter.com/widgets.js" ; fjs . parentNode . insertBefore ( js , fjs ) ; } } ( document , "script" , "twitter-wjs" ) ; < / script >
< g:plusone annotation = "inline" > < / g:plusone >
< div class = "fb-like" data-href = "http://ansible.github.com" data-send = "true" data-width = "450" data-show-faces = "false" > < / div >
2012-04-28 16:50:20 +02:00
< / p >
< p >
2012-03-11 09:21:53 +01:00
© Copyright 2012 Michael DeHaan.< br / >
2012-07-31 02:08:13 +02:00
Last updated on Jul 30, 2012.< br / >
2012-03-11 09:21:53 +01:00
< / p >
< / div >
< / footer >
< / body >
2012-05-20 02:57:34 +02:00
< / html >