我想按照--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,
答案 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,不是最新的)
我有两个答案:
wait_for
(doc here) 设置任务,以便第二个任务等待,直到第一个任务传递的文件(或其他内容)存在。