These changes have been validated against the following guest systems: - Debian 7 and 8 - Ubuntu 12.04, 14.04 and 16.04 - Fedora 21 and 23 - CentOS 7 - OracleLinux 7 - Scientific Linux 7 At the moment, the pip setup (via get-pip.py script) is not working for RHEL6-like systems (CentOS 6.6, OracleLinux 6.5, Scientific Linux 6), because Python 2.6 has been deprecated and is no longer supported by Python core team. I consider this limitation with low priority in Vagrant context. The `:pip` install_mode is currently not implemented for the following platforms: - OpenSUSE - ArchLinux - FreeBSD Known Issue: By using get-pip.py script, any previous pip installation will be most probably overrided. This could be an issue for Python developers who would prefer to keep their base box setup untouched. In future iteration, it could be possible to choose to reinstall/upgrade pip or not. issue for Python developers who would prefer to keep their base box setup untouched. In future iteration, it could be possible to choose to reinstall/upgrade pip or not. Resolve GH-6654 Resolve GH-7167 as the `version` option is now considered to select the version of Ansible to be installed.
156 lines
7.3 KiB
Markdown
156 lines
7.3 KiB
Markdown
---
|
|
layout: "docs"
|
|
page_title: "Ansible Local - Provisioning"
|
|
sidebar_current: "provisioning-ansible-local"
|
|
description: |-
|
|
The Vagrant Ansible Local provisioner allows you to provision the guest using Ansible playbooks by executing "ansible-playbook" directly on the guest
|
|
machine.
|
|
---
|
|
|
|
# Ansible Local Provisioner
|
|
|
|
**Provisioner name: `ansible_local`**
|
|
|
|
The Vagrant Ansible Local provisioner allows you to provision the guest using [Ansible](http://ansible.com) playbooks by executing **`ansible-playbook` directly on the guest machine**.
|
|
|
|
<div class="alert alert-warning">
|
|
<strong>Warning:</strong> If you are not familiar with Ansible and Vagrant already,
|
|
I recommend starting with the <a href="/docs/provisioning/shell.html">shell
|
|
provisioner</a>. However, if you are comfortable with Vagrant already, Vagrant
|
|
is a great way to learn Ansible.
|
|
</div>
|
|
|
|
## Setup Requirements
|
|
|
|
The main advantage of the Ansible Local provisioner in comparison to the [Ansible (remote) provisioner](/docs/provisioning/ansible.html) is that it does not require any additional software on your Vagrant host.
|
|
|
|
On the other hand, [Ansible must obviously be installed](https://docs.ansible.com/intro_installation.html#installing-the-control-machine) on your guest machine(s).
|
|
|
|
**Note:** By default, Vagrant will *try* to automatically install Ansible if it is not yet present on the guest machine (see the `install` option below for more details).
|
|
|
|
## Usage
|
|
|
|
This page only documents the specific parts of the `ansible_local` provisioner. General Ansible concepts like Playbook or Inventory are shortly explained in the [introduction to Ansible and Vagrant](/docs/provisioning/ansible_intro.html).
|
|
|
|
The Ansible Local provisioner requires that all the Ansible Playbook files are available on the guest machine, at the location referred by the `provisioning_path` option. Usually these files are initially present on the host machine (as part of your Vagrant project), and it is quite easy to share them with a Vagrant [Synced Folder](/docs/synced-folders/).
|
|
|
|
### Simplest Configuration
|
|
|
|
To run Ansible from your Vagrant guest, the basic `Vagrantfile` configuration looks like:
|
|
|
|
```ruby
|
|
Vagrant.configure("2") do |config|
|
|
# Run Ansible from the Vagrant VM
|
|
config.vm.provision "ansible_local" do |ansible|
|
|
ansible.playbook = "playbook.yml"
|
|
end
|
|
end
|
|
```
|
|
|
|
**Requirements:**
|
|
|
|
- The `playbook.yml` file is stored in your Vagrant's project home directory.
|
|
|
|
- The [default shared directory](/docs/synced-folders/basic_usage.html) is enabled (`.` → `/vagrant`).
|
|
|
|
## Options
|
|
|
|
This section lists the specific options for the Ansible Local provisioner. In addition to the options listed below, this provisioner supports the [common options for both Ansible provisioners](/docs/provisioning/ansible_common.html).
|
|
|
|
- `install` (boolean) - Try to automatically install Ansible on the guest system.
|
|
|
|
This option is enabled by default.
|
|
|
|
Vagrant will try to install (or upgrade) Ansible when one of these conditions are met:
|
|
|
|
- Ansible is not installed (or cannot be found).
|
|
|
|
- The `version` option is set to `"latest"`.
|
|
|
|
- The current Ansible version does not correspond to the `version` option.
|
|
|
|
**Attention:** There is no guarantee that this automated installation will replace a custom Ansible setup, that might be already present on the Vagrant box.
|
|
|
|
- `install_mode` (`:default` or `:pip`) - Select the way to automatically install Ansible on the guest system.
|
|
|
|
- `:default`: Ansible is installed from the operating system package manager. This mode doesn't support `version` selection. For many platforms (e.g Debian, FreeBSD, OpenSUSE) the official package repository is used, except for the following Linux distributions:
|
|
- On Ubuntu-like systems, the latest Ansible release is installed from the `ppa:ansible/ansible` repository.
|
|
- On RedHat-like systems, the latest Ansible release is installed from the [EPEL](http://fedoraproject.org/wiki/EPEL) repository.
|
|
|
|
- `:pip`: Ansible is installed from [PyPI](https://pypi.python.org/pypi) with [pip](https://pip.pypa.io) package installer. With this mode, Vagrant will systematically try to [install the latest pip version](https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py). The `:pip` mode can install a specific version of Ansible if such information is specified with the `version` option described below.
|
|
|
|
The default value is `:default`, and any invalid value for this option will silently fall back to the default value.
|
|
|
|
- `provisioning_path` (string) - An absolute path on the guest machine where the Ansible files are stored. The `ansible-galaxy` and `ansible-playbook` commands are executed from this directory. This is the location to place an [ansible.cfg](http://docs.ansible.com/ansible/intro_configuration.html) file, in case you need it.
|
|
|
|
The default value is `/vagrant`.
|
|
|
|
- `tmp_path` (string) - An absolute path on the guest machine where temporary files are stored by the Ansible Local provisioner.
|
|
|
|
The default value is `/tmp/vagrant-ansible`
|
|
|
|
- `version` (string) - The expected Ansible version.
|
|
|
|
This option is disabled by default.
|
|
|
|
When an Ansible version is defined (e.g. `"1.8.2"`), the Ansible local provisioner will be executed only if Ansible is installed at the requested version.
|
|
|
|
When this option is set to `"latest"`, no version check is applied.
|
|
|
|
**Attention:** It is currently not possible to use this option to specify which version of Ansible must be automatically installed. With the `install` option enabled, the latest version packaged for the target operating system will always be installed.
|
|
|
|
## Tips and Tricks
|
|
|
|
### Ansible Parallel Execution from a Guest
|
|
|
|
With the following configuration pattern, you can install and execute Ansible only on a single guest machine (the `"controller"`) to provision all your machines.
|
|
|
|
```ruby
|
|
Vagrant.configure("2") do |config|
|
|
|
|
config.vm.box = "ubuntu/trusty64"
|
|
|
|
config.vm.define "node1" do |machine|
|
|
machine.vm.network "private_network", ip: "172.17.177.21"
|
|
end
|
|
|
|
config.vm.define "node2" do |machine|
|
|
machine.vm.network "private_network", ip: "172.17.177.22"
|
|
end
|
|
|
|
config.vm.define 'controller' do |machine|
|
|
machine.vm.network "private_network", ip: "172.17.177.11"
|
|
|
|
machine.vm.provision :ansible_local do |ansible|
|
|
ansible.playbook = "example.yml"
|
|
ansible.verbose = true
|
|
ansible.install = true
|
|
ansible.limit = "all" # or only "nodes" group, etc.
|
|
ansible.inventory_path = "inventory"
|
|
end
|
|
end
|
|
|
|
end
|
|
```
|
|
|
|
You need to create a static `inventory` file that corresponds to your `Vagrantfile` machine definitions:
|
|
|
|
```
|
|
controller ansible_connection=local
|
|
node1 ansible_ssh_host=172.17.177.21 ansible_ssh_private_key_file=/vagrant/.vagrant/machines/node1/virtualbox/private_key
|
|
node2 ansible_ssh_host=172.17.177.22 ansible_ssh_private_key_file=/vagrant/.vagrant/machines/node2/virtualbox/private_key
|
|
|
|
[nodes]
|
|
node[1:2]
|
|
```
|
|
|
|
And finally, you also have to create an [`ansible.cfg` file](https://docs.ansible.com/intro_configuration.html#openssh-specific-settings) to fully disable SSH host key checking. More SSH configurations can be added to the `ssh_args` parameter (e.g. agent forwarding, etc.)
|
|
|
|
```
|
|
[defaults]
|
|
host_key_checking = no
|
|
|
|
[ssh_connection]
|
|
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes
|
|
```
|