Ansible - 在运行时定义库存 [英] Ansible - Define Inventory at run time

查看:36
本文介绍了Ansible - 在运行时定义库存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 ansible 不太熟悉,所以如果我的问题有点基础,请耐心等待.

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

场景:

我有几组远程主机,例如 [EPCs] [Clients] 和 [Testers]我可以按照我希望的方式配置它们.

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.

问题:

我需要编写一个剧本,在运行时向用户询问运行时的清单.例如,当运行剧本时,应以以下方式提示用户:输入要配置的 EPC 数量"输入您要配置的客户端数量"输入您要配置的测试人员数量"

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"

应该发生什么:

现在例如用户分别输入 2,5 和 8.现在剧本应该只处理组 [EPCs] 中的前 2 个节点、组 [Clients] 中的前 5 个节点和组 [Testers] 中的前 7 个节点.我不想创建大量的子组,例如如果我有 20 个 EPC,那么我不想为我的 EPC 定义 20 个组,我想要一些动态库存,它应该自动配置根据用户在运行时输入的机器使用 vars_prompt 选项或类似的选项

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

@gli 我试过你的解决方案,我的库存中有一个名为 test 的组,其中有两个节点.当我输入 0..1 时,我得到:

@gli I tried your solution, I have a group in my inventory named test with two nodes in it. When I enter 0..1 I get:

TASK: [echo sequence] ********************************************************* 
changed: [vm2] => (item=some_prefix0)
changed: [vm1] => (item=some_prefix0)
changed: [vm1] => (item=some_prefix1)
changed: [vm2] => (item=some_prefix1)

同样,当我输入 1..2 时,我得到:

Similarly when I enter 1..2 I get:

TASK: [echo sequence] ********************************************************* 
changed: [vm2] => (item=some_prefix1)
changed: [vm1] => (item=some_prefix1)
changed: [vm2] => (item=some_prefix2)
changed: [vm1] => (item=some_prefix2)

同样,当我输入 4..5(节点甚至不在清单中时,我得到:

Likewise when I enter 4..5 (nodes not even present in the inventory, I get:

TASK: [echo sequence] ********************************************************* 
changed: [vm1] => (item=some_prefix4)
changed: [vm2] => (item=some_prefix4)
changed: [vm1] => (item=some_prefix5)
changed: [vm2] => (item=some_prefix5)

任何帮助将不胜感激.谢谢!

Any help would be really appreciated. Thanks!

推荐答案

你应该使用 vars_prompt为了从用户那里获取信息,add_host 用于动态更新主机和 with_sequence for 循环:

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"

输出将是:

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

$ 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

在这里,它失败了,因为 host_0 和 host_1 无法访问,对你来说它会正常工作.

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

顺便说一句,我使用了更强大的概念节点范围".如果您不需要它,在提示中设置start=0"并仅要求stop"值非常简单.

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.

这篇关于Ansible - 在运行时定义库存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆