条件语句中具有多个值的Ansible变量

时间:2019-09-02 04:12:46

标签: variables ansible jinja2

我正在使用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在服务器站起来后迁移服务器?

2 个答案:

答案 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的值。

我为这两种情况都提供了正则表达式。

相关问题