Ansible заставляет использовать --limit и --tags при запуске playbook - PullRequest
0 голосов
/ 20 февраля 2020

Я использую 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 из этого примера.

Ответы [ 4 ]

0 голосов
/ 21 февраля 2020

Ниже приведен пример игровой книги, которая должна достичь того, что вам нужно сделать.

  1. Хосты определены в переменной myhosts в командной строке, первая задача прервет воспроизведение, если эта переменная не установлено
  2. Используя два « специальных тега », always и never, мы можем гарантировать, что:
    • вышеупомянутая проверка всегда выполняется и
    • включает ваши testrole никогда выполняется - если только теги dev, test или prod не указаны явно
  3. Перед включением testrole есть полезное сообщение, так что пользователь не будет растерян, если воспроизведение завершится молча из-за неустановленных тегов
- hosts: '{{ myhosts | default("localhost") }}'
  tasks:

  - name: Fail if hosts are not defined
    run_once: true
    fail:
      msg: >
        You must define hosts in the myhosts variable,
        e.g. `-e myhosts=foo.example.com` on the command line
    when: myhosts is undefined
    tags:
      - always

  - name: Helpful message
    run_once: true
    debug:
      msg: >
        This playbook does nothing unless the environment is specified with
        the `--tags` option on the command line (dev, test, or prod).
    tags:
      - always

  - name: Include role only when tags are specified
    include_role:
      name: testrole
    tags:
      - never
      - dev
      - test
      - prod

Это будет выполняться следующим образом:

$ ansible-playbook app.yaml --extra-vars myhosts=foo.example.com --tags dev
0 голосов
/ 20 февраля 2020

Измените tasks на pre_tasks.

Заказ составляет pre_tasks, roles, tasks, post_tasks. https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html

Порядок в Playbook не имеет значения.

0 голосов
/ 20 февраля 2020

Другой вариант - добавить задачу для включения роли. Так что измените

roles:
  - testrole

на

  - include_role: 
      name: testrole
0 голосов
/ 20 февраля 2020

Попробуйте использовать теги вот так -

tags:
  - dev,test,prod
...