Как запустить только одну задачу в незанятой пьесе?
Есть ли способ запустить только одну задачу в недоступном для просмотра плейбуке?
Например, в 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"