如何在一个完整的剧本中只运行一个任务?
有没有办法只在一个完整的剧本中运行一个任务?
例如,在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
您应该使用tags:
如http://docs.ansible.com/playbooks_tags.html中所述;
如果你有一个大的手册,可以运行一个特定的configuration部分,而不需要运行整个手册。
出于这个原因,剧本和任务都支持“tags:”属性。
例:
tasks: - yum: name={{ item }} state=installed with_items: - httpd - memcached tags: - packages - template: src=templates/src.j2 dest=/etc/foo.conf tags: - configuration
如果你想运行一个很长的剧本的“configuration”和“包”部分,你可以这样做:
ansible-playbook example.yml --tags "configuration,packages"
另一方面,如果你想运行一个没有特定任务的剧本,你可以这样做:
ansible-playbook example.yml --skip-tags "notification"
您也可以将标签应用于angular色:
roles: - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }
你也可以标记基本的include语句:
- include: foo.yml tags=web,foo
这两个函数都具有标记include语句中的每个任务的function。
有一种方法,虽然不是很优雅:
-
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
你熟悉处理程序吗? 我想这是你在找什么。 将hadoop_master.yml
重新启动到roles/hadoop_primary/handlers/main.yml
:
- name: start hadoop jobtracker services service: name=hadoop-0.20-mapreduce-jobtracker state=started
现在在hadoop_master.yml
调用use notify
:
- 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
我喜欢将angular色作为一个任务集合的能力,在我的手册中,我可以select运行哪个任务子集。 不幸的是,剧本只能载入它们,然后你必须使用cmdline上的--tags
选项来select要运行的任务。 这个问题是所有的任务都会运行,除非你记得设置--tags
或--skip-tags
。
但是,我已经设置了一些任务,只有在设置了var时才会触发when:
子句。
例如
# role/stuff/tasks/main.yml - name: do stuff when: stuff|default(false)
现在,这个任务默认不会触发,但是只有当我设置了stuff=true
才会触发
$ ansible-playbook -e '{"stuff":true}'
或在剧本中:
roles: - {"role":"stuff", "stuff":true}