2012-03-07 17:35:18 +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-03-13 00:13:19 +01:00
< title > Downloads & Getting Started — Ansible - SSH-Based Configuration Management & Deployment< / title >
2012-03-07 17:35:18 +01:00
< link rel = "stylesheet" href = "_static/default.css" type = "text/css" / >
< link rel = "stylesheet" href = "_static/pygments.css" type = "text/css" / >
2012-03-09 17:44:14 +01:00
< link rel = "stylesheet" href = "_static/bootstrap.css" type = "text/css" / >
< link rel = "stylesheet" href = "_static/bootstrap-sphinx.css" type = "text/css" / >
2012-03-07 17:35:18 +01:00
< script type = "text/javascript" >
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
2012-03-13 00:13:19 +01:00
VERSION: '0.01',
2012-03-07 17:35:18 +01:00
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
2012-03-09 17:50:07 +01:00
HAS_SOURCE: false
2012-03-07 17:35:18 +01:00
};
< / 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 >
2012-03-09 17:44:14 +01:00
< 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 = "index.html" / >
2012-03-08 19:53:48 +01:00
< link rel = "next" title = "The Inventory File, Patterns, and Groups" href = "patterns.html" / >
2012-04-19 16:15:38 +02:00
< link rel = "prev" title = "The Future Is Now" href = "index.html" / >
2012-03-09 17:44:14 +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();
});
}());
2012-03-10 04:31:54 +01:00
< / script >
2012-04-28 16:46:09 +02:00
2012-03-10 04:31:54 +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);
})();
2012-03-09 17:44:14 +01:00
< / 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-09 17:44:14 +01:00
2012-03-07 17:35:18 +01:00
< / head >
< body >
2012-03-09 17:44:14 +01:00
< 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="index.html">Ansible</a> -->
2012-03-09 17:44:14 +01:00
< ul class = "nav" >
< li class = "dropdown" data-dropdown = "dropdown" >
< a href = "index.html"
2012-03-31 15:29:31 +02:00
class="dropdown-toggle">Chapter< / a >
2012-03-09 17:44:14 +01:00
< span class = "globaltoc" > < ul class = "current" >
2012-03-10 03:50:00 +01:00
< li class = "toctree-l1 current" > < a class = "current reference internal" href = "" > Downloads & Getting Started< / a > < / li >
2012-03-09 17:44:14 +01:00
< 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 >
2012-03-11 20:34:21 +01:00
< li class = "toctree-l1" > < a class = "reference internal" href = "YAMLSyntax.html" > YAML Syntax< / a > < / li >
2012-03-09 17:44:14 +01:00
< li class = "toctree-l1" > < a class = "reference internal" href = "playbooks.html" > Playbooks< / 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-03-14 17:50:40 +01:00
< li class = "toctree-l1" > < a class = "reference internal" href = "moduledev.html" > Module Development Guide< / a > < / li >
2012-03-10 03:50:00 +01:00
< li class = "toctree-l1" > < a class = "reference internal" href = "faq.html" > Frequently Asked Questions< / a > < / li >
2012-03-09 17:44:14 +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 >
< li > < a class = "reference internal" href = "#" > Downloads & Getting Started< / a > < ul >
< li > < a class = "reference internal" href = "#requirements" > Requirements< / a > < / li >
2012-04-26 04:25:13 +02:00
< li > < a class = "reference internal" href = "#python-2-6-epel-instructions-for-rhel-and-centos-5" > Python 2.6 EPEL instructions for RHEL and CentOS 5< / a > < / li >
2012-03-31 15:36:37 +02:00
< li > < a class = "reference internal" href = "#getting-ansible" > Getting Ansible< / a > < ul >
2012-03-18 17:41:00 +01:00
< li > < a class = "reference internal" href = "#running-from-checkout" > Running From Checkout< / a > < / li >
2012-03-17 22:00:41 +01:00
< li > < a class = "reference internal" href = "#make-install" > Make Install< / a > < / li >
2012-03-31 15:36:37 +02:00
< li > < a class = "reference internal" href = "#via-rpm" > Via RPM< / a > < / li >
2012-04-21 18:12:46 +02:00
< li > < a class = "reference internal" href = "#debian-gentoo-arch-others" > Debian, Gentoo, Arch, Others< / a > < / li >
2012-03-18 17:41:00 +01:00
< li > < a class = "reference internal" href = "#tagged-releases" > Tagged Releases< / a > < / li >
2012-03-31 15:36:37 +02:00
< / ul >
< / li >
< li > < a class = "reference internal" href = "#your-first-commands" > Your first commands< / a > < / li >
< / ul >
< / li >
< / ul >
< / span >
2012-03-09 17:44:14 +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-09 17:44:14 +01:00
2012-03-10 16:39:34 +01:00
2012-03-09 17:44:14 +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-09 17:44:14 +01:00
2012-03-10 03:50:00 +01:00
< div class = "section" id = "downloads-getting-started" >
< h1 > Downloads & Getting Started< a class = "headerlink" href = "#downloads-getting-started" title = "Permalink to this headline" > ¶< / a > < / h1 >
2012-03-08 19:36:47 +01:00
< div class = "section" id = "requirements" >
< h2 > Requirements< a class = "headerlink" href = "#requirements" title = "Permalink to this headline" > ¶< / a > < / h2 >
2012-03-09 04:50:12 +01:00
< p > Requirements for Ansible are extremely minimal.< / p >
2012-04-26 04:25:13 +02:00
< p > Ansible is written for Python 2.6. If you are running Python 2.5 on an “ Enterprise Linux” variant,
your distribution can easily install 2.6 (see instructions in the next section). Newer versions
of Linux and OS X should already have 2.6.< / p >
< p > In additon to Python 2.6, you will want the following packages:< / p >
2012-03-08 19:36:47 +01:00
< ul class = "simple" >
< li > < tt class = "docutils literal" > < span class = "pre" > paramiko< / span > < / tt > < / li >
< li > < tt class = "docutils literal" > < span class = "pre" > PyYAML< / span > < / tt > < / li >
2012-04-26 04:25:13 +02:00
< li > < tt class = "docutils literal" > < span class = "pre" > python-jinja2< / span > < / tt > < / li >
2012-03-08 19:36:47 +01:00
< / ul >
2012-04-26 04:25:13 +02:00
< p > On the managed nodes, you only need Python 2.4 or later, but if you are are running less than Python 2.6 on them, you will
also need:< / p >
2012-03-08 19:36:47 +01:00
< ul class = "simple" >
2012-03-18 17:55:18 +01:00
< li > < tt class = "docutils literal" > < span class = "pre" > python-simplejson< / span > < / tt > < / li >
2012-03-08 19:36:47 +01:00
< / ul >
2012-04-26 04:25:13 +02:00
< p > NOTE: Ansible 0.4 will have ways to remote bootstrap this, using Ansible itself. Stay tuned.< / p >
< / div >
< div class = "section" id = "python-2-6-epel-instructions-for-rhel-and-centos-5" >
< h2 > Python 2.6 EPEL instructions for RHEL and CentOS 5< a class = "headerlink" href = "#python-2-6-epel-instructions-for-rhel-and-centos-5" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > These distributions don’ t have Python 2.6 by default, but it is easily installable.< / p >
2012-04-13 04:23:16 +02:00
< ul class = "simple" >
2012-04-26 04:25:13 +02:00
< li > If you have not already done so, < a class = "reference external" href = "http://fedoraproject.org/wiki/EPEL" > configure EPEL< / a > < / li >
< li > yum install python26 python26-PyYAML python26-paramiko python26-jinja2< / li >
2012-04-13 04:23:16 +02:00
< / ul >
2012-03-08 19:36:47 +01:00
< / div >
< div class = "section" id = "getting-ansible" >
< h2 > Getting Ansible< a class = "headerlink" href = "#getting-ansible" title = "Permalink to this headline" > ¶< / a > < / h2 >
2012-03-18 17:41:00 +01:00
< p > As the project is still pretty new, you will probably want to clone
the git checkout, so you can keep up with all of the latest features,
2012-03-18 17:55:18 +01:00
and also easily contribute back to the project (if you want).< / p >
2012-03-18 17:41:00 +01:00
< p > Instructions for installing from source are below.< / p >
2012-03-18 17:55:18 +01:00
< p > You may also wish to follow the < a class = "reference external" href = "https://github.com/ansible/ansible" > Github project< / a > if
2012-03-17 22:00:41 +01:00
you have a github account. This is also where we keep the issue tracker for sharing
2012-03-18 17:55:18 +01:00
bugs and feature ideas.< / p >
2012-03-18 17:41:00 +01:00
< div class = "section" id = "running-from-checkout" >
< h3 > Running From Checkout< a class = "headerlink" href = "#running-from-checkout" title = "Permalink to this headline" > ¶< / a > < / h3 >
< p > Ansible is trivially easy to run from a checkout, root permissions are not required
to use it:< / p >
< div class = "highlight-python" > < pre > $ git clone git://github.com/ansible/ansible.git
$ cd ./ansible
2012-03-18 17:45:23 +01:00
$ source ./hacking/env-setup< / pre >
< / div >
2012-03-18 17:55:18 +01:00
< p > You can optionally specify an inventory file (see doc:< cite > patterns< / cite > ) other than /etc/ansible/hosts:< / p >
2012-04-13 03:33:54 +02:00
< div class = "highlight-python" > < pre > $ echo "127.0.0.1" > ~/ansible_hosts
2012-03-18 17:45:23 +01:00
$ export ANSIBLE_HOSTS=~/ansible_hosts< / pre >
< / div >
< p > Now let’ s test things:< / p >
< div class = "highlight-python" > < pre > $ ansible all -m ping --ask-pass< / pre >
2012-03-18 17:41:00 +01:00
< / div >
< / div >
2012-03-17 22:00:41 +01:00
< div class = "section" id = "make-install" >
< h3 > Make Install< a class = "headerlink" href = "#make-install" title = "Permalink to this headline" > ¶< / a > < / h3 >
2012-03-18 17:55:18 +01:00
< p > If you are not working from a distribution where Ansible is packaged yet, you can install Ansible
using “ make install” . This is done through < cite > python-distutils< / cite > :< / p >
2012-03-08 19:36:47 +01:00
< div class = "highlight-python" > < pre > $ git clone git://github.com/ansible/ansible.git
$ cd ./ansible
$ sudo make install< / pre >
< / div >
< / div >
< div class = "section" id = "via-rpm" >
< h3 > Via RPM< a class = "headerlink" href = "#via-rpm" title = "Permalink to this headline" > ¶< / a > < / h3 >
2012-03-18 17:55:18 +01:00
< p > In the near future, pre-built packages will be available through your
distribution. Until that time, you can use the < tt class = "docutils literal" > < span class = "pre" > make< / span > < span class = "pre" > rpm< / span > < / tt > command to
build an RPM you can distribute and install:< / p >
2012-03-08 19:36:47 +01:00
< div class = "highlight-python" > < pre > $ git clone git://github.com/ansible/ansible.git
$ cd ./ansible
$ make rpm
2012-03-17 22:00:41 +01:00
$ sudo rpm -Uvh ~/rpmbuild/RPMS/noarch/ansible-*.noarch.rpm< / pre >
2012-03-08 19:36:47 +01:00
< / div >
2012-03-18 17:55:18 +01:00
< p > Note that if you are tracking the upstream source (i.e. git), the RPM revision will not be
2012-03-17 22:00:41 +01:00
bumped with every source code change. To get around this, you can use
rpm < cite > -Uvh< / cite > with < cite > – force< / cite > when RPM tells you the package is still at the
2012-03-18 17:41:00 +01:00
same version. This is perfectly safe to do.< / p >
< / div >
2012-04-21 18:12:46 +02:00
< div class = "section" id = "debian-gentoo-arch-others" >
< h3 > Debian, Gentoo, Arch, Others< a class = "headerlink" href = "#debian-gentoo-arch-others" title = "Permalink to this headline" > ¶< / a > < / h3 >
< p > Gentoo eBuilds are available < a class = "reference external" href = "https://github.com/uu/ubuilds" > here< / a > < / p >
< p > Debian package recipes are in progress – see the source checkout, in the packaging/debian
directory.< / p >
< p > An Arch PKGBUILD is available on < a class = "reference external" href = "https://aur.archlinux.org/packages.php?ID=58621" > AUR< / a >
If you have python3 installed on Arch, you probably want to symlink python to python2.:< / p >
< div class = "highlight-python" > < pre > sudo ln -sf /usr/bin/python2 /usr/bin/python< / pre >
< / div >
2012-04-18 01:54:23 +02:00
< p > If you would like to package Ansible for Homebrew, BSD, or others,
please stop by the mailing list and say hi.< / p >
2012-03-18 17:55:18 +01:00
< / div >
2012-03-18 17:41:00 +01:00
< div class = "section" id = "tagged-releases" >
< h3 > Tagged Releases< a class = "headerlink" href = "#tagged-releases" title = "Permalink to this headline" > ¶< / a > < / h3 >
< p > Tagged releases are available as tar.gz files from the Ansible github
project page:< / p >
< ul class = "simple" >
< li > < a class = "reference external" href = "https://github.com/ansible/ansible/downloads" > Ansible/downloads< / a > < / li >
< / ul >
< p > At this point in Ansible’ s development, running or building from checkout is preferred
if you want access to all of the latest modules and improvements.< / p >
2012-03-08 19:36:47 +01:00
< / div >
< / div >
< div class = "section" id = "your-first-commands" >
< h2 > Your first commands< a class = "headerlink" href = "#your-first-commands" title = "Permalink to this headline" > ¶< / a > < / h2 >
2012-03-18 17:55:18 +01:00
< p > Now that you’ ve installed Ansible, it’ s time to test it.< / p >
2012-03-17 22:00:41 +01:00
< p > Edit (or create) /etc/ansible/hosts and put one or more remote systems in it, for
2012-03-10 00:29:01 +01:00
which you have your SSH key in < tt class = "docutils literal" > < span class = "pre" > authorized_keys< / span > < / tt > :< / p >
2012-03-08 19:36:47 +01:00
< div class = "highlight-python" > < pre > 192.168.1.50
aserver.example.org
bserver.example.org< / pre >
< / div >
2012-03-09 05:06:07 +01:00
< p > Set up SSH agent to avoid retyping passwords:< / p >
< div class = "highlight-python" > < pre > ssh-agent bash
ssh-add ~/.ssh/id_rsa< / pre >
< / div >
< p > Now ping all your nodes:< / p >
< div class = "highlight-python" > < pre > ansible all -m ping< / pre >
< / div >
< p > Now run a live command on all of your nodes:< / p >
2012-03-12 02:20:30 +01:00
< div class = "highlight-python" > < pre > ansible all -a "/bin/echo hello"< / pre >
2012-03-09 05:06:07 +01:00
< / div >
2012-03-10 00:29:01 +01:00
< p > Congratulations. You’ ve just contacted your nodes with Ansible. It’ s
2012-03-11 20:34:21 +01:00
now time to read some of the more real-world < a class = "reference internal" href = "examples.html" > < em > Command Line Examples< / em > < / a > , and explore
2012-03-10 00:29:01 +01:00
what you can do with different modules, as well as the Ansible
2012-03-18 17:55:18 +01:00
< a class = "reference internal" href = "playbooks.html" > < em > Playbooks< / em > < / a > language. Ansible is not just about running commands, it
2012-03-18 18:03:45 +01:00
also has powerful configuration management and deployment features. There’ s more to
2012-03-18 17:55:18 +01:00
explore, but you already have a fully working infrastructure!< / p >
2012-03-10 00:29:01 +01:00
< div class = "admonition-see-also admonition seealso" >
< p class = "first admonition-title" > See also< / p >
< dl class = "last docutils" >
2012-03-11 20:34:21 +01:00
< dt > < a class = "reference internal" href = "examples.html" > < em > Command Line Examples< / em > < / a > < / dt >
< dd > Examples of basic commands< / dd >
< dt > < a class = "reference internal" href = "playbooks.html" > < em > Playbooks< / em > < / a > < / dt >
< dd > Learning ansible’ s configuration management language< / dd >
2012-03-31 15:55:37 +02:00
< dt > < a class = "reference external" href = "http://groups.google.com/group/ansible-project" > Mailing List< / a > < / dt >
< dd > Questions? Help? Ideas? Stop by the list on Google Groups< / dd >
< dt > < a class = "reference external" href = "http://irc.freenode.net" > irc.freenode.net< / a > < / dt >
< dd > #ansible IRC chat channel< / dd >
2012-03-10 00:29:01 +01:00
< / dl >
< / div >
2012-03-07 17:35:18 +01:00
< / div >
< / div >
2012-04-28 16:42:32 +02:00
< br / >
2012-03-07 17:35:18 +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-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-09 17:44:14 +01:00
© Copyright 2012 Michael DeHaan.< br / >
2012-04-28 16:42:32 +02:00
Last updated on Apr 28, 2012.< br / >
2012-03-09 17:44:14 +01:00
< / p >
< / div >
< / footer >
2012-03-07 17:35:18 +01:00
< / body >
< / html >