Ansible - Define Inventory at run time

拟墨画扇 提交于 2019-12-03 08:13:56

You should use vars_prompt for getting information from user, add_host for updating hosts dynamically and with_sequence for loops:

$ cat aaa.yml
---
- 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="host_{{item}}" groups=just_created
      with_sequence: "start={{start}} end={{stop}} "

- hosts: just_created
  gather_facts: False
  tasks:
    - name: echo sequence
      shell: echo "cmd"

The output will be:

$ ansible-playbook aaa.yml -i 'localhost,'

Enter range of EPCs (e.g. 1..5) [1]: 0..1

PLAY [localhost] **************************************************************

TASK: [Set node id variables] *************************************************
ok: [localhost]

TASK: [Add hosts:] ************************************************************
ok: [localhost] => (item=0)
ok: [localhost] => (item=1)

PLAY [just_created] ***********************************************************

TASK: [echo sequence] *********************************************************
fatal: [host_0] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
fatal: [host_1] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/Users/gli/aaa.retry

host_0                     : ok=0    changed=0    unreachable=1    failed=0
host_1                     : ok=0    changed=0    unreachable=1    failed=0
localhost                  : ok=2    changed=0    unreachable=0    failed=0

Here, it failed as host_0 and host_1 are unreachable, for you it'll work fine.

btw, I used more powerful concept "range of nodes". If you don't need it, it is quite simple to have "start=0" and ask only for "stop" value in the prompt.

I don't think you can define an inventory at run time. One thing you can do is, write a wrapper script over Ansible which will first prompt user for the hosts and then dynamically structure an ansible-playbook command.

I would prefer doing this using python, but you can use any language of your choice.

$ cat ansible_wrapper.py 
import ConfigParser
import os

nodes = ''
inv = {}

hosts =  raw_input("Enter hosts: ")
hosts = hosts.split(",")

config = ConfigParser.ConfigParser(allow_no_value=True)
config.readfp(open('hosts'))
sections = config.sections()

for i in range(len(sections)):
    inv[sections[i]] = hosts[i]


for key, value in inv.items():
    for i in range(int(value)):
        nodes = nodes + config.items(key)[i][0] + ";"


command = 'ansible-playbook -i hosts myplaybook.yml -e "nodes=%s"' % (nodes)
print "Running command: ", command
os.system(command)

Note: I've tried running this script only using python2.7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!