Jak uruchomić tylko jedno zadanie w Playbooku Ansible?

172

Czy istnieje sposób na uruchomienie tylko jednego zadania w poradniku ansibli?

Na przykład w roles/hadoop_primary/tasks/hadoop_master.yml. Mam "start hadoop job tracker services"zadanie. Czy mogę po prostu uruchomić to jedno zadanie?

Plik 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
źródło

Odpowiedzi:

248

Należy używać tags:zgodnie z dokumentacją podaną w http://docs.ansible.com/playbooks_tags.html


Jeśli masz duży playbook, przydatna może być możliwość uruchomienia określonej części konfiguracji bez uruchamiania całego playbooka.

Z tego powodu zarówno gry, jak i zadania obsługują atrybut „tags:”.

Przykład:

tasks:

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

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

Jeśli chcesz po prostu uruchomić części „konfiguracji” i „pakietów” bardzo długiego podręcznika, możesz to zrobić:

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

Z drugiej strony, jeśli chcesz uruchomić Playbook bez określonych zadań, możesz to zrobić:

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

Możesz także zastosować tagi do ról:

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

Możesz także oznaczyć podstawowe instrukcje include:

- include: foo.yml tags=web,foo

Oba mają funkcję oznaczania każdego zadania w instrukcji include.

Mxx
źródło
Spójrz na tę odpowiedź: stackoverflow.com/a/52888274/2834918 . Przyjęta odpowiedź pojawia się tutaj w Google i duckduckgo na samej górze, ale ukrywa nowszy interfejs wprowadzony w ansible 2.7.
bixel
84

Jest sposób, choć niezbyt elegancki:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Otrzymasz monit: Perform task: start hadoop jobtracker services (y/n/c)
  3. Odpowiedź y
  4. Pojawi się następny monit, naciśnij Ctrl-C
Victor Ashik
źródło
4
Połączenie tego z opcją --checki -vvvjest również całkiem przydatne. W rzeczywistości nie wykona polecenia, ale wyświetli bardzo szczegółowe informacje, co by się stało.
lanoxx
10

FWIW z Ansible 2.2 można użyć funkcji include_role :

podręcznik test.yml:

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

potem w roles/test/tasks/other.yml:

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

I wywołaj podręcznik z:, ansible-playbook test.ymlaby uzyskać:

TASK [test : say something else] *************
changed: [127.0.0.1]
ddragosd
źródło
6

Bardzo chciałbym móc używać roli jako zbioru zadań, tak że w moim poradniku mogę wybrać podzbiór zadań do wykonania. Niestety, Playbook może tylko załadować je wszystkie, a następnie musisz użyć --tagsopcji w linii cmd, aby wybrać zadania do uruchomienia. Problem polega na tym, że wszystkie zadania będą działać, chyba że pamiętasz o ustawieniu --tagslub --skip-tags.

Skonfigurowałem jednak niektóre zadania z when:klauzulą, która będzie uruchamiana tylko wtedy, gdy ustawiona jest zmienna.

na przykład

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

Teraz to zadanie nie będzie domyślnie uruchamiane, ale tylko wtedy, gdy ustawię stuff=true

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

lub w poradniku:

roles:
- {"role":"stuff", "stuff":true}
ChePazzo
źródło
Jestem tylko nowicjuszem i słyszę, co mówisz ... ale chciałbym zbadać, dlaczego nie masz nic przeciwko uruchamianiu całego poradnika. Właściwa gra Ansible jest zwykle idempotentna i zbiera fakty i „nie robi nic”, jeśli spełnione są kryteria stanu. Przyznaję, że podzielam tę obawę, ponieważ większość moich spektakli „coś robi”, a nie „sprawdza, czy to jest stan i zrób coś, jeśli trzeba”. Pierwszą można uruchomić tylko raz lub nadzorować, a drugą można uruchomić w dowolnym momencie i będzie nieszkodliwa.
Scott Prive
Zwykle używam tego do zadań debugowania. Zwykle nie chcę, aby informacje debugowania były uruchamiane, ale czasami tak. Patrząc jednak na inne odpowiedzi, może być teraz lepszy sposób na zrobienie tego.
ChePazzo
Tak jest. Mówiąc konkretnie, jednym ze sposobów selektywnego uruchamiania odtworzeń jest teraz „oznaczanie” odtworzeń. Mogą istnieć również INNE sposoby ograniczenia gier; Wciąż się uczę ...
Scott Prive
4

czy znasz handlerów ? Myślę, że właśnie tego szukasz. Przenieś ponowne uruchomienie z hadoop_master.ymldo roles/hadoop_primary/handlers/main.yml:

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

a teraz zadzwoń do użycia notifyw 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
przetrząsacz 42
źródło
3

Można to łatwo zrobić za pomocą tagów

Przykład tagów zdefiniowano poniżej:

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

do wykonania tagów używamy polecenia

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"
Nitesh Jain
źródło
To nie działa - BŁĄD! Playbook musi być listą odtworzeń, zamiast tego ma <class 'ansible.parsing.yaml.objects.AnsibleMapping'>
Alexander Skwar