如何在一个完整的剧本中只运行一个任务?

有没有办法只在一个完整的剧本中运行一个任务?

例如,在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。

有一种方法,虽然不是很优雅:

  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

你熟悉处理程序吗? 我想这是你在找什么。 将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}