Difference between revisions of "Ansible"
Jump to navigation
Jump to search
(link to the docs on setup) |
|||
(23 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
[[wp:Ansible_(software)]] is an open-source software platform for configuring and managing computers. It combines multi-node software deployment, ad hoc task execution, and configuration management. Written in Python, it is packaged by [[RedHat]]. As of July 2016, we're using Ansible 2.2.0 | [[wp:Ansible_(software)]] is an open-source software platform for configuring and managing computers. It combines multi-node software deployment, ad hoc task execution, and configuration management. Written in Python, it is packaged by [[RedHat]]. As of July 2016, we're using Ansible 2.2.0 | ||
+ | == Installation == | ||
+ | The preferred way to [http://docs.ansible.com/intro_installation.html install] is to just <code>git clone</code> the source. Having the source makes it easy to upgrade, and it's self-contained, plus best of all you get all the examples and contribs. | ||
− | + | <source lang="bash"> | |
− | + | cd | |
+ | mkdir ~/bin | ||
+ | cd bin | ||
+ | git clone git://github.com/ansible/ansible.git --recursive | ||
+ | cd ./ansible | ||
+ | source ./hacking/env-setup | ||
+ | </source> | ||
− | + | If you see this error message: | |
− | + | <pre> | |
− | + | Traceback (most recent call last): | |
− | + | File "/usr/local/bin/ansible-playbook", line 44, in <module> | |
− | + | import ansible.constants as C | |
− | + | ImportError: No module named ansible.constants | |
+ | </pre> | ||
+ | Be sure to source the env-setup script | ||
− | + | == Getting Started == | |
− | |||
− | |||
− | |||
− | ==Getting Started== | ||
You must source the environment setup script to begin using Ansible (assuming you are running from a git checkout) <code>source ~/bin/ansible/hacking/env-setup</code> | You must source the environment setup script to begin using Ansible (assuming you are running from a git checkout) <code>source ~/bin/ansible/hacking/env-setup</code> | ||
Ansible provides three main commands: | Ansible provides three main commands: | ||
+ | # <code>ansible-playbook</code> - to execute an Ansible playbook on the specified systems | ||
+ | # <code>ansible</code> - to execute an individual shell command or Ansible module on the specified systems | ||
+ | # <code>ansible-vault</code> - (optional) to encrypt or decrypt YAML files that Ansible uses. | ||
− | + | === Global Config === | |
− | |||
− | |||
− | |||
− | ===Global Config=== | ||
<code>export ANSIBLE_HOST_KEY_CHECKING=False</code> | <code>export ANSIBLE_HOST_KEY_CHECKING=False</code> | ||
or set it in your ~/.ansible.cfg so that as you add new hosts it won't prompt you. | or set it in your ~/.ansible.cfg so that as you add new hosts it won't prompt you. | ||
Line 30: | Line 35: | ||
Also [https://docs.ansible.com/ansible/intro_getting_started.html#your-first-commands use 'ssh' instead of paramiko] when doing this. | Also [https://docs.ansible.com/ansible/intro_getting_started.html#your-first-commands use 'ssh' instead of paramiko] when doing this. | ||
− | ===Initialize a Project=== | + | === Initialize a Project === |
− | + | '''Ansible Galaxy''' If you want to do a new project, you can use the <code>ansible-galaxy foo init</code> command which will create the directory and file structure for 'foo' in the current working directory. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | <code>ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options]</code> | + | Also, if you want to install other Ansible Galaxy projects, you can either do it "manually" <code> ansible-galaxy install -r </code> Or, setup a 'requirements.yml' file in your playbook that then gets run by your stack. <ref>https://stackoverflow.com/questions/25230376/how-to-automatically-install-ansible-galaxy-roles</ref> <code>ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options]</code> |
− | ==Modules== | + | == Modules == |
Ansible comes with [https://docs.ansible.com/ansible/modules_by_category.html over 200 modules] that you should get familiar with in order to use the system effectively. | Ansible comes with [https://docs.ansible.com/ansible/modules_by_category.html over 200 modules] that you should get familiar with in order to use the system effectively. | ||
Line 47: | Line 47: | ||
You can use the '''command module''' (secure but simple) or the '''[https://docs.ansible.com/ansible/shell_module.html shell module]'''. The latter may be useful if you need to run bash explicitly (defaults to /bin/sh); or anytime you need $HOME and redirection. | You can use the '''command module''' (secure but simple) or the '''[https://docs.ansible.com/ansible/shell_module.html shell module]'''. The latter may be useful if you need to run bash explicitly (defaults to /bin/sh); or anytime you need $HOME and redirection. | ||
− | To sanitize any variables passed to the shell module, you should use <nowiki> | + | To sanitize any variables passed to the shell module, you should use <nowiki>{{ var | quote }}instead of just {{ var }}</nowiki> to make sure they include evil things like semicolons. |
− | ==Example Commands== | + | == Example Commands == |
Note: control verbosity with <code>-vvvv</code> | Note: control verbosity with <code>-vvvv</code> | ||
− | + | # <code>ansible -c local -i ~/ansible_hosts -m ping all</code> ping all the hosts in the inventory file | |
− | + | # <code>ansible '''-m setup''' wiki.example.com</code> Use the '''[https://docs.ansible.com/ansible/latest/setup_module.html setup]''' module to gather ansible 'facts' (aka [[ansible_variables]]) about that host. | |
− | + | # <code>ansible '''localhost''' -m setup -a 'gather_subset=!all'</code> or look at the localhost | |
− | #<code>ansible -c local -i ~/ansible_hosts -m ping all</code> ping all the hosts in the inventory file | + | # <code>ansible all -m setup -a '''"filter=ansible_distribution*"'''</code> use a filter action to see specific variables |
− | #<code>ansible '''-m setup''' wiki.example.com</code> Use the '''[https://docs.ansible.com/ansible/latest/setup_module.html setup]''' module to gather ansible 'facts' (aka [[ansible_variables]]) about that host. | + | # <code>ansible localhost -m setup --tree /tmp/facts</code> store all facts in a file 'tree', based on hostname |
− | #<code>ansible '''localhost''' -m setup -a 'gather_subset=!all'</code> or look at the localhost | ||
− | #<code>ansible all -m setup -a '''"filter=ansible_distribution*"'''</code> use a filter action to see specific variables | ||
− | #<code>ansible localhost -m setup --tree /tmp/facts</code> store all facts in a file 'tree', based on hostname | ||
#<code>ansible -m debug -a "var=hostvars['wiki.example.com']" localhost</code> gives you the '[[ansible hostvars]]' | #<code>ansible -m debug -a "var=hostvars['wiki.example.com']" localhost</code> gives you the '[[ansible hostvars]]' | ||
− | #<code>ansible-playbook play1.yml play2.yml</code> Run multiple playbooks | + | # <code>ansible-playbook play1.yml play2.yml</code> Run multiple playbooks |
− | #<code>ansible-playbook -i production webservers.yml --tags ntp '''--list-tasks'''</code> confirm what task names would be run if I ran this command and said "just ntp tasks" | + | # <code>ansible-playbook -i production webservers.yml --tags ntp '''--list-tasks'''</code> confirm what task names would be run if I ran this command and said "just ntp tasks" |
− | #<code>ansible-playbook '''--list-tags''' launch.yml</code> see what tags exist in my playbook (the tasks list shows more detail + the tags) | + | # <code>ansible-playbook '''--list-tags''' launch.yml</code> see what tags exist in my playbook (the tasks list shows more detail + the tags) |
− | #<code>ansible-playbook -i production webservers.yml --limit boston '''--list-hosts'''</code> confirm what hostnames might be communicated with if I said "limit to boston" <ref>Choosing which host(s) to operate on https://docs.ansible.com/ansible/intro_patterns.html</ref> | + | # <code>ansible-playbook -i production webservers.yml --limit boston '''--list-hosts'''</code> confirm what hostnames might be communicated with if I said "limit to boston" <ref>Choosing which host(s) to operate on https://docs.ansible.com/ansible/intro_patterns.html</ref> |
− | #<code>~/bin/ansible/contrib/inventory/digital_ocean.py --list --pretty --api-token TOKEN_HERE</code> use the DO api to list your droplets (dynamic inventory) | + | # <code>~/bin/ansible/contrib/inventory/digital_ocean.py --list --pretty --api-token TOKEN_HERE</code> use the DO api to list your droplets (dynamic inventory) |
− | #<code>ansible-playbook -vvv launch.yml -l wiki.example.com --user=root -e do_name=wiki.example.com '''--start-at-task'''='remove empty wiki schema from database if it already exists'</code> start at a particular point in the task list | + | # <code>ansible-playbook -vvv launch.yml -l wiki.example.com --user=root -e do_name=wiki.example.com '''--start-at-task'''='remove empty wiki schema from database if it already exists'</code> start at a particular point in the task list |
− | #<code>php -r 'var_dump(json_decode(file_get_contents("/tmp/facts/localhost"), true));'</code> look at the json with php (or more interesting tools) With Ansible's Jinja2 filters, you can specify the output of a variable to be 'pretty' <nowiki>{{ some_variable | to_nice_json }}</nowiki> | + | # <code>php -r 'var_dump(json_decode(file_get_contents("/tmp/facts/localhost"), true));'</code> look at the json with php (or more interesting tools) With Ansible's Jinja2 filters, you can specify the output of a variable to be 'pretty' <nowiki>{{ some_variable | to_nice_json }}</nowiki> |
− | ==Variables== | + | == Variables == |
+ | ; You have 3 plays in one playbook. Will play 3 be able to reference facts registered in play 1?: | ||
+ | : facts, yes, play vars, no | ||
+ | : vars associated to the host, persist, vars defined in the play, do not, set_facts, registered vars and gathered facts associate to the host so those do persist for the run | ||
− | + | == Playbooks == | |
− | |||
− | |||
− | |||
− | ==Playbooks== | ||
Ansible "[http://docs.ansible.com/playbooks.html Playbooks]" use an easy and descriptive language based on YAML. | Ansible "[http://docs.ansible.com/playbooks.html Playbooks]" use an easy and descriptive language based on YAML. | ||
− | + | == Targets == | |
− | |||
− | |||
− | ==Targets== | ||
Ansible can deploy to virtualization environments and public and private cloud environments including VMWare, OpenStack, AWS, Eucalyptus Cloud, KVM, and CloudStack | Ansible can deploy to virtualization environments and public and private cloud environments including VMWare, OpenStack, AWS, Eucalyptus Cloud, KVM, and CloudStack | ||
+ | == Best Practices == | ||
+ | Use tags to organize your Ansible work | ||
− | + | Use caching (default is off) to be able to refer to host 'facts' without having to hit each host in a playbook. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Use register of [https://docs.ansible.com/ansible/playbooks_variables.html variables] to create more 'facts'. Results vary from module to module. Use -v to see possible values. | |
− | + | There is an order of precedence with [https://docs.ansible.com/ansible/playbooks_variables.html playbook variables], with role defaults the lowest priority and extra vars the winner. | |
− | + | The array notation is preferred over the dot notation for accessing variables. | |
+ | {{ ansible_eth0["ipv4"]["address"] }} over {{ ansible_eth0.ipv4.address }} because some keywords in Python would conflict | ||
− | + | Reserved words: | |
− | + | * hostvars | |
− | + | * group_names | |
− | + | * groups | |
− | + | * environemnt | |
− | + | '''inventory_hostname''' is the name of the hostname as configured in inventory host file. '''ansible_hostname''' is the discovered hostname | |
− | + | You can use a variables file to put sensitive data in a different file (one excluded from git). | |
<source lang="yaml"> | <source lang="yaml"> | ||
- hosts: all | - hosts: all | ||
Line 147: | Line 107: | ||
</source> | </source> | ||
− | + | You can use variables on the command line (and besides key=value pairs, you can use json or yml) | |
<source lang="yaml"> | <source lang="yaml"> | ||
--- | --- | ||
Line 159: | Line 119: | ||
<code>ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"</code> | <code>ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"</code> | ||
− | + | == Scope == | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ==Scope== | ||
Ansible has 3 main scopes: | Ansible has 3 main scopes: | ||
Line 177: | Line 126: | ||
'''Host''': variables directly associated to a host, like inventory, facts or registered task outputs | '''Host''': variables directly associated to a host, like inventory, facts or registered task outputs | ||
− | + | == Ansible with Vagrant == | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ==Ansible with Vagrant== | ||
https://docs.ansible.com/ansible/guide_vagrant.html and [[Private:QualityBox/Vagrant]] | https://docs.ansible.com/ansible/guide_vagrant.html and [[Private:QualityBox/Vagrant]] | ||
− | ==Ansible with MediaWiki== | + | == Ansible with MediaWiki == |
https://github.com/Orain | https://github.com/Orain | ||
I've cloned the '[https://github.com/freephile/ansible-playbook.git ansible-playbook]' | I've cloned the '[https://github.com/freephile/ansible-playbook.git ansible-playbook]' | ||
− | ==Ansible with Drupal== | + | == Ansible with Drupal == |
− | + | * Jeff Geerling (geerlingguy) has his code on github https://github.com/geerlingguy/drupal-vm, and also a website http://www.drupalvm.com/. He's the author of Ansible for DevOps. The only problem I see with his code is that it installs everything from his own 'roles' (individual components) via the sharing site/mechanism called Ansible Galaxy. So, for example, phpMyAdmin comes from https://github.com/geerlingguy/ansible-role-phpmyadmin This is good in that he can make his system work, but it's bad in that you're getting all your bits from him and can't tweak any of it without manually checking each role for the code and instructions behind it so you know what you can set via variables and such. I'd rather see each of these roles contained in the project, community sourced, installed via git. | |
− | *Jeff Geerling (geerlingguy) has his code on github https://github.com/geerlingguy/drupal-vm, and also a website http://www.drupalvm.com/. He's the author of Ansible for DevOps. The only problem I see with his code is that it installs everything from his own 'roles' (individual components) via the sharing site/mechanism called Ansible Galaxy. So, for example, phpMyAdmin comes from https://github.com/geerlingguy/ansible-role-phpmyadmin This is good in that he can make his system work, but it's bad in that you're getting all your bits from him and can't tweak any of it without manually checking each role for the code and instructions behind it so you know what you can set via variables and such. I'd rather see each of these roles contained in the project, community sourced, installed via git. | ||
<pre> | <pre> | ||
geerlingguy.firewall | geerlingguy.firewall | ||
Line 217: | Line 157: | ||
</pre> | </pre> | ||
− | *on [https://www.digitalocean.com/community/tutorials/how-to-create-an-ansible-playbook-to-automate-drupal-installation-on-ubuntu-14-04 Digital Ocean] | + | * on [https://www.digitalocean.com/community/tutorials/how-to-create-an-ansible-playbook-to-automate-drupal-installation-on-ubuntu-14-04 Digital Ocean] |
− | ==Ansible in the cloud== | + | == Ansible in the cloud == |
Ansible has several core modules for working with various [http://docs.ansible.com/list_of_cloud_modules.html cloud providers]. These include | Ansible has several core modules for working with various [http://docs.ansible.com/list_of_cloud_modules.html cloud providers]. These include | ||
− | *Amazon | + | * Amazon |
− | *[[Digital Ocean]] http://docs.ansible.com/digital_ocean_module.html | + | * [[Digital Ocean]] http://docs.ansible.com/digital_ocean_module.html |
− | *[[Linode]] http://docs.ansible.com/linode_module.html | + | * [[Linode]] http://docs.ansible.com/linode_module.html |
− | *[[LXC]] | + | * [[LXC]] |
− | *OpenStack | + | * OpenStack |
− | ==Ansible on Fedora== | + | == Ansible on Fedora == |
The [https://fedoraproject.org/wiki/Fedora_Project_Wiki Fedora Project] uses Ansible in it's Infrastructure team, and they publish their whole setup https://infrastructure.fedoraproject.org/cgit/ansible.git/tree/README | The [https://fedoraproject.org/wiki/Fedora_Project_Wiki Fedora Project] uses Ansible in it's Infrastructure team, and they publish their whole setup https://infrastructure.fedoraproject.org/cgit/ansible.git/tree/README | ||
− | + | == Ansible Docs == | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ==Ansible Docs== | ||
Some of the docs pages I've visited | Some of the docs pages I've visited | ||
− | *https://docs.ansible.com/ansible/playbooks_intro.html | + | * https://docs.ansible.com/ansible/playbooks_intro.html |
− | *https://docs.ansible.com/ansible/intro_inventory.html | + | * https://docs.ansible.com/ansible/intro_inventory.html |
− | *http://docs.ansible.com/playbooks_best_practices.html | + | * http://docs.ansible.com/playbooks_best_practices.html |
− | *http://docs.ansible.com/playbooks_loops.html | + | * http://docs.ansible.com/playbooks_loops.html |
− | *https://docs.ansible.com/ansible/playbooks_conditionals.html | + | * https://docs.ansible.com/ansible/playbooks_conditionals.html |
− | *https://docs.ansible.com/ansible/playbooks_startnstep.html | + | * https://docs.ansible.com/ansible/playbooks_startnstep.html |
− | *https://docs.ansible.com/ansible/playbooks_roles.html#task-include-files-and-encouraging-reuse | + | * https://docs.ansible.com/ansible/playbooks_roles.html#task-include-files-and-encouraging-reuse |
− | *http://docs.ansible.com/YAMLSyntax.html | + | * http://docs.ansible.com/YAMLSyntax.html |
− | *https://docs.ansible.com/ansible/become.html | + | * https://docs.ansible.com/ansible/become.html |
− | *https://docs.ansible.com/ansible/debug_module.html | + | * https://docs.ansible.com/ansible/debug_module.html |
− | *https://docs.ansible.com/ansible/playbooks_debugger.html (<code>strategy:debug</code>) | + | * https://docs.ansible.com/ansible/playbooks_debugger.html (<code>strategy:debug</code>) |
− | *https://docs.ansible.com/ansible/playbooks_conditionals.html#sts=The When Statement%C2%B6 | + | * https://docs.ansible.com/ansible/playbooks_conditionals.html#sts=The When Statement%C2%B6 |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | == Ansible References == |
+ | * http://tjelvarolsson.com/blog/taking-the-effort-out-of-server-configuration-using-ansible/ | ||
+ | * http://tjelvarolsson.com/blog/how-to-create-automated-and-reproducible-work-flows-for-installing-scientific-software/ < with Vagrant | ||
+ | * http://jpmens.net/2012/06/06/configuration-management-with-ansible/ | ||
+ | * [http://jinja.pocoo.org/docs/dev/ Jinja] - the template engine for Ansible | ||
− | |||
− | |||
− | |||
− | |||
{{References}} | {{References}} | ||
− | |||
[[Category:Configuration Management]] | [[Category:Configuration Management]] | ||
[[Category:DevOps]] | [[Category:DevOps]] |