Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running Python script via ansible

I'm trying to run a python script from an ansible script. I would think this would be an easy thing to do, but I can't figure it out. I've got a project structure like this:

playbook-folder
  roles
    stagecode
      files
        mypythonscript.py
      tasks
        main.yml
  release.yml

I'm trying to run mypythonscript.py within a task in main.yml (which is a role used in release.yml). Here's the task:

- name: run my script!
  command: ./roles/stagecode/files/mypythonscript.py
  args:
    chdir: /dir/to/be/run/in
  delegate_to: 127.0.0.1
  run_once: true

I've also tried ../files/mypythonscript.py. I thought the path for ansible would be relative to the playbook, but I guess not?

I also tried debugging to figure out where I am in the middle of the script, but no luck there either.

- name: figure out where we are
  stat: path=.
  delegate_to: 127.0.0.1
  run_once: true
  register: righthere
    
- name: print where we are
  debug: msg="{{righthere.stat.path}}"
  delegate_to: 127.0.0.1
  run_once: true

That just prints out ".". So helpful ...

like image 213
CorayThan Avatar asked Feb 01 '16 20:02

CorayThan


People also ask

Can we use Python script in Ansible playbook?

In this page, We are going to see how to run any python scripts on remote machines in ansible playbook. synchronize ansible module will be used to copy the python scripts from local machine (controller machine) to remote machine using push mode and delegate_to.

Is Ansible a programming language?

Ansible is not a language If Ansible isn't a programming language, then what is it? Ansible is a tool written in Python, and it uses the declarative markup language YAML to describe the desired state of devices and configuration.

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.

Does Ansible have an API?

Ansible is written in its own API so you have a considerable amount of power across the board.


3 Answers

try to use script directive, it works for me

my main.yml

---
- name: execute install script
  script: get-pip.py

and get-pip.py file should be in files in the same role

like image 63
Orest Stetsiak Avatar answered Nov 06 '22 21:11

Orest Stetsiak


If you want to be able to use a relative path to your script rather than an absolute path then you might be better using the role_path magic variable to find the path to the role and work from there.

With the structure you are using in the question the following should work:

- name: run my script!
  command: ./mypythonscript.py
  args:
    chdir: "{{ role_path }}"/files
  delegate_to: 127.0.0.1
  run_once: true
like image 41
ydaetskcoR Avatar answered Nov 06 '22 19:11

ydaetskcoR


An alternative/straight forward solution: Let's say you have already built your virtual env under ./env1 and used pip3 install the needed python modules. Now write playbook task like:

 - name: Run a script using an executable in a system path
  script: ./test.py
  args:
    executable: ./env1/bin/python
  register: python_result
  
  - name: Get stdout or stderr from the output
    debug:
      var: python_result.stdout
like image 41
Johnny.X Avatar answered Nov 06 '22 20:11

Johnny.X