【问题标题】:How to prompt user for a target host in Ansible?如何在 Ansible 中提示用户输入目标主机?
【发布时间】:2015-10-14 07:23:17
【问题描述】:

我想在 Ansible 中为新机器编写一个引导程序手册,它将重新配置网络设置。在第一次执行时,目标机器将拥有 DHCP 分配的地址。

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

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

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

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

    正确的做法是使用 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"
    

    【讨论】:

      【解决方案2】:

      您可以改用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,如果该文件不存在,那么它将失败。
      • @techraf:您建议的编辑在审核队列中被拒绝。 ydaetskcoR 与此无关。这样的编辑根本不被 SO 接受。由于此答案确实目前为您提供了答案,您真的应该接受它,为了未来的访问者。
      • 您的答案已被删除,因为它是此答案的复制粘贴。 SO上不允许这样的抄袭。这个答案的 OP 现在将您的具体案例添加到答案中,所以我真的没有理由不接受这个。
      【解决方案3】:

      添加到 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"
      

      【讨论】:

        【解决方案4】:

        免责声明: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"

        【讨论】:

        • 我不喜欢这种方法,因为如果有人错误地在没有参数的情况下运行 playbook,地狱就会崩溃
        猜你喜欢
        • 1970-01-01
        • 2015-04-26
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        • 2020-10-02
        • 1970-01-01
        相关资源
        最近更新 更多