Я использую ansible 2.9.4
. Моя цель состоит в том, чтобы запретить запуск какой-либо книги воспроизведения на всех узлах случайно или без тегов. Это мой app.yaml:
- hosts: all
remote_user: root
vars:
server_domain: mydomain.com
project_name: project
tasks:
- name: checking limit arg
fail:
msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
when: ansible_limit is not defined
run_once: true
- name: "suppress message if tag given"
set_fact: suppress_message=yes
tags: dev,test,prod
- name: "message"
fail:
msg: "You didn't choose environment 'dev,test,prod'"
when: suppress_message is not defined
roles:
- testrole
Проблема в том, что когда я не использую опцию --limit, роль testrole
запускается успешно, а затем появляется сообщение об ошибке - слишком поздно, если я уже запускаю это на всех узлах.
Даже когда я указываю теги --tags "mytag"
, он не будет проверять, был ли указан лимит.
Аналогичным образом я хотел бы принудительно использовать теги, поэтому каждый раз, когда вы запускаете playbook, вы должны указывать тег среды (dev
, test
, prod
) - например, клавиши sh для различных сред конфигурационные файлы и т. д. c ...
Что я ожидал бы от этого, если бы я не указал тег dev
, test
или prod
, то suppress_message
не указывается, поэтому следующая задача с именем message
не будет выполнена с сообщением «Вы не выбрали environement».
Дело в том, что если я не указал какой-либо тег:
- supress message
состояние OK
- message
пропущено
Если я укажу действительный тег --tags "dev"
:
- supress message
в состоянии OK
- message
даже не упоминается (я ожидаю пропуск)
Если я укажу «неверный тег» --tags "dev123"
:
- supress message
не упоминается
- message
не упоминается
Решение для limit
может быть заменено - hosts: all
на - hosts: randomtext
, поэтому, если не указан предел, совпадения не будет, но как насчет тегов / сред? Я тихо растерялся из-за того, как работает ansible. Логика c об этих решениях, которые будут запускаться - это тихий хаоти c из этого примера.