Как запустить только одно задание в ANSIBLE PlayBook?

172

Есть ли способ запустить только одну задачу в ANSIBLE PlayBook?

Например, в roles/hadoop_primary/tasks/hadoop_master.yml. У меня есть "start hadoop job tracker services"задача. Могу ли я просто выполнить эту задачу?

Файл hadoop_master.yml:

---
# Playbook for  Hadoop master servers

- name: Install the namenode and jobtracker packages
  apt: name={{item}} force=yes state=latest
  with_items: 
   - hadoop-0.20-mapreduce-jobtracker
   - hadoop-hdfs-namenode
   - hadoop-doc
   - hue-plugins

- name: start hadoop jobtracker services
  service: name=hadoop-0.20-mapreduce-jobtracker state=started
  tags:
   debug
Billz
источник

Ответы:

248

Вы должны использовать tags:как описано в http://docs.ansible.com/playbooks_tags.html


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

По этой причине и игры, и задачи поддерживают атрибут «tags:».

Пример:

tasks:

    - yum: name={{ item }} state=installed
      with_items:
         - httpd
         - memcached
      tags:
         - packages

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration

Если вы хотите просто запустить «конфигурацию» и «пакеты» в очень длинной пьесе, вы можете сделать это:

ansible-playbook example.yml --tags "configuration,packages"

С другой стороны, если вы хотите запустить playbook без определенных задач, вы можете сделать это:

ansible-playbook example.yml --skip-tags "notification"

Вы также можете применять теги к ролям:

roles:
  - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }

И вы также можете пометить основные операторы включения:

- include: foo.yml tags=web,foo

Оба из них имеют функцию пометки каждой задачи внутри оператора включения.

Mxx
источник
Посмотрите на этот ответ: stackoverflow.com/a/52888274/2834918 . Принятый ответ здесь появляется в google и duckduckgo, но скрывает более новый интерфейс, представленный в ansible 2.7.
bixel
84

Есть способ, хотя и не очень элегантный

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Вы получите подсказку: Perform task: start hadoop jobtracker services (y/n/c)
  3. Ответ y
  4. Вы получите следующее приглашение, нажмите Ctrl-C
Виктор Ашик
источник
4
Объединение , что с --checkи -vvvвариант также весьма полезно. На самом деле он не выполнит команду, но даст очень подробный вывод о том, что произошло бы.
lanoxx
10

FWIW с Ansible 2.2 можно использовать include_role :

playbook test.yml:

- name: test
  hosts:
    - 127.0.0.1
  connection: local
  tasks:
    - include_role:
        name: test
        tasks_from: other

затем в roles/test/tasks/other.yml:

- name: say something else
  shell: echo "I'm the other guy"

И вызвать playbook с помощью: ansible-playbook test.ymlчтобы получить:

TASK [test : say something else] *************
changed: [127.0.0.1]
ddragosd
источник
6

Мне бы хотелось иметь возможность использовать роль в качестве набора задач, чтобы в моем сборнике пьес я мог выбирать, какое подмножество задач запускать. К сожалению, playbook может загружать только их все вместе, и тогда вам нужно использовать --tagsопцию в cmdline, чтобы выбрать, какие задачи запускать. Проблема в том, что все задачи будут выполняться, если вы не забудете установить --tagsили --skip-tags.

Однако я поставил несколько задач с when:предложением, которое будет запускаться только при установке переменной var.

например

# role/stuff/tasks/main.yml
- name: do stuff
  when: stuff|default(false)

Теперь эта задача не будет запускаться по умолчанию, но только если я установлю stuff=true

$ ansible-playbook -e '{"stuff":true}'

или в сборнике пьес:

roles:
- {"role":"stuff", "stuff":true}
ChePazzo
источник
Я просто новичок, и я слышу, что вы говорите ... но я бы выяснил, почему вы не хотите запускать весь сборник пьес. Правильная игра Ansible обычно идемпотентна и собирает факты и «ничего не делает», если соблюдены критерии штата. Я признаю, что разделяю эту озабоченность, так как большинство моих пьес «делают что-то», а не «проверяют, является ли это состояние, и делают что-то, если необходимо». Первый может быть запущен только один раз или контролироваться, в то время как последний может быть запущен в любое время, и это будет безопасно.
Скотт Прайв
Я обычно использую это для задач отладки. Обычно я не хочу, чтобы запускалась отладочная информация, но иногда я это делаю. Однако, глядя на другие ответы, возможно, есть лучший способ сделать это сейчас.
ChePazzo
Да, есть. Чтобы быть конкретным, один из способов выборочно запускать пьесы в настоящее время заключается в "маркировке" пьес. Могут также быть ДРУГИЕ способы ограничить игры; Я все еще учусь ...
Скотт Прайв
4

Вы знакомы с обработчиками ? Я думаю, это то, что вы ищете. Переместите перезапуск из hadoop_master.ymlв roles/hadoop_primary/handlers/main.yml:

- name: start hadoop jobtracker services
  service: name=hadoop-0.20-mapreduce-jobtracker state=started

и теперь вызовите использование notifyв hadoop_master.yml:

- name: Install the namenode and jobtracker packages
  apt: name={{item}} force=yes state=latest
  with_items: 
   - hadoop-0.20-mapreduce-jobtracker
   - hadoop-hdfs-namenode
   - hadoop-doc
   - hue-plugins
  notify: start hadoop jobtracker services
tedder42
источник
3

Это легко сделать с помощью тегов

Пример тегов определен ниже:

---
hosts: localhost
tasks:
 - name: Creating s3Bucket
   s3_bucket:
        name: ansiblebucket1234567890
   tags: 
       - createbucket

 - name: Simple PUT operation
   aws_s3:
       bucket: ansiblebucket1234567890
       object: /my/desired/key.txt
       src: /etc/ansible/myfile.txt
       mode: put
   tags:
      - putfile

 - name: Create an empty bucket
   aws_s3:
       bucket: ansiblebucket12345678901234
       mode: create
       permission: private
   tags:
       - emptybucket

для выполнения тегов мы используем команду

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"
Нитеш Джайн
источник
Это не работает - ОШИБКА! Плейбук должен быть списком пьес, вместо него есть <class 'ansible.parsing.yaml.objects.AnsibleMapping'>
Александр Сквар,