如何在ansible playbook中只运行一个任务?

Bil*_*llz 155 ansible

有没有办法只在ansible playbook中运行一个任务?

例如,在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
Run Code Online (Sandbox Code Playgroud)

Mxx*_*Mxx 223

您应该使用tags:在记录http://docs.ansible.com/playbooks_tags.html


如果你有一个大型的剧本,那么在不运行整个剧本的情况下运行配置的特定部分可能会很有用.

出于这个原因,播放和任务都支持"tags:"属性.

例:

tasks:

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

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration
Run Code Online (Sandbox Code Playgroud)

如果你想只运行一个很长的剧本的"配置"和"包",你可以这样做:

ansible-playbook example.yml --tags "configuration,packages"
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想在没有特定任务的情况下运行一本剧本,你可以这样做:

ansible-playbook example.yml --skip-tags "notification"
Run Code Online (Sandbox Code Playgroud)

您还可以将标记应用于角色:

roles:
  - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }
Run Code Online (Sandbox Code Playgroud)

您还可以标记基本的包含语句:

- include: foo.yml tags=web,foo
Run Code Online (Sandbox Code Playgroud)

这两者都具有标记include语句中每个任务的功能.

  • 我建议不要使用“--tags”。问题是,如果你打错了标签,“ansible-playbook”不会失败,而且从 IRC 上得知,没有办法让它失败。这意味着在重构剧本时很容易引入难以发现的错误。我个人决定将剧本拆分为较小的剧本,这样“ansible-playbook”将在给定的剧本中运行所有内容。不是我喜欢的东西,但是哦好吧…… (3认同)
  • “根据我在 irc 上了解到的情况”很难说是一个高质量的参考来源。也许您想链接到一些已发表的文章或讨论这些问题的帖子? (2认同)

小智 77

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

  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

  • 结合使用`--check`和`-vvv`选项也非常有用。它实际上不会执行命令,但是会给您非常详细的输出,说明会发生什么。 (3认同)

gav*_*koa 10

在这里查看我的答案:Run only one task and handler from ansible playbook

可以运行单独的角色(从roles/目录):

ansible -i stage.yml -m include_role -a name=create-os-user localhost
Run Code Online (Sandbox Code Playgroud)

和单独的任务文件:

ansible -i stage.yml -m include_tasks -a file=tasks/create-os-user.yml localhost
Run Code Online (Sandbox Code Playgroud)

如果您将任务从角色外部化到根tasks/目录(通过 实现重用import_tasks: ../../../tasks/create-os-user.yml),您可以独立于 playbook/role 运行它。


小智 6

我希望能够将角色用作任务集合,以便在我的剧本中,我可以选择要运行的任务子集.不幸的是,剧本只能加载它们然后你必须使用--tagscmdline上的选项来选择要运行的任务.这个问题是除非你记得设置或,否则所有任务都会运行.--tags--skip-tags

但是,我已经设置了一些任务,when:只有在设置了var时才会触发.

例如

# role/stuff/tasks/main.yml
- name: do stuff
  when: stuff|default(false)
Run Code Online (Sandbox Code Playgroud)

现在,默认情况下不会触发此任务,但仅当我设置了该任务时 stuff=true

$ ansible-playbook -e '{"stuff":true}'
Run Code Online (Sandbox Code Playgroud)

或在剧本中:

roles:
- {"role":"stuff", "stuff":true}
Run Code Online (Sandbox Code Playgroud)


小智 6

使用Ansible 2.2的FWIW可以使用include_role:

剧本test.yml:

- name: test
  hosts:
    - 127.0.0.1
  connection: local
  tasks:
    - include_role:
        name: test
        tasks_from: other
Run Code Online (Sandbox Code Playgroud)

然后在roles/test/tasks/other.yml:

- name: say something else
  shell: echo "I'm the other guy"
Run Code Online (Sandbox Code Playgroud)

并调用playbook:ansible-playbook test.yml获得:

TASK [test : say something else] *************
changed: [127.0.0.1]
Run Code Online (Sandbox Code Playgroud)