如何在 Ansible 中提示用户输入目标主机?
How to prompt user for a target host in Ansible?
我想在 Ansible 中为新机器编写一个引导程序剧本,它将重新配置网络设置。在第一次执行时,目标机器将具有 DHCP 分配的地址。
应该执行剧本的用户知道分配给新机器的 IP 地址。我想提示用户输入值。
vars_prompt
模块允许从用户那里获取输入,但是它在 hosts
部分下定义有效地防止主机地址作为所需的值。
是否可以不使用包装器脚本修改清单文件?
你可以用 extra-vars
代替。
只需将您的 hosts
部分设为变量,例如 {{ hosts_prompt }}
,然后在命令行上传递主机,如下所示:
ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
或者,如果您使用 /etc/ansible/hosts
的 default inventory file location,您可以简单地使用:
ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
免责声明: 提供了问题的最佳解决方案。虽然这个正在运行,但它是基于黑客攻击的,我把它留作参考。
我发现可以使用当前未记录的 hack (credit to for pointing me to the post) that turns the value of -i
/ --inventory
parameter into an ad hoc list of hosts (reference)。只有 hostname/ip 地址和尾随 space(如下所示)它指的是一个主机,不需要存在清单文件。
命令:
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"
正确的做法是用 add_host 创建一个动态主机并将其放置在一个新组中,然后开始一个以该组为目标的新游戏。这样,如果您有其他需要提前设置的连接变量 (credentials/keys/etc),您可以将它们设置在清单中的空组中,然后将主机动态添加到其中。例如:
- 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.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"
添加到 Jacob 和 Matt 的示例中,包括用户名和密码提示:
---
- hosts: localhost
pre_tasks:
- name: verify_ansible_version
assert:
that: "ansible_version.full is version_compare('2.10.7', '>=')"
msg: "Error: You must update Ansible to at least version 2.10.7 to run this playbook..."
vars_prompt:
- name: target_hosts
prompt: |
Enter Target Host IP[s] or Hostname[s] (comma separated)
(example: 1.1.1.1,myhost.example.com)
private: false
- name: username
prompt: Enter Target Host[s] Login Username
private: false
- name: password
prompt: Enter Target Host[s] Login Password
private: true
tasks:
- add_host:
name: "{{ item }}"
groups: host_groups
with_items:
- "{{ target_hosts.split(',') }}"
- add_host:
name: login
username: "{{ username }}"
password: "{{ password }}"
- hosts: host_groups
remote_user: "{{ hostvars['login']['username'] }}"
vars:
ansible_password: "{{ hostvars['login']['password'] }}"
ansible_become: yes
ansible_become_method: sudo
ansible_become_pass: "{{ hostvars['login']['password'] }}"
roles:
- my_role
我想在 Ansible 中为新机器编写一个引导程序剧本,它将重新配置网络设置。在第一次执行时,目标机器将具有 DHCP 分配的地址。
应该执行剧本的用户知道分配给新机器的 IP 地址。我想提示用户输入值。
vars_prompt
模块允许从用户那里获取输入,但是它在 hosts
部分下定义有效地防止主机地址作为所需的值。
是否可以不使用包装器脚本修改清单文件?
你可以用 extra-vars
代替。
只需将您的 hosts
部分设为变量,例如 {{ hosts_prompt }}
,然后在命令行上传递主机,如下所示:
ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
或者,如果您使用 /etc/ansible/hosts
的 default inventory file location,您可以简单地使用:
ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
免责声明:
我发现可以使用当前未记录的 hack (credit to -i
/ --inventory
parameter into an ad hoc list of hosts (reference)。只有 hostname/ip 地址和尾随 space(如下所示)它指的是一个主机,不需要存在清单文件。
命令:
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"
正确的做法是用 add_host 创建一个动态主机并将其放置在一个新组中,然后开始一个以该组为目标的新游戏。这样,如果您有其他需要提前设置的连接变量 (credentials/keys/etc),您可以将它们设置在清单中的空组中,然后将主机动态添加到其中。例如:
- 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.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"
添加到 Jacob 和 Matt 的示例中,包括用户名和密码提示:
---
- hosts: localhost
pre_tasks:
- name: verify_ansible_version
assert:
that: "ansible_version.full is version_compare('2.10.7', '>=')"
msg: "Error: You must update Ansible to at least version 2.10.7 to run this playbook..."
vars_prompt:
- name: target_hosts
prompt: |
Enter Target Host IP[s] or Hostname[s] (comma separated)
(example: 1.1.1.1,myhost.example.com)
private: false
- name: username
prompt: Enter Target Host[s] Login Username
private: false
- name: password
prompt: Enter Target Host[s] Login Password
private: true
tasks:
- add_host:
name: "{{ item }}"
groups: host_groups
with_items:
- "{{ target_hosts.split(',') }}"
- add_host:
name: login
username: "{{ username }}"
password: "{{ password }}"
- hosts: host_groups
remote_user: "{{ hostvars['login']['username'] }}"
vars:
ansible_password: "{{ hostvars['login']['password'] }}"
ansible_become: yes
ansible_become_method: sudo
ansible_become_pass: "{{ hostvars['login']['password'] }}"
roles:
- my_role