4

I want to write a playbook for following scenario: reads a text file which has linux commands written it, executes them one by one, aborts if any command fails to execute, and if I correct the command and run the playbook again it should execute from where it was aborted (instead of executing from beginning)

sample file: sample.txt

echo "hello world"  
df -h  
free -m  
mkdir /tmp/`hostname`_bkp  
touch /tmp/`hostname`_bkp/file{1..5}  
mvn -version  
echo "directory and files created"  
echo "Bye.!"  

So for example if mvn -version fails to execute then ansible should abort.

How can achieve scenario through ansible?

4
  • Is there any particular reason to execute the commands from a file, and not just create task for each command?
    – 13dimitar
    Commented Mar 1, 2017 at 8:11
  • As there are lot of commands to be executed so I thought putting them consolidated in a text file and reading them line by line would be an idea.
    – hruday
    Commented Mar 1, 2017 at 11:52
  • 1
    actually it is better to use a tasks file for that - every command is a task, which will be executed. You can set conditions, loops, actions on success/unsuccessful completion of tasks and so on. I will draft an example with your commands and post them in an answer. Meanwhile, if you want a more useful/meaningful commands to be executed, please edit your questions - I'm not sure what exactly is the benefit of echo "Hello World!" for you :)
    – 13dimitar
    Commented Mar 1, 2017 at 11:58
  • I just gave an example that my text file looks like this. Actual commands may be tested once I get any working code. :)
    – hruday
    Commented Mar 1, 2017 at 13:21

1 Answer 1

2

Bellow is an example playbook, which executes a number of simple tasks.

---
 - hosts: localhost
   tasks:
    - name: say hi
      shell: echo "Hello, World!"

    - name: do df -h
      shell: df -h
      register: space

    - name: show the output of df -h
      debug: var=space

    - name: do free -m
      shell: free -m
      register: memory
      ignore_errors: yes

    - name: show memory stats
      debug: var=memory

    - name: create /tmp/"hostname"_bkp
      file: dest=/tmp/{{ ansible_nodename }}_bkp state=directory

    - name: create files
      file: dest=/tmp/{{ ansible_nodename }}_bkp/file{{ item }} state=touch
      with_items:
       - 1
       - 2
       - 3
       - 4
       - 5

It creates a directory and files at the desired location. You can also set ownership, permissions, which fit better your requirements.

ansible_nodename is an ansible fact (a variable), which gets collected at the beginning of a play.

You can see more information about the ansible file module here. Please have a look at the other ansible modules - they are plenty, easy to learn and powerful.

2
  • Thanks for your playbook, Here we have only a sample 4 or 5 commands. what if I have more than 20/25/50 commands then what would be the best approach through ansible.?
    – hruday
    Commented Mar 1, 2017 at 13:24
  • You can create roles (e.g. role apache, which will have few tasks file - one main which includes other tasks files (install nginx, deploy configuration files, harden apache), or role for ssh - tasks file which installs and hardens sshd. It is a common and a good practice to follow such structure of your playbooks. I really advise you to go through docs.ansible.com/ansible/intro_getting_started.html
    – 13dimitar
    Commented Mar 1, 2017 at 13:30

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .