Как запустить только одну задачу в незанятой пьесе?

Есть ли способ запустить только одну задачу в недоступном для просмотра плейбуке?

Например, в 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

Ответ 1

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


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

Обе игры и задачи поддерживают атрибут "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:

- include: foo.yml tags=web,foo

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

Ответ 2

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

  • ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  • Вы получите приглашение: Perform task: start hadoop jobtracker services (y/n/c)
  • Ответ y
  • Появится следующее приглашение, нажмите Ctrl-C

Ответ 3

Мне понравилась бы возможность использовать роль как набор задач, так что в моей книге я могу выбрать, какой подмножество задач нужно запустить. К сожалению, 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}

Ответ 4

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]

Ответ 5

Вы знакомы с handlers? Я думаю, это то, что вы ищете. Переместите перезапуск с 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

Ответ 6

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

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

---
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"