运行 通过将组名称作为动态输入,在特定服务器组上进行 ansible 播放

Running the ansible play on particular group of servers by taking the name of groups as input dynamically

假设我有这样的库存文件
inventory.txt

abc
cde 
def 

[check1:children]
abc

[check2:children]
cde

[check3: children]
def

现在我将从用户那里获取输入,例如:check1,check3 在一个变量中用逗号分隔,然后我想 运行 我的下一个游戏 check1,check3.
我怎样才能做到这一点?

用逗号分隔的组或主机列表 a perfectly valid pattern 用于剧本的主机。

所以你可以直接在剧本的 hosts 属性中传递它:

- hosts: "{{ user_provider_hosts }}"
  gather_facts: no
  
  tasks:
    - debug:

然后,您只需在 playbook 命令的 --extra-vars(或简称 -e)标志中添加以下值:

ansible-playbook play.yml --extra-vars "user_provider_hosts=check1,check3"

这将产生:

TASK [debug] ******************************************************************
ok: [abc] => 
  msg: Hello world!
ok: [def] => 
  msg: Hello world!

另一种选择是针对所有主机:

- hosts: all
  gather_facts: no
  
  tasks:
    - debug:

并使用有目的的 --limit flag:

ansible-playbook play.yml --limit check1,check3

第三个选项是使用播放定位 localhost 来提示用户选择要定位的组,然后使用 localhost 设置的事实在另一个播放中定位这些组:

- hosts: localhost
  gather_facts: no

  vars_prompt:
    - name: _hosts
      prompt: On which hosts do you want to act? 
      private: no

  tasks:
    - set_fact:
        user_provider_hosts: "{{ _hosts }}"

- hosts: "{{ hostvars.localhost.user_provider_hosts }}"
  gather_facts: no
  
  tasks:
    - debug:

会以交互方式请求主机并在用户提供主机上执行操作:

On which hosts do you want to act?: check1,check3

PLAY [localhost] **************************************************************

TASK [set_fact] ***************************************************************
ok: [localhost]

PLAY [check1,check3] **********************************************************

TASK [debug] ******************************************************************
ok: [abc] => 
  msg: Hello world!
ok: [def] => 
  msg: Hello world!