Ansible Playbook --limit与前瞻正则表达式的异常行为问询
问题解释
你遇到的差异是因为Ansible与ggrep的正则匹配逻辑不同:
ggrep默认是全字符串匹配,^(?!ecs).*会锚定字符串开头,直接排除所有以ecs开头的内容。- 但Ansible的
~'regex'正则匹配默认是部分匹配——只要主机名的任意子串符合正则规则,就会被判定为匹配。比如abc-ecs这个主机名,从开头的abc-部分开始完全符合^(?!ecs).*(该子串不以ecs开头),因此所有主机都被匹配。
如果要让Ansible的正则锚定整个主机名,必须同时用^和$包裹正则,比如排除ecs开头主机的正确正则是~'^((?!ecs).)*$',这样会强制匹配整个主机名而非子串。
匹配以ecs开头主机的正确方法
要仅对以ecs开头的主机执行任务,使用锚定开头的正则即可,执行命令:
ansible-playbook -i hosts -l ~'^ecs.*' test-regex.yaml -D -C --list-hosts --list-tasks
^ecs.*会强制匹配整个主机名以ecs开头的主机,只会选中ecs-1和ecs-y。
合并两个文件为一个(测试用)
可以直接把inventory内容整合到playbook中,无需单独的hosts文件,两种实现方式如下:
方式1:通过变量定义inventory分组
- name: test hosts: test vars: ansible_inventory: | [test] abc-1 abc-ecs abc-x ecs-1 ecs-y tasks: - name: set var set_fact: myvar: "this is a test"
执行时无需指定-i参数,直接运行:
ansible-playbook test-merged.yaml -D -C --list-hosts --list-tasks
方式2:直接指定主机列表并创建分组
- name: test hosts: - abc-1 - abc-ecs - abc-x - ecs-1 - ecs-y tasks: - name: create test group group_by: key: test - name: set var set_fact: myvar: "this is a test"
这种方式适合快速测试,无需额外维护inventory文件。
内容的提问来源于stack exchange,提问作者puravidaso
相关产品推荐
相关产品推荐

