diff --git a/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb index 08122d604..8f06be4b7 100644 --- a/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb @@ -8,7 +8,7 @@ module VagrantPlugins module AnsibleInstall def self.ansible_install(machine, install_mode, ansible_version, pip_args) - if install_mode == :pip + if install_mode != :default raise Ansible::Errors::AnsiblePipInstallIsNotSupported else machine.communicate.sudo "pacman -Syy --noconfirm" diff --git a/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb index d2abb1ff8..fc8feeaad 100644 --- a/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb @@ -9,18 +9,18 @@ module VagrantPlugins def self.ansible_install(machine, install_mode, ansible_version, pip_args) - if (install_mode == :pip) - ansible_pip_install machine, ansible_version, pip_args + case install_mode + when :pip + pip_setup machine + Pip::pip_install machine, "ansible", ansible_version, pip_args, true + when :pip_args_only + pip_setup machine + Pip::pip_install machine, "", "", pip_args, false else ansible_apt_install machine end end - def self.ansible_pip_install(machine, ansible_version, pip_args) - pip_setup machine - Pip::pip_install machine, "ansible", ansible_version, pip_args - end - private def self.ansible_apt_install(machine) diff --git a/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb index 4315f74c5..fe651f372 100644 --- a/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb @@ -9,12 +9,16 @@ module VagrantPlugins module AnsibleInstall def self.ansible_install(machine, install_mode, ansible_version, pip_args) - rpm_package_manager = Facts::rpm_package_manager(machine) - - if install_mode == :pip + case install_mode + when :pip pip_setup machine - Pip::pip_install machine, "ansible", ansible_version, pip_args + Pip::pip_install machine, "ansible", ansible_version, pip_args, true + when :pip_args_only + pip_setup machine + Pip::pip_install machine, "", "", pip_args, false else + rpm_package_manager = Facts::rpm_package_manager(machine) + machine.communicate.sudo "#{rpm_package_manager} -y install ansible" end end diff --git a/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb index 947f6b934..3d01d4276 100644 --- a/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb @@ -8,7 +8,7 @@ module VagrantPlugins module AnsibleInstall def self.ansible_install(machine, install_mode, ansible_version) - if install_mode == :pip + if install_mode != :default raise Ansible::Errors::AnsiblePipInstallIsNotSupported else machine.communicate.sudo "yes | pkg install ansible" diff --git a/plugins/provisioners/ansible/cap/guest/pip/pip.rb b/plugins/provisioners/ansible/cap/guest/pip/pip.rb index ead4e8bf1..370aabd32 100644 --- a/plugins/provisioners/ansible/cap/guest/pip/pip.rb +++ b/plugins/provisioners/ansible/cap/guest/pip/pip.rb @@ -5,7 +5,7 @@ module VagrantPlugins module Guest module Pip - def self.pip_install(machine, package, version = "", pip_args = "", upgrade = true) + def self.pip_install(machine, package = "", version = "", pip_args = "", upgrade = true) upgrade_arg = "--upgrade" if upgrade version_arg = "" diff --git a/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb index e20258b3f..3119cab90 100644 --- a/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb @@ -9,9 +9,13 @@ module VagrantPlugins module AnsibleInstall def self.ansible_install(machine, install_mode, ansible_version, pip_args) - if install_mode == :pip + case install_mode + when :pip pip_setup machine - Pip::pip_install machine, "ansible", ansible_version, pip_args + Pip::pip_install machine, "ansible", ansible_version, pip_args, true + when :pip_args_only + pip_setup machine + Pip::pip_install machine, "", "", pip_args, false else ansible_rpm_install machine end diff --git a/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb index 08e7a96f4..0aa66e00f 100644 --- a/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb @@ -7,7 +7,7 @@ module VagrantPlugins module AnsibleInstall def self.ansible_install(machine, install_mode, ansible_version) - if install_mode == :pip + if install_mode != :default raise Ansible::Errors::AnsiblePipInstallIsNotSupported else machine.communicate.sudo("zypper --non-interactive --quiet install ansible") diff --git a/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb b/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb index 0754ab5ad..3629239d9 100644 --- a/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +++ b/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb @@ -8,8 +8,8 @@ module VagrantPlugins module AnsibleInstall def self.ansible_install(machine, install_mode, ansible_version, pip_args) - if install_mode == :pip - Debian::AnsibleInstall::ansible_pip_install machine, ansible_version, pip_args + if install_mode != :default + Debian::AnsibleInstall::ansible_install machine, install_mode, ansible_version, pip_args else ansible_apt_install machine end diff --git a/plugins/provisioners/ansible/config/guest.rb b/plugins/provisioners/ansible/config/guest.rb index 2531f26ae..16992cb5a 100644 --- a/plugins/provisioners/ansible/config/guest.rb +++ b/plugins/provisioners/ansible/config/guest.rb @@ -38,8 +38,11 @@ module VagrantPlugins def validate(machine) super - if @install_mode.to_s.to_sym == :pip + case @install_mode.to_s.to_sym + when :pip @install_mode = :pip + when :pip_args_only + @install_mode = :pip_args_only else @install_mode = :default end diff --git a/test/unit/plugins/provisioners/ansible/config/guest_test.rb b/test/unit/plugins/provisioners/ansible/config/guest_test.rb index 8a464c665..1b08182e6 100644 --- a/test/unit/plugins/provisioners/ansible/config/guest_test.rb +++ b/test/unit/plugins/provisioners/ansible/config/guest_test.rb @@ -81,6 +81,14 @@ describe VagrantPlugins::Ansible::Config::Guest do result = subject.validate(machine) expect(subject.install_mode).to eql(:pip) end + + it "supports :pip_args_only install_mode" do + subject.install_mode = "pip_args_only" + subject.finalize! + + result = subject.validate(machine) + expect(subject.install_mode).to eql(:pip_args_only) + end end end diff --git a/website/source/docs/provisioning/ansible_local.html.md b/website/source/docs/provisioning/ansible_local.html.md index 40e03f786..c506fbd7e 100644 --- a/website/source/docs/provisioning/ansible_local.html.md +++ b/website/source/docs/provisioning/ansible_local.html.md @@ -69,20 +69,69 @@ This section lists the _specific_ options for the Ansible Local provisioner. In **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. +- `install_mode` (`:default`, `:pip`, or `:pip_args_only`) - 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. + - `: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). With the `:pip` mode you can optionally install a specific Ansible release by setting the [`version`](#version) option. - The default value is `:default`, and any invalid value for this option will silently fall back to the default value. + Example: + + ```ruby + config.vm.provision "ansible_local" do |ansible| + ansible.playbook = "playbook.yml" + ansible.install_mode = "pip" + ansible.version = "2.2.1.0" + end + ``` + With this configuration, Vagrant will install `pip` and then execute the command + + ```shell + sudo pip install --upgrade ansible==2.2.1.0 + ``` + + - `:pip_args_only`: This mode is very similar to the `:pip` mode, with the difference that in this case no pip arguments will be automatically set by Vagrant. + + Example: + + ```ruby + config.vm.provision "ansible_local" do |ansible| + ansible.playbook = "playbook.yml" + ansible.install_mode = "pip_args_only" + ansible.pip_args = "-r /vagrant/requirements.txt" + end + ``` + + With this configuration, Vagrant will install `pip` and then execute the command + + ```shell + sudo pip install -r /vagrant/requirements.txt + ``` + + The default value of `install_mode` is `:default`, and any invalid value for this option will silently fall back to the default value. - `pip_args` (string) - When Ansible is installed via pip, this option allows the definition of additional pip arguments to be passed along on the command line (for example, [`--index-url`](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-i)). By default, this option is not set. + Example: + + ```ruby + config.vm.provision "ansible_local" do |ansible| + ansible.playbook = "playbook.yml" + ansible.install_mode = :pip + ansible.pip_args = "--install-url https://pypi.internal" + end + ``` + + With this configuration, Vagrant will install `pip` and then execute the command + + ```shell + sudo pip install --index-url https://pypi.internal --upgrade ansible + ``` + - `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`.