могут ли роли и задачи существовать в одной книге?

---
# file: main.yml

- hosts: fotk
  remote_user: fakesudo
  tasks:
  - name: create a developer user
    user: name={{ user }}
          password={{ password }}
          shell=/bin/bash
          generate_ssh_key=yes
          state=present
  roles:
  - { role: create_developer_environment, sudo_user: "{{ user }}" }
  - { role: vim, sudo_user: "{{ user }}" }

По какой-то причине задача создания пользователя не запущена. Я безуспешно искал каждую ключевую фразу, которую только мог придумать, в Google, чтобы найти ответ.

Роли работают, что странно.

Возможно ли, чтобы сценарий содержал и задачи, и роли?


person guyja    schedule 22.06.2015    source источник


Ответы (4)


На самом деле это должно быть возможно, и я помню, что делал это несколько раз во время тестирования. Возможно, что-то связано с вашей версией - или порядок имеет значение, чтобы задачи выполнялись после ролей.

Я бы опубликовал это как комментарий, а не как ответ, но я не смог бы привести в комментарии следующий пример:

Какой бы ни была причина, по которой ваша задача не выполняется, вы всегда можете разделить свою пьесу на несколько пьес, например:

---
# file: main.yml

- hosts: fotk
  remote_user: fakesudo
  tasks:
  - name: create a developer user
    user: name={{ user }}
          password={{ password }}
          shell=/bin/bash
          generate_ssh_key=yes
          state=present

- hosts: fotk
  remote_user: fakesudo
  roles:
  - { role: create_developer_environment, sudo_user: "{{ user }}" }
  - { role: vim, sudo_user: "{{ user }}" }
person udondan    schedule 22.06.2015
comment
Прав ли я, полагая, что если бы ваш сценарий выглядел так, то, возможно, обе пьесы могли бы выполняться параллельно? - person Samuel Harmer; 02.08.2017
comment
Нет, второй розыгрыш начнется только после завершения первого. - person udondan; 02.08.2017

Вы также можете выполнить pre_tasks: и post_tasks:, если вам нужно сделать что-то до или после. Из Документов https://docs.ansible.com/playbooks_roles.html

- hosts: localhost

  pre_tasks:
    - shell: echo 'hello in pre'

  roles:
    - { role: some_role }

  tasks:
    - shell: echo 'in tasks'

  post_tasks:
    - shell: echo 'goodbye in post'

>

Дает результат: PLAY [localhost]


СОБИРАЕМ ФАКТЫ *********************************************** *************** ОК: [localhost]

ЗАДАЧА: [shell echo 'hello in pre'] ************************************** ****** изменено: [localhost]

ЗАДАЧА: [some_role | shell echo 'привет из роли'] ************************* изменено: [localhost]

ЗАДАЧА: [эхо оболочки 'в задачах'] *************************************** ********* изменено: [localhost]

ЗАДАЧА: [shell echo 'до свидания в сообщении'] ************************************** *** изменено: [localhost]

ВОСПРОИЗВЕДЕНИЕ ******************************************************************************************** ******************** localhost: ok = 5 изменено = 4 недоступно = 0
не удалось = 0

Это с доступным 1.9.1

person Russ Huguley    schedule 22.06.2015
comment
Я видел это в документации, но по какой-то причине моя задача не запускается. - person guyja; 23.06.2015
comment
Попробуйте опубликованный мною простой сценарий. Добавьте роль, которая просто выполняет оболочку: выведите что-нибудь и посмотрите, работает ли это. Может быть, у вас есть что-то еще, что мешает ему работать так, как вы ожидаете. - person Russ Huguley; 23.06.2015
comment
К настоящему времени URL-адрес изменился, хотя я не могу найти pre_tasks пример в документации. docs.ansible.com/ansible/latest/user_guide/ может быть достойная ссылка на данный момент. - person Richlv; 28.08.2020

https://docs.ansible.com/playbooks_roles.html#roles

Если в игре все еще есть раздел «задачи», эти задачи выполняются после применения ролей.

Если вы хотите запускать задачи до или после выполнения ролей, вам необходимо указать их в pre_tasks и post_tasks. Таким образом, невозможно выполнять «свободные» задачи между двумя ролями. Возможно, вы захотите создать специальную роль для этих задач.

person Régis B.    schedule 29.06.2015
comment
См. Ответ @ michael-aicher, чтобы узнать об этом подробнее. В Ansible 2.3 появилась опция include_role. - person Bram; 09.09.2020

Краткое продолжение уже упомянутых вариантов, цитируя последние docs.ansible из последних документов Ansible. ru / latest / playbooks_reuse_roles:

Начиная с Ansible 2.4, теперь вы можете использовать роли, встроенные в любые другие задачи, используя import_role или include_role:

---    
- hosts: webservers
  tasks:
    - debug:
      msg: "before we run our role"
    - import_role:
      name: example
    - include_role:
      name: example
    - debug:
      msg: "after we ran our role"`

Фрагмент кода также взят из документации Ansible.

Помните о разнице между статическим (импорт *) и динамическим (включая *) использованием.

person Michael Aicher    schedule 19.09.2018