From 76ef7d3dc83db9587324fb768b79af69e98130e8 Mon Sep 17 00:00:00 2001 From: Moritz Heiber Date: Tue, 10 Jan 2023 14:05:44 +0100 Subject: [PATCH 1/3] Fix installing Ansible provisioner with version and pip --- .../cap/guest/posix/ansible_installed.rb | 4 ++-- .../provisioners/ansible/provisioner/guest.rb | 2 +- .../provisioners/ansible/provisioner/host.rb | 5 +++-- .../provisioners/ansible/provisioner_test.rb | 22 +++++++++++-------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb b/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb index 329eab8a9..3c7f623de 100644 --- a/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb +++ b/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb @@ -10,8 +10,8 @@ module VagrantPlugins def self.ansible_installed(machine, version) command = 'test -x "$(command -v ansible)"' - if !version.empty? - command << "&& ansible --version | grep 'ansible #{version}'" + unless version.empty? + command << "&& [[ $(python -c \"import importlib.metadata; print(importlib.metadata.version('ansible'))\") == \"#{version}\" ]]" end machine.communicate.test command, sudo: false diff --git a/plugins/provisioners/ansible/provisioner/guest.rb b/plugins/provisioners/ansible/provisioner/guest.rb index 1474b837b..e81bceaf5 100644 --- a/plugins/provisioners/ansible/provisioner/guest.rb +++ b/plugins/provisioners/ansible/provisioner/guest.rb @@ -75,7 +75,7 @@ module VagrantPlugins raw_output = "" result = @machine.communicate.execute( - "ansible --version", + "python -c \"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", error_class: Ansible::Errors::AnsibleNotFoundOnGuest, error_key: :ansible_not_found_on_guest) do |type, output| if type == :stdout && output.lines[0] diff --git a/plugins/provisioners/ansible/provisioner/host.rb b/plugins/provisioners/ansible/provisioner/host.rb index f2a57133c..c2b9ddea4 100644 --- a/plugins/provisioners/ansible/provisioner/host.rb +++ b/plugins/provisioners/ansible/provisioner/host.rb @@ -108,8 +108,9 @@ module VagrantPlugins end def gather_ansible_version - raw_output = "" - command = %w(ansible --version) + raw_output = '' + command = ['python', '-c', + "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\""] command << { notify: [:stdout, :stderr] diff --git a/test/unit/plugins/provisioners/ansible/provisioner_test.rb b/test/unit/plugins/provisioners/ansible/provisioner_test.rb index fdf9aa67e..d41d52af9 100644 --- a/test/unit/plugins/provisioners/ansible/provisioner_test.rb +++ b/test/unit/plugins/provisioners/ansible/provisioner_test.rb @@ -71,12 +71,14 @@ VF # Class methods for code reuse across examples # - def self.it_should_check_ansible_version() - it "execute 'ansible --version' before executing 'ansible-playbook'" do - expect(Vagrant::Util::Subprocess).to receive(:execute). - once.with('ansible', '--version', { :notify => [:stdout, :stderr] }) - expect(Vagrant::Util::Subprocess).to receive(:execute). - once.with('ansible-playbook', any_args) + def self.it_should_check_ansible_version + it "execute 'Python ansible version check before executing 'ansible-playbook'" do + expect(Vagrant::Util::Subprocess).to receive(:execute) + .once.with('python', '-c', "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", { notify: %i[ + stdout stderr + ] }) + expect(Vagrant::Util::Subprocess).to receive(:execute) + .once.with('ansible-playbook', any_args) end end @@ -326,6 +328,7 @@ VF "2.x.y.z": VagrantPlugins::Ansible::COMPATIBILITY_MODE_V2_0, "4.3.2.1": VagrantPlugins::Ansible::COMPATIBILITY_MODE_V2_0, "[core 2.11.0]": VagrantPlugins::Ansible::COMPATIBILITY_MODE_V2_0, + "7.1.0": VagrantPlugins::Ansible::COMPATIBILITY_MODE_V2_0 } valid_versions.each_pair do |ansible_version, mode| describe "and ansible version #{ansible_version}" do @@ -347,7 +350,7 @@ VF "2.9.2.1", ] invalid_versions.each do |unknown_ansible_version| - describe "and `ansible --version` returning '#{unknown_ansible_version}'" do + describe "and `ansible version check returning '#{unknown_ansible_version}'" do before do allow(subject).to receive(:gather_ansible_version).and_return(unknown_ansible_version) end @@ -1044,10 +1047,11 @@ VF expect {subject.provision}.to raise_error(VagrantPlugins::Ansible::Errors::AnsibleCommandFailed) end - it "execute three commands: ansible --version, ansible-galaxy, and ansible-playbook" do + it 'execute three commands: Python ansible version check, ansible-galaxy, and ansible-playbook' do expect(Vagrant::Util::Subprocess).to receive(:execute) .once - .with('ansible', '--version', { :notify => [:stdout, :stderr] }) + .with('python', '-c', + "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", { notify: %i[stdout stderr] }) .and_return(default_execute_result) expect(Vagrant::Util::Subprocess).to receive(:execute) .once From 5f82adf122bedb91480a4f86421c2c0161827205 Mon Sep 17 00:00:00 2001 From: Moritz Heiber Date: Wed, 11 Jan 2023 11:01:55 +0100 Subject: [PATCH 2/3] Replace python with python3, which is a common convention (and Ansible only works with Python 3) --- plugins/provisioners/ansible/provisioner/guest.rb | 2 +- plugins/provisioners/ansible/provisioner/host.rb | 2 +- test/unit/plugins/provisioners/ansible/provisioner_test.rb | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/provisioners/ansible/provisioner/guest.rb b/plugins/provisioners/ansible/provisioner/guest.rb index e81bceaf5..2e800a999 100644 --- a/plugins/provisioners/ansible/provisioner/guest.rb +++ b/plugins/provisioners/ansible/provisioner/guest.rb @@ -75,7 +75,7 @@ module VagrantPlugins raw_output = "" result = @machine.communicate.execute( - "python -c \"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", + "python3 -c \"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", error_class: Ansible::Errors::AnsibleNotFoundOnGuest, error_key: :ansible_not_found_on_guest) do |type, output| if type == :stdout && output.lines[0] diff --git a/plugins/provisioners/ansible/provisioner/host.rb b/plugins/provisioners/ansible/provisioner/host.rb index c2b9ddea4..ef700f03a 100644 --- a/plugins/provisioners/ansible/provisioner/host.rb +++ b/plugins/provisioners/ansible/provisioner/host.rb @@ -109,7 +109,7 @@ module VagrantPlugins def gather_ansible_version raw_output = '' - command = ['python', '-c', + command = ['python3', '-c', "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\""] command << { diff --git a/test/unit/plugins/provisioners/ansible/provisioner_test.rb b/test/unit/plugins/provisioners/ansible/provisioner_test.rb index d41d52af9..2cb9f7bce 100644 --- a/test/unit/plugins/provisioners/ansible/provisioner_test.rb +++ b/test/unit/plugins/provisioners/ansible/provisioner_test.rb @@ -74,7 +74,7 @@ VF def self.it_should_check_ansible_version it "execute 'Python ansible version check before executing 'ansible-playbook'" do expect(Vagrant::Util::Subprocess).to receive(:execute) - .once.with('python', '-c', "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", { notify: %i[ + .once.with('python3', '-c', "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", { notify: %i[ stdout stderr ] }) expect(Vagrant::Util::Subprocess).to receive(:execute) @@ -1050,7 +1050,7 @@ VF it 'execute three commands: Python ansible version check, ansible-galaxy, and ansible-playbook' do expect(Vagrant::Util::Subprocess).to receive(:execute) .once - .with('python', '-c', + .with('python3', '-c', "\"import importlib.metadata; print('ansible ' + importlib.metadata.version('ansible'))\"", { notify: %i[stdout stderr] }) .and_return(default_execute_result) expect(Vagrant::Util::Subprocess).to receive(:execute) From dfabbbb7fe664975508a2ad5455b7ece325f56f0 Mon Sep 17 00:00:00 2001 From: Moritz Heiber Date: Wed, 11 Jan 2023 12:54:42 +0100 Subject: [PATCH 3/3] Forgot one occurance of using the raw python vs. python3 --- .../provisioners/ansible/cap/guest/posix/ansible_installed.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb b/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb index 3c7f623de..ab171ee5d 100644 --- a/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb +++ b/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb @@ -11,7 +11,7 @@ module VagrantPlugins command = 'test -x "$(command -v ansible)"' unless version.empty? - command << "&& [[ $(python -c \"import importlib.metadata; print(importlib.metadata.version('ansible'))\") == \"#{version}\" ]]" + command << "&& [[ $(python3 -c \"import importlib.metadata; print(importlib.metadata.version('ansible'))\") == \"#{version}\" ]]" end machine.communicate.test command, sudo: false