如何在 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/hostsdefault 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