我正在使用Ansible在我的环境中置备VM,效果很好,但是我们目前正在重新设计剧本,以根据将它们放置在vmware_guest
模块上时分配的名称,将VM放置在特定的群集/数据存储中。
我们的服务器名称如下所示。 (P =生产,S =暂存,前继字符A =主字符,B / C =次要字符等)。我们具有用于主数据库,辅助数据库,分段等的相应群集和数据存储。
P-WEB01-A
P-WEB01-B
S-WEB01-A
S-WEB01-B
在剧本的开头,我们指定了一个标题为vm_name
我正在尝试使用when:
语句来做类似的事情
when: "'P-' in {{vm_name}}" and {{vm_name}}[-1] == "A" or {{vm_name}}[-1] == "1" or {{vm_name}}[-1] == "2" or {{vm_name}}[-1] == "3" or {{vm_name}}[-1] == "4"
但是为了外观起见,我想将其压缩成这样
when: "'P-' in {{vm_name}}" and "{{vm_name}}[-1] == 'A', '1', '2', '3', '4'"
或
when: "'P-' in {{vm_name}}" and {{vm_name}}[-1] == "B" or {{vm_name}}[-1] == "C"
如下所示
when: "'P-' in {{vm_name}}" and "{{vm_name}}[-1] == 'B', 'C'"
我只是不知道下面的方法是否可行,并且在找到类似情况时遇到了一些麻烦。
也许有更好的方法来处理它,就像变量文件一样,或者使用vmware_vmotion
在服务器站起来后迁移服务器?
答案 0 :(得分:1)
Q:为了外观上的原因,我想将其压缩成这样
when: "'P-' in {{vm_name}}" and "{{vm_name}}[-1] == 'A', '1', '2', '3', '4'"
A:下面的戏
- hosts: localhost
vars:
my_hosts: ['P-WEB01-A', 'P-WEB01-B', 'S-WEB01-A', 'S-WEB01-B']
my_sufix: ['A', '1', '2', '3', '4']
tasks:
- debug:
msg: "[OK] {{ item }}"
loop: "{{ my_hosts }}"
when: item[0:2] == "P-" and item[-1] in my_sufix
给予
ok: [localhost] => (item=P-WEB01-A) =>
msg: '[OK] P-WEB01-A'
skipping: [localhost] => (item=P-WEB01-B)
skipping: [localhost] => (item=S-WEB01-A)
skipping: [localhost] => (item=S-WEB01-B)
这是您要找的吗?
答案 1 :(得分:0)
根据我的理解,您可以将支票浓缩为
---
- hosts: all
gather_facts: no
vars:
- vm_name: "P-WEB01-1"
- vm_name1: "P-WEB01-B"
tasks:
- name: Check regex
debug:
msg: "Check 1 passed : {{ vm_name }}"
when: vm_name | regex_search("^P-.*-[A|1|2|3|4]")
- name: Check regex
debug:
msg: "Check 2 passed : {{ vm_name1 }}"
when: vm_name1 | regex_search("^P-.*-[B|C]")
我已经使用regex_search过滤器来匹配vm_name的值。
我为这两种情况都提供了正则表达式。