Ansible 2.4.2.0:如何通过Playbook API设置--limit参数
解决Ansible 2.4.2.0 Playbook API中--limit选项不生效的问题
在Ansible 2.4.x版本里,仅仅在Options命名元组中设置limit参数是不够的——这个参数不会自动被InventoryManager识别并应用主机过滤。你需要手动调用Inventory的subset()方法来实现和命令行--limit相同的效果。
问题根源
命令行中的--limit参数会触发Ansible内部对inventory进行子集过滤,但在API层面,PlaybookExecutor不会自动帮你做这件事,必须显式调用inventory的过滤方法。
修改后的代码
下面是调整后的Python脚本,关键部分已标注:
from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible.inventory.manager import InventoryManager from ansible.executor.playbook_executor import PlaybookExecutor loader = DataLoader() # 初始化inventory inventory = InventoryManager(loader=loader, sources=['/etc/ansible/hosts']) variable_manager = VariableManager(loader=loader, inventory=inventory) # 定义Options,保留你的limit设置 Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path', 'forks', 'remote_user', 'become', 'become_method', 'become_user', 'verbosity', 'check', 'diff', 'ask_sudo_pass', 'limit']) options = Options(listtags=None, listtasks=None, listhosts=None, syntax=None, connection='smart', module_path=None, forks=100, remote_user=None, become=None, become_method='sudo', become_user='root', verbosity=None, check=False, diff=False, ask_sudo_pass=None, limit='192.168.0.1') # 关键步骤:应用limit过滤inventory if options.limit: inventory.subset(options.limit) passwords = {} pbex = PlaybookExecutor(playbooks=['/home/test.yml'], inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords) pbex.run()
说明
inventory.subset(options.limit)方法会根据你指定的limit值(这里是192.168.0.1)过滤inventory中的主机,和命令行--limit的逻辑完全一致。- 这个方法支持所有命令行中
--limit接受的格式:单个主机、主机组、通配符(比如test:!192.168.0.2)等。
这样修改后,你的Playbook就只会在指定的主机上执行了。
内容的提问来源于stack exchange,提问作者duskcrow
相关产品推荐
相关产品推荐

