如何按标签顺序运行Ansible playbook任务

时间:2015-12-29 09:37:18

标签: ansible ansible-playbook

我想按照--tags

中给出的标签顺序在ansible playbook中运行任务

我的ansible剧本

---
- hosts: all
  remote_user: root
  vars:
    file_path: '{{filename}}'
  tasks:
    - name: Delete user
      user:
        name: "{{username}}"
        state: absent
        remove: yes
      tags:
        - delete_user

    - name: Create user
      user: 
        name: "{{username}}"
        shell: /bin/bash
        groups: "{{groupname}}"
        password: "{{ password |password_hash('sha512') }}"
      tags:
        - create_user

    - name: Add ssh key
      authorized_key:
        user: "{{username}}"
        key: "{{lookup('file', 'file_path')}}"
        exclusive: yes
      tags:
        - add_ssh_key

运行Ansible

ansible-playbook createuser.yml --extra-vars "username=hello password=helloworld groupname=something filename=/path/to/filename" --tags=create_user,add_ssh_key,delete_user

预期产出

TASK: [Create user] *********************************************************** 
changed: [ip address]

TASK: [Add ssh key] *********************************************************** 
changed: [ip address]

TASK: [Delete user] *********************************************************** 
ok: [ip address]

输出来了

TASK: [Delete user] *********************************************************** 
ok: [ip address]

TASK: [Create user] *********************************************************** 
changed: [ip address]

TASK: [Add ssh key] *********************************************************** 
changed: [ip address]

提供的标签顺序

create_user,add_ssh_key,DELETE_USER

但按顺序执行

DELETE_USER,create_user,add_ssh_key,

3 个答案:

答案 0 :(得分:4)

那不是什么标签,而且在Ansible中没有办法做到这一点。任务始终按照在任务文件中定义的顺序执行和/或按顺序角色添加到剧本/游戏中。

如果您想要定位特定任务,可以使用单个标签多次调用该剧本。

ansible-playbook ... --tags=create_user
ansible-playbook ... --tags=add_ssh_key
ansible-playbook ... --tags=delete_user

您可以编写一个简单的bash脚本来自动执行该操作。 (当你有一个更复杂的设置并且必须处理多个标签时,这通常会导致最终结果)

答案 1 :(得分:2)

通常,如果没有给出标签,则所有任务都按照它们在剧本中的顺序执行。我认为因为你的标签涵盖了剧本中的所有任务,所以它们只是按顺序执行,没有任何标签。因此,解决方案可能是重新安排剧本中的任务。

示例剧本:

  - hosts: localhost

    tasks:
      - name: Third task
        shell:
        tags: "third"

      - name: Second task
        shell:
        tags: "second"

      - name: First task
        shell:
        tags: "first"

首先运行:

ansible-playbook -c 'local' test.yml --tags=first,second,third --list-tasks

输出:

playbook: test.yml

play #1 (localhost): localhost        TAGS: []
  tasks:
    Third task        TAGS: [third]
    Second task       TAGS: [second]
    First task        TAGS: [first]

第二轮:

ansible-playbook -c 'local' test.yml --tags=third,first,second --list-tasks

输出(没有改变):

playbook: test.yml

play #1 (localhost): localhost        TAGS: []
  tasks:
    Third task        TAGS: [third]
    Second task       TAGS: [second]
    First task        TAGS: [first]

现在让我们重新安排剧本中的任务:

- hosts: localhost

  tasks:
    - name: First task
      shell:
      tags: "first"

    - name: Second task
      shell:
      tags: "second"

    - name: Third task
      shell:
      tags: "third"

最终运行:

ansible-playbook -c 'local' test.yml --tags=third,first,second --list-tasks

输出(正确的顺序):

playbook: test.yml

play #1 (localhost): localhost        TAGS: []
  tasks:
    First task        TAGS: [first]
    Second task       TAGS: [second]
    Third task        TAGS: [third]

答案 2 :(得分:0)

<块引用>

一般来说,如果没有给定标签,所有任务都会按照它们在剧本中的顺序执行。

现在任务在我的环境中按字母顺序执行。 (ansible 2.6.0,不是最新的)

我有两个答案:

  1. 使用单个标签多次调用剧本
  2. 使用 wait_for (doc here) 设置任务,以便第二个任务等待,直到第一个任务传递的文件(或其他内容)存在。