【发布时间】:2015-10-14 07:23:17
【问题描述】:
我想在 Ansible 中为新机器编写一个引导程序手册,它将重新配置网络设置。在第一次执行时,目标机器将拥有 DHCP 分配的地址。
应该执行 playbook 的用户知道分配给新机器的 IP 地址。我想提示用户输入值。
vars_prompt 模块允许从用户那里获取输入,但是它在hosts 部分下定义,有效地防止主机地址成为所需值。
是否可以不使用包装脚本修改库存文件?
【问题讨论】:
我想在 Ansible 中为新机器编写一个引导程序手册,它将重新配置网络设置。在第一次执行时,目标机器将拥有 DHCP 分配的地址。
应该执行 playbook 的用户知道分配给新机器的 IP 地址。我想提示用户输入值。
vars_prompt 模块允许从用户那里获取输入,但是它在hosts 部分下定义,有效地防止主机地址成为所需值。
是否可以不使用包装脚本修改库存文件?
【问题讨论】:
正确的做法是使用 add_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"
【讨论】:
您可以改用extra-vars 传递它。
只需将hosts 部分设为变量,例如{{ hosts_prompt }},然后在命令行上传递主机,如下所示:
ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
或者,如果您使用 default inventory file location 或 /etc/ansible/hosts,您可以简单地使用:
ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
【讨论】:
inventory/environment 部分只是一个示例(与playbook.yml 一样)。如果您没有提供带有 -i 的清单文件,那么 Ansible 将简单地选择默认的清单文件 /etc/ansible/hosts,即使您使用 extra-vars 指定主机,这通常也不是您想要的。
extra-vars 的示例,而不是“这是您需要输入的确切行”。并且库存是一个必要的参数,它只是默认为/etc/ansible/hosts,如果该文件不存在,那么它将失败。
添加到 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"
【讨论】:
免责声明:The accepted answer 为问题提供了最佳解决方案。虽然这个正在工作,但它是基于 hack,我将其作为参考。
我发现可以使用当前未记录的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"
【讨论】: