我正在编写一本剧本,以使我的部署自动化。在命令行中,我传递了一些需要验证为强制性的参数。我正在使用角色/标签来运行我的剧本。下面是我的命令-
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被跳过,因为您在调用剧本时在命令行中传递了--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
希望这会有所帮助!干杯