Ansible - Define Inventory at run time

105 views
Skip to first unread message

Imran Khan

unread,
Aug 17, 2014, 4:42:48 PM8/17/14
to ansible...@googlegroups.com

I am liitle new to ansible so bear with me if my questions are a bit basic.

Scenario:

I have a few group of Remote hosts such as [EPCs] [Clients] and [Testers] I am able to configure them just the way I want them to be.

Problem:

I need to write a playbook, which when runs, asks the user for the inventory at run time. As an example when a playbook is run the user should be prompted in the following way: "Enter the number of EPCs you want to configure" "Enter the number of clients you want to configure" "Enter the number of testers you want to configure"

What should happen:

Now for instance the user enters 2,5 and 8 respectively. Now the playbook should only address the first 2 nodes in the group [EPCs], the first 5 nodes in group [Clients] and the first 7 nodes in the group [Testers] . I don't want to create a large number of sub-groups, for instance if I have 20 EPCs, then I don't want to define 20 groups for my EPCs, I want somewhat of a dynamic inventory, which should automatically configure the machines according to the user input at run time using the vars_prompt option or something similar to that

Let me post a partial part of my playbook for better understanding of what is to happen:

---
- hosts: epcs # Now this is the part where I need a lot of flexibility

  vars_prompt:
    name: "what is your name?"
    quest: "what is your quest?"

  gather_facts: no

  tasks:

  - name: Check if path exists
    stat: path=/home/khan/Desktop/tobefetched/file1.txt
    register: st

  - name: It exists
    debug: msg='Path existence verified!'
    when: st.stat.exists

   - name: It doesn't exist
     debug: msg="Path does not exist"
     when: st.stat.exists == false

   - name: Copy file2 if it exists
     fetch: src=/home/khan/Desktop/tobefetched/file2.txt dest=/home/khan/Desktop/fetched/   flat=yes
     when: st.stat.exists

   - name: Run remotescript.sh and save the output of script to output.txt on the Desktop
     shell: cd /home/imran/Desktop; ./remotescript.sh > output.txt

   - name: Find and replace a word in a file placed on the remote node using variables
     shell: cd /home/imran/Desktop/tobefetched; sed -i 's/{{name}}/{{quest}}/g' file1.txt

    tags:
       - replace

Brian Coca

unread,
Aug 17, 2014, 11:11:56 PM8/17/14
to ansible...@googlegroups.com
have an initial play on 'localhost', prompt for those values and use add_host to add those hosts to the groups. Subsequent plays can target the groups.


--
Brian Coca
Stultorum infinitus est numerus
0110000101110010011001010110111000100111011101000010000001111001011011110111010100100000011100110110110101100001011100100111010000100001
Pedo mellon a minno

Imran Khan

unread,
Aug 20, 2014, 3:16:14 AM8/20/14
to ansible...@googlegroups.com
For any one interested, here is the playbook


    ---
    - hosts: localhost
      gather_facts: False
      vars_prompt:
        - name: range
          prompt: Enter range of EPCs (e.g. 1..5)
          private: False
          default: "1"
      pre_tasks:
        - name: Set node id variables
          set_fact:
            start: "{{ range.split('..')[0] }}"
            stop: "{{ range.split('..')[-1] }}"
        - name: "Add hosts:"
          add_host: name="vm{{item|int +1}}" groups=just_created
          with_sequence: "start={{start}} end={{stop}} "

    - hosts: just_created
      gather_facts: False
      tasks:
        - name: echo sequence
          shell: echo "cmd"
Reply all
Reply to author
Forward
0 new messages