【问题标题】:Validation of parameters and use of roles/tags Ansible验证参数和使用角色/标签 Ansible
【发布时间】:2020-04-07 18:05:05
【问题描述】:

我正在编写一个自动化部署的剧本。在命令行中,我传递了一些需要强制验证的参数。我正在使用角色/标签来运行我的剧本。以下是我的命令-

ansible-playbook -i my-inventory my-main.yml --tags=copy,deploy -e my_release_version=1.0.0 -e target_env=prod

在 my-main.yml 中,我首先验证参数,然后执行角色。现在,如果我在命令中传递标签,它不会进行任何验证并直接执行标签,我猜这是 ansible 的工作方式。

有没有办法在执行标签之前预先执行 my-main.yml 中提到的步骤?

my-main.yml 如下所示 -

- hosts: localhost
  connection: local
  gather_facts: no

  vars:
     _allowed_envs:
       - dev
       - preprod
       - prod

  pre_tasks:

     - name: Checking if the Target Environment is ok
       fail:
         msg: >-
           Environment "{{ target_env }}" is not allowed.
           Please choose a target environment from "{{ _allowed_envs | join(', ') }}"
       when: not target_env in _allowed_envs
       run_once: true

  roles:
     - role: copy
       tags:
         - copy
     - role: deploy
       tags:
         - deploy

注意:我的剧本将包含角色/标签,例如复制、部署以及 stoptomcat、starttomcat。所以当用户只提到像 stoptomcat 和 starttomcat 这样的标签时,我只想验证一个输入参数 target_env 因为在这种情况下我不想要 my_release_version。

感谢任何帮助。

【问题讨论】:

  • 您也可以在任务、pre_tasks 和 post_tasks 上添加标签。
  • 有一个special tag called 'always'。您可以用它标记您的验证任务,无论您是否指定标记,它们都会一直播放。
  • @Zeitounator 你是明星伙伴。这就像一个魅力。我现在感觉很愚蠢,因为我无法用谷歌搜索这个简单的东西。 :P
  • @Zeitounator 你能帮我吗?我坚持这一点,并在谷歌上尝试了一切,但无法弄清楚。让我知道您是否可以提供帮助。 stackoverflow.com/questions/61008965/…

标签: ansible ansible-inventory


【解决方案1】:

pre_tasks 或你的游戏没有任何问题; pre_tasks 被跳过,因为您在调用 playbook 时在命令行中传递了 --tags因此标签在调用播放时具有最高优先级,这就是您每次验证失败的原因;如果您想运行 pre_tasks,那么您不必在 cli- 中提及 ----tags 选项,并通过仅传递 -e 选项来处理带有 pre-tasks 的角色验证:类似这样

---
- name: test_play
  hosts: localhost
  connection: local
  gather_facts: false

  vars:
    _allowed_envs:
      - dev
      - preprod
      - prod

  pre_tasks:
    - name: Checking if the Target Environment is ok
      fail:
        msg: >-
         Environment "{{ target_env }}" is not allowed.
         Please choose a target environment from "{{ _allowed_envs | join(', ') }}"
      when: not target_env in _allowed_envs
      run_once: true

  tasks:
    - name: include the dynamic role
      include_role:
        name: "{{ ROLE }}"
      tags: "{{ tag_name }}"

然后运行它ansible-playbook -i my-inventory my-main.yml -e my_release_version=1.0.0 -e target_env=dev -e ROLE=copy -e tag_name=copy

希望这会有所帮助! 干杯

【讨论】:

  • 感谢 Rizwan 对此进行调查。这当然是其中一种方法,但我能够在预任务中使用“always”标签来实现它。再次感谢:)
  • 上述解决方案在不通过 --tags 标志的情况下是有效的 - 如果您通过 --tags 标志,标签肯定是简单的解决方案和最佳解决方案;但如果你想要 --skip 标签,那么上面的解决方案是我在许多场景中使用的方法之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2017-08-02
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多