2015-10-14 43 views
8

我想为Ansible中的新机器编写引导程序操作手册,它将重新配置网络设置。在第一次执行时,目标机器将具有DHCP分配的地址。如何提示用户在Ansible中的目标主机?

应该执行剧本的用户知道新机器的分配IP地址。我想提示用户是否有价值。

vars_prompt模块允许从用户那里获得输入,但是它被定义在hosts部分有效防止主机地址作为所需值。

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

回答

13

正确的方法是使用add_host和pl创建一个动态主机将它加入一个新组,然后开始一个针对该组的新剧。这样,如果您需要提前设置其他连接变量(凭证/密钥/等),则可以将它们设置为清单中的空白组,然后将该主机动态添加到它。例如:

- 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" 
4

您可以改为使用extra-vars

只要让你的hosts段的一个变量,如{{ hosts_prompt }},然后通过主机的命令行上像这样:

ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10" 

或者,如果你正在使用的/etc/ansible/hostsdefault inventory file location,你可以简单地使用:

ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10" 
+1

的'库存/ environment'部分仅仅是一个例子(与'playbook.yml')。如果你没有提供'-i'的库存文件,那么Ansible就会简单地选择默认的库文件'/ etc/ansible/hosts',这通常不是你想要的,即使你使用'extra- vars' – ydaetskcoR

+1

这是一个关于如何传递“extra-vars”的例子,而不是“这里是你需要输入的确切行”。库存_是一个必要的参数,它只是默认为'/ etc/ansible/hosts',如果该文件不存在,那么它将会失败。 – ydaetskcoR

+1

@techraf:您的建议修改在审核队列中被拒绝。 ydaetskcoR与此无关。像这样的编辑根本不被接受。由于这个答案_does_目前为你提供了答案,你应该接受它,为了未来的参观者。 – Cerbrus

1

声明:The accepted answer提供了最佳的解决方案。虽然这是一个工作,它是基于黑客,我把它作为参考。

我发现这是可以使用当前无证hack(信贷Bruce P指着我的帖子),轮流-i/--inventory参数的值到主机(reference)临时名单。仅使用主机名/ IP地址和尾随空格(如下所示),它指的是单个主机,而不需要库存文件存在。

命令:

ansible-playbook -i "192.168.1.21," playbook.yml 

并据此playbook.yml可以对所有主机上运行(在上面的例子将等于单个主机192.168.1.21):

- hosts: all 

列表可能包含更多的比一个IP地址-i "192.168.1.21,192.168.1.22"

+2

我不喜欢这种方法,因为如果有人无意误用了参数来运行剧本,那么**地狱就会松散**。 – sorin

1

添加到Matt的多个主机的答案。

输入例子是192.0.2.10,192.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"