Як запустити лише одне завдання в відповідальній програмі?


172

Чи є спосіб виконати лише одне завдання в ангіблевій програмі?

Наприклад, в 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

Відповіді:


248

Ви повинні використовувати так, tags:як це зафіксовано в http://docs.ansible.com/playbooks_tags.html


Якщо у вас є велика ігрова книга, може стати в нагоді можливість запускати певну частину конфігурації без запуску всієї книги.

І гра, і завдання підтримують атрибут "теги:" з цієї причини.

Приклад:

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"

З іншого боку, якщо ви хочете запустити ігрову книжку без певних завдань, ви можете зробити це:

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

Ви також можете застосувати теги до ролей:

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

І ви також можете помітити основні оператори, що включають:

- include: foo.yml tags=web,foo

Обидва вони мають функцію тегування кожної задачі всередині оператора include.


Подивіться на цю відповідь: stackoverflow.com/a/52888274/2834918 . Тут прийнята відповідь спливає в google та duckduckgo зовсім вгорі, але приховує новіший інтерфейс, представлений з ansible 2.7.
біксель

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 :

ігрова книга 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"

І зверніться до книги, ansible-playbook test.ymlщоб:

TASK [test : say something else] *************
changed: [127.0.0.1]

6

Мені б подобалося вміння використовувати роль у вигляді сукупності завдань, щоб у своїй ігровій книзі я міг вибрати, який підмножину завдань виконувати. На жаль, ігрова книга може завантажувати їх лише в усі, і тоді вам доведеться скористатися --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}

Я просто новачок, і я чую, що ви говорите ... але я би дослідив, чому ви проти того, щоб ви працювали цілою книжкою. Грамотна гра "Ansible", як правило, безсумнівна, і збирає факти і "нічого не робити", якщо будуть виконані державні критерії. Зізнаюся, я поділяю це занепокоєння, оскільки більшість моїх п’єс "роблять щось", а не "перевіряють, чи це стан, і робити щось, якщо потрібно". Перший може бути запущений лише один раз або під наглядом, тоді як останній може бути запущений у будь-який час, і він буде нешкідливим.
Скотт

Я зазвичай використовую це для налагодження завдань. Зазвичай я не хочу запускати інформацію про налагодження, але іноді це роблю. Однак, дивлячись на інші відповіді, можливо, є кращий спосіб зробити це зараз.
ЧеПаццо

Так, є. Для конкретності, один із способів вибіркового запуску відтворень зараз - це "тегнення" п'єс. Можливо, існують ІНШІ способи обмеження вистави; Я все ще вчуся ...
Скотт-

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

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'>
Олександр Сквар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.