Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Ansible execute a shell script if a package is not installed

Tags:

ansible

How can I make Ansible execute a shell script if a (rpm) package is not installed? Is it somehow possible to leverage the yum module?

like image 451
Kimble Avatar asked Feb 19 '14 21:02

Kimble


People also ask

Can Ansible run Shell scripts?

Though Ansible Shell module can be used to execute Shell scripts. Ansible has a dedicated module named Script which can be used to copy the Shell script from the control machine to the remote server and to execute. Based on your requirement you can use either Script or Shell module to execute your scripts.

How do I know if Ansible package is installed or not?

How can I check if a software package is installed on a Linux system using Ansible?. You can use Ansible automation tool to query installation status of a package on Linux a system. From the results a condition can then be used, e.g skip a task if package is installed, or install if check status is failed.


2 Answers

I don't think the yum module would help in this case. It currently has 3 states: absent, present, and latest. Since it sounds like you don't want to actually install or remove the package (at least at this point) then you would need to do this in two manual steps. The first task would check to see if the package exists, then the second task would invoke a command based on the output of the first command.

If you use "rpm -q" to check if a package exists then the output would look like this for a package that exists:

# rpm -q httpd httpd-2.2.15-15.el6.centos.1.x86_64 

and like this if the package doesn't exist:

# rpm -q httpdfoo package httpdfoo is not installed 

So your ansible tasks would look something like this:

- name: Check if foo.rpm is installed   command: rpm -q foo.rpm   register: rpm_check  - name: Execute script if foo.rpm is not installed   command: somescript   when: rpm_check.stdout.find('is not installed') != -1 

The rpm command will also exit with a 0 if the package exists, or a 1 if the package isn't found, so another possibility is to use:

when: rpm_check.rc == 1 
like image 78
Bruce P Avatar answered Sep 21 '22 21:09

Bruce P


Based on the Bruce P answer above, a similar approach for apt/deb files is

- name: Check if foo is installed   command: dpkg-query -l foo   register: deb_check  - name: Execute script if foo is not installed   command: somescript   when: deb_check.stdout.find('no packages found') != -1 
like image 22
Kevin Carmody Avatar answered Sep 25 '22 21:09

Kevin Carmody