【问题标题】:Creating ansible variables based on a string NOT containing a pattern?基于不包含模式的字符串创建ansible变量?
【发布时间】:2021-05-25 13:59:04
【问题描述】:

我正在尝试在 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 的图像。我们可以扭转这种情况吗?

【问题讨论】:

  • 使pre_tasksassert 变量不包含-rev 可能是一个解决方案。
  • 我怎么能断言它不包含它呢?这是我的问题,我不知道如何将“不”传递给 ansible。

标签: ansible task


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多