无主机组配置下如何在指定Ansible客户端执行特定Playbook指令
Ansible指定不同主机执行不同任务解决方案
你不需要额外配置主机组,以下两种常用方案都可以实现需求:
方案1:单Play搭配条件判断(适合任务关联度高的多层结构场景)
利用Ansible内置inventory_hostname变量匹配主机别名,多层结构可以用block打包同主机任务,只写一次条件即可:
--- - name: 跨主机执行差异化任务 hosts: all gather_facts: yes tasks: # client1专属3个任务打包到block,仅需加一次条件 - name: 执行client1专属任务 block: - name: client1任务1 # 替换为你的实际指令 debug: msg: "client1 任务1执行完成" - name: client1任务2 # 替换为你的实际指令 command: echo "client1 任务2执行完成" - name: client1任务3 # 替换为你的实际指令 command: echo "client1 任务3执行完成" when: inventory_hostname == "client1" # client2专属3个任务打包到block,仅需加一次条件 - name: 执行client2专属任务 block: - name: client2任务1 # 替换为你的实际指令 debug: msg: "client2 任务1执行完成" - name: client2任务2 # 替换为你的实际指令 command: echo "client2 任务2执行完成" - name: client2任务3 # 替换为你的实际指令 command: echo "client2 任务3执行完成" when: inventory_hostname == "client2"
inventory_hostname是Ansible内置变量,直接对应你主机清单里配置的client1、client2别名,无需额外配置。
方案2:拆分多Play(更清晰,适合两组任务完全独立的场景)
直接为两台主机创建独立的Play,分别指定目标主机为对应的别名即可:
--- # 第一个Play:仅在client1执行3个任务 - name: client1专属任务组 hosts: client1 gather_facts: yes tasks: - name: client1任务1 debug: msg: "client1 任务1执行" - name: client1任务2 command: echo "client1 任务2完成" - name: client1任务3 command: echo "client1 任务3完成" # 第二个Play:仅在client2执行3个任务 - name: client2专属任务组 hosts: client2 gather_facts: yes tasks: - name: client2任务1 debug: msg: "client2 任务1执行" - name: client2任务2 command: echo "client2 任务2完成" - name: client2任务3 command: echo "client2 任务3完成"
执行命令
两种方案的执行方式完全一致,直接运行playbook即可:ansible-playbook 你的playbook文件名.yml
内容的提问来源于stack exchange,提问作者vamsi miriyala
相关产品推荐
相关产品推荐

