验证参数和使用角色/标签的可能性

问题描述 投票:0回答:1

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

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。

感谢您的任何帮助。

ansible ansible-inventory
1个回答
0
投票

前置任务或您的游戏没有错; pre_tasks被跳过,因为您在调用剧本时在命令行中传递了--tags。因此,标签在调用播放时具有最高优先级,这是您每次验证失败的原因;如果要运行pre_tasks,则不必在cli-中提及---- tags选项,而仅通过传递-e选项来处理带有预任务的角色验证:类似这样的事情

---
- 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-main.yml -e my_release_version = 1.0.0 -e target_env = dev -e ROLE = copy -e tag_name = copy

enter image description here

希望这会有所帮助!干杯

© www.soinside.com 2019 - 2024. All rights reserved.