如何在Ansible中提示用户输入目标主机?

如何在Ansible中提示用户输入目标主机?,ansible,ansible-inventory,Ansible,Ansible Inventory,我想为Ansible中的新机器编写一个bootstrapper playbook,它将重新配置网络设置。在第一次执行时,目标机器将具有DHCP分配的地址 应该执行playbook的用户知道分配给新机器的IP地址。我想提示用户输入is值 vars\u prompt模块允许从用户处获取输入,但它是在hosts部分中定义的,有效地防止主机地址成为所需值 是否可以不使用包装器脚本修改库存文件?您可以将其传递 只需将您的hosts部分设置为变量,例如{{{hosts\u prompt}},然后在命令行上按

我想为Ansible中的新机器编写一个bootstrapper playbook,它将重新配置网络设置。在第一次执行时,目标机器将具有DHCP分配的地址

应该执行playbook的用户知道分配给新机器的IP地址。我想提示用户输入is值

vars\u prompt
模块允许从用户处获取输入,但它是在
hosts
部分中定义的,有效地防止主机地址成为所需值

是否可以不使用包装器脚本修改库存文件?

您可以将其传递

只需将您的
hosts
部分设置为变量,例如
{{{hosts\u prompt}}
,然后在命令行上按如下方式传递主机:

ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
或者,如果您使用的是
/etc/ansible/hosts
,您只需使用:

ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
免责声明:提供问题的最佳解决方案。虽然这是一个工作,它是基于一个黑客,我留下它作为参考

我发现有可能使用一个当前未记录的(请为我指点帖子)将
-I
/
--inventory
参数的值转换为一个临时主机列表()。只有主机名/ip地址和一个尾随空格(如下所示),它指的是单个主机,不需要存在清单文件

命令:

ansible-playbook -i "192.168.1.21," playbook.yml
因此,可以针对所有主机运行
playbook.yml
(在上面的示例中,它将等于单个主机
192.168.1.21
):


该列表可能包含多个ip地址
-i“192.168.1.21192.168.1.22”

正确的方法是使用add\u host创建一个动态主机并将其放置在一个新组中,然后开始针对该组的新播放。这样,如果您有其他需要提前设置的连接变量(凭据/密钥等),您可以在资源清册中的空组上设置它们,然后动态地将主机添加到其中。例如:

- hosts: localhost
  gather_facts: no
  vars_prompt:
  - name: target_host
    prompt: please enter the target host IP
    private: no
  tasks:
    - add_host:
        name: "{{ target_host }}"
        groups: dynamically_created_hosts

- hosts: dynamically_created_hosts
  tasks:
  - debug: msg="do things on target host here"

增加了Matt对多个主机的回答

输入示例为
192.0.2.10192.0.2.11

- hosts: localhost
  gather_facts: no
  vars_prompt:
  - name: target_host
    prompt: please enter the target host IP
    private: no
  tasks:
    - add_host:
        name: "{{ item }}"
        groups: dynamically_created_hosts
      with_items: "{{ target_host.split(',') }}"


- hosts: dynamically_created_hosts
  tasks:
  - debug: msg="do things on target host here"

inventory/environment
部分只是一个示例(与
playbook.yml
一样)。如果您没有提供带有
-i
的清单文件,那么Ansible将只选择默认的清单文件
/etc/Ansible/hosts
,这通常不是您想要的,即使您使用
extra-vars
指定主机也是一个关于如何传递
extra-vars
的示例,而不是一个示例“这是您需要键入的确切行“。清单是一个必要的参数,它只是默认为
/etc/ansible/hosts
,如果该文件不存在,它将失败。@techraf:您建议的编辑在审阅队列中被拒绝。Ydaetskor与此无关。这样的编辑根本不被接受。由于此答案目前确实为您提供了答案,您确实应该接受它,以备将来的访问者使用。您的答案已被删除,因为它是此答案的复制粘贴。这样的剽窃是不允许的。这个答案的OP现在将您的具体案例添加到了答案中,因此我真的看不出有什么理由不接受这个答案。我不喜欢这种方法,因为如果有人错误地运行没有参数的playbook,那么地狱就会失控。
- hosts: localhost
  gather_facts: no
  vars_prompt:
  - name: target_host
    prompt: please enter the target host IP
    private: no
  tasks:
    - add_host:
        name: "{{ item }}"
        groups: dynamically_created_hosts
      with_items: "{{ target_host.split(',') }}"


- hosts: dynamically_created_hosts
  tasks:
  - debug: msg="do things on target host here"