如何在ansible剧本中仅执行一项任务?


172

有没有办法只在ansible剧本中运行一项任务?

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

Answers:


248

您应该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

如果您只想运行很长的剧本的“配置”和“包”部分,则可以执行以下操作:

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

另一方面,如果您要在没有某些任务的情况下运行剧本,则可以执行以下操作:

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

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

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

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

- include: foo.yml tags=web,foo

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


看看这个答案:stackoverflow.com/a/52888274/2834918。此处接受的答案在顶部出现在google和duckduckgo中,但隐藏了ansible 2.7引入的较新界面。
bixel

84

有一种方法,尽管不是很优雅:

  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

4
将其与--checkand -vvv选项结合使用也非常有用。它实际上不会执行命令,但会给您非常详细的输出,说明会发生什么。
lanoxx

10

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

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

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

并使用以下命令调用剧本ansible-playbook test.yml

TASK [test : say something else] *************
changed: [127.0.0.1]

6

我希望能够将角色用作任务的集合,这样在我的剧本中,我可以选择要运行的任务子集。不幸的是,剧本只能全部加载,然后您必须使用--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}

我只是一个新手,我听到您在说什么...但是我会探讨为什么您不愿意整个书本都运行。正确的Ansible游戏通常是幂等的,如果符合州标准,它将收集事实并“不采取任何行动”。我承认我也有这种担忧,因为我的大部分戏剧都是“做某事”,而不是“检查这是否是状态,并根据需要做某事”。前者只能运行一次,也可以在有监督的情况下运行,而后者可以随时运行,这将是无害的。
Scott Prive

我通常将此用于调试任务。通常,我不希望运行调试信息,但有时我会运行。不过,从其他答复来看,现在可能有更好的方法。
ChePazzo

就在这里。具体而言,现在有选择地进行播放的一种方法是“标记”播放。可能还有其他方法可以限制播放次数;我仍在学习...
Scott Prive

4

您熟悉处理程序吗?我认为这就是您要寻找的。将重新启动从hadoop_master.yml移至roles/hadoop_primary/handlers/main.yml

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

现在呼叫使用notifyhadoop_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

3

使用标签可以轻松完成此操作

标签的示例定义如下:

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

这不起作用-错误!一本剧本必须是剧本清单,而应改为<class'ansible.parsing.yaml.objects.AnsibleMapping'>
亚历山大·斯沃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.