iam*_*lam 5 ansible ansible-playbook
我想按照--tags中给出的标签顺序在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
Run Code Online (Sandbox Code Playgroud)
运行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
Run Code Online (Sandbox Code Playgroud)
预期产量
TASK: [Create user] ***********************************************************
changed: [ip address]
TASK: [Add ssh key] ***********************************************************
changed: [ip address]
TASK: [Delete user] ***********************************************************
ok: [ip address]
Run Code Online (Sandbox Code Playgroud)
输出来
TASK: [Delete user] ***********************************************************
ok: [ip address]
TASK: [Create user] ***********************************************************
changed: [ip address]
TASK: [Add ssh key] ***********************************************************
changed: [ip address]
Run Code Online (Sandbox Code Playgroud)
给定标签的顺序
create_user,add_ssh_key,delete_user
但是按顺序执行
delete_user,create_user,add_ssh_key,
这不是标签的用途,并且在 Ansible 中无法做到这一点。任务总是按照它们在任务文件中定义的顺序和/或角色被添加到剧本/剧本中的顺序执行。
如果您想按顺序定位特定任务,您可以通过应用单个标签多次调用剧本。
ansible-playbook ... --tags=create_user
ansible-playbook ... --tags=add_ssh_key
ansible-playbook ... --tags=delete_user
Run Code Online (Sandbox Code Playgroud)
您可以编写一个简单的 bash 脚本来实现自动化。(无论如何,当您有更复杂的设置并且必须处理多个标签时,通常会以这种方式结束)
一般来说,如果没有给出标签,所有任务都会按照它们在剧本中的顺序执行。我认为因为您的标签涵盖了剧本中的所有任务,所以它们只是按照没有任何标签的顺序执行。因此,解决方案可能是重新安排剧本中的任务。
示例剧本:
- hosts: localhost
tasks:
- name: Third task
shell:
tags: "third"
- name: Second task
shell:
tags: "second"
- name: First task
shell:
tags: "first"
Run Code Online (Sandbox Code Playgroud)
第一次运行:
ansible-playbook -c 'local' test.yml --tags=first,second,third --list-tasks
Run Code Online (Sandbox Code Playgroud)
输出:
playbook: test.yml
play #1 (localhost): localhost TAGS: []
tasks:
Third task TAGS: [third]
Second task TAGS: [second]
First task TAGS: [first]
Run Code Online (Sandbox Code Playgroud)
第二次运行:
ansible-playbook -c 'local' test.yml --tags=third,first,second --list-tasks
Run Code Online (Sandbox Code Playgroud)
输出(没有改变):
playbook: test.yml
play #1 (localhost): localhost TAGS: []
tasks:
Third task TAGS: [third]
Second task TAGS: [second]
First task TAGS: [first]
Run Code Online (Sandbox Code Playgroud)
现在让我们重新排列 playbook 中的任务:
- hosts: localhost
tasks:
- name: First task
shell:
tags: "first"
- name: Second task
shell:
tags: "second"
- name: Third task
shell:
tags: "third"
Run Code Online (Sandbox Code Playgroud)
最终运行:
ansible-playbook -c 'local' test.yml --tags=third,first,second --list-tasks
Run Code Online (Sandbox Code Playgroud)
输出(正确顺序):
playbook: test.yml
play #1 (localhost): localhost TAGS: []
tasks:
First task TAGS: [first]
Second task TAGS: [second]
Third task TAGS: [third]
Run Code Online (Sandbox Code Playgroud)