Ansible用变量+通配符写匹配容器名前缀的条件判断报错如何解决
问题解决方法
根本原因
报错核心提示'list object' has no attribute 'startswith',说明你用到的containers变量是容器名称组成的列表类型,不是单个字符串,所以不能直接调用仅字符串支持的匹配方法、也不能直接用单字符串匹配规则做判断。
场景1:只要存在符合条件的容器就执行一次API请求
如果需求是只要当前主机的容器列表里有至少一个名称以android-开头的容器,就触发一次API调用,使用如下条件写法即可:
--- - name: move agent android hosts: server1:server2 vars: containers: "{{ containers }}" # 变量定义在其他文件 tasks: - name: move agent Android command: curl "api request to a server" when: containers | select('match', '^android-') | list | length > 0
逻辑说明:先用select过滤器筛选出列表中匹配^android-正则规则(即以android-开头)的项,转成列表后判断长度,大于0就说明存在符合条件的容器。
场景2:每个符合条件的容器单独执行一次API请求
如果需要对每个名称以android-开头的容器单独调用API(比如请求参数要带上对应容器名),可以遍历容器列表做判断:
--- - name: move agent android hosts: server1:server2 vars: containers: "{{ containers }}" # 变量定义在其他文件 tasks: - name: move agent Android for container {{ item }} command: curl "api request to a server?container={{ item }}" loop: "{{ containers }}" when: item is match('^android-')
逻辑说明:用loop遍历容器列表,每次遍历的单个容器名存在item变量中,对单个字符串做匹配判断即可。
此前写法的常见错误
startswith是Python字符串原生方法,仅支持纯字符串匹配,不支持*通配符,如果要通配匹配请用Ansible自带的match过滤器when条件中不需要用{{ }}包裹变量,Ansible会自动解析变量内容- 不能直接对列表对象调用仅字符串支持的属性/方法,需要先遍历或者做列表聚合判断
- 多主机分隔请用冒号
:,不要用分号;,避免主机解析异常
内容的提问来源于stack exchange,提问作者Saptronic
相关产品推荐
相关产品推荐

