首页 > 解决方案 > 基于不包含模式的字符串创建ansible变量?

问题描述

我正在尝试在 ansible 中创建一个变量,以验证另一个变量是否包含特定模式。

故事是,我需要在我的剧本中创建一个任务,以防止带有版本标签dev的图像在生产中部署。我是 ansible 的新手,不知道该怎么做。

以前,我以另一种方式工作,创建一个仅在模式可用时才部署的变量。

vars:
    archived_image_name: "{{ new_image.registry }}_{{ new_image.image | regex_replace('/', '_') }}_{{ new_image.version }}_image.tar"
    archived_image_prod_name: "{{ archived_image_name | regex_search('.*-rev\\d.*')}}"

因此,这只适用-rev于以他们的名义部署图像。我们能扭转这种局面吗?

标签: ansibletask

解决方案


您可以使用search过滤器来识别字符串是否包含子字符串。然后您可以使用not运算符来否定结果。

检查此示例以了解如何使用它们:

- hosts: localhost
  gather_facts: no
  vars:
    tests:
      - dev
      - prod
      - something:dev
      - something:prod
      - something/dev:latest
      - something/prod:latest
  tasks:
    - debug:
        msg: String "{{ item }}" doesn't have the substring "dev"
      when: item is not search("dev")
      loop: "{{ tests }}"

    - debug:
        msg: String "{{ item }}" does have the substring "dev"
      when: item is search("dev")
      loop: "{{ tests }}"

你应该看到这个输出:

PLAY [localhost] ***************************************************************
Saturday 29 May 2021  16:11:03 -0300 (0:00:00.020)       0:00:00.020 ********** 

TASK [debug] *******************************************************************
ok: [localhost] => (item=prod) => 
  msg: String "prod" doesn't have the substring "dev"
ok: [localhost] => (item=something:prod) => 
  msg: String "something:prod" doesn't have the substring "dev"
ok: [localhost] => (item=something/prod:latest) => 
  msg: String "something/prod:latest" doesn't have the substring "dev"
Saturday 29 May 2021  16:11:03 -0300 (0:00:00.079)       0:00:00.100 ********** 

TASK [debug] *******************************************************************
ok: [localhost] => (item=dev) => 
  msg: String "dev" does have the substring "dev"
ok: [localhost] => (item=something:dev) => 
  msg: String "something:dev" does have the substring "dev"
ok: [localhost] => (item=something/dev:latest) => 
  msg: String "something/dev:latest" does have the substring "dev"

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

请查看以下链接以了解有关search过滤器的更多信息:

https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html


推荐阅读