magnetometer
magnetometer

Reputation: 656

Ansible fails to pass parameters when executing a .run file

I am trying to use Ansible to install a .run file (created using Makeself 2.1.5) using the following task in a playbook:

- name: Install Program
  command: /home/user/folder/program.run -- /S /D=/home/user/folder/destination/

Here, /S is a switch to run a silent installation and the parameter /D sets the destination for the installation. Running this command in the console succeeds.

Ansible claims to run the task without error:

changed: [127.0.0.1] => {
    "changed": true, 
    "cmd": [
        "/home/user/folder/program.run", 
        "--", 
        "/S", 
        "/D=/home/user/folder/destination/"
    ], 
    "delta": "0:00:00.065261", 
    "end": "2017-01-06 09:08:43.114265", 
    "invocation": {
        "module_args": {
            "_raw_params": "/home/user/folder/program.run -- /S /D=/home/user/folder/destination/", 
            "_uses_shell": false, 
            "chdir": null, 
            "creates": null, 
            "executable": null, 
            "removes": null, 
            "warn": true
        }, 
        "module_name": "command"
    }, 
    "rc": 0, 
    "start": "2017-01-06 09:08:43.049004", 
    "stderr": "", 
    "stdout": "", 
    "stdout_lines": [], 
    "warnings" : []

So somehow the additional parameters cause the execution to fail without Ansible noticing. I've tried using the shell command and various ways of quoting my command, but to no avail.

If I do not pass parameters to the .run file, that is use command: /home/user/folder/program.run, an installation prompt is opened asking for user input, which defeats the purpose of Ansible.

Does anybody have a solution for this? A possible workaround might be to use the expect module, but I would prefer to be able to use the command line arguments, as this is not the only file I would like to install.

I am using Ansible 2.2.0.0 on Ubuntu 16.04.1 LTS.

EDIT: Following techraf's advice, I found a simple solution using the shell module. Using shell: konsole -e /home/user/folder/program.run /S /D=/home/user/folder/destination/ caused the installation to complete correctly. It is also possible to put the command in a script file and run it using the script module.

Upvotes: 1

Views: 1654

Answers (1)

techraf
techraf

Reputation: 68629

Try using the shell module instead of command:

- name: Install Program
  shell: /home/user/folder/program.run -- /S /D=/home/user/folder/destination/

You are using -- in the command execution, which actually prevents shell form parsing the arguments that follow. It's a shell built-in, not a parameter of the command.

Can't test it now (and frankly showing without the real program you run it's impossible), but I bet it should work.


If the above won't work, you'd probably have to put this line in a script and run it with the script module.

Upvotes: 1

Related Questions