在本章中,我们将了解Ansible的高级执行情况.
这是非常重要的执行策略,其中只需执行一次执行而不是整个playbook. 例如,假设您只想停止服务器(如果出现生产问题),然后发布应用补丁,您只想启动服务器.
在原始剧本中,停止和开始是同一剧本中不同角色的一部分,但这可以通过使用标签来处理.我们可以为不同的角色提供不同的标签(反过来它们将具有任务),因此基于执行器提供的标签,只有指定的角色/任务被执行.因此,对于上面提供的示例,我们可以添加类似以下的标签;
- {role: start-tomcat, tags: ['install']}}
以下命令有助于使用标签 :
ansible-playbook -i hosts< your yaml> --tags"install"-vvv
使用上面的命令,只会调用start-tomcat角色.提供的标签区分大小写.确保将完全匹配传递给命令.
有两种方法可以实现特定步骤的执行特定主机.对于特定角色,可以定义主机 - 关于应该运行特定角色的特定主机.
- hosts: <A> environment: "{{your env}}" pre_tasks: - debug: msg = "Started deployment. Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " roles: - {role: <your role>, tags: ['<respective tag>']} post_tasks: - debug: msg = "Completed deployment. Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}" - hosts: <B> pre_tasks: - debug: msg = "started.... Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " roles: - {role: <your role>, tags: ['<respective tag>']} post_tasks: - debug: msg = "Completed the task.. Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"
根据上面的例子,取决于主机如果提供,则仅调用相应的角色.现在我的主机A和B在主机(库存文件)中定义.
另一种解决方案可能是使用定义Playbook的主机一个变量,然后通过传递特定的主机地址 - extra-vars :
# file: user.yml (playbook) --- - hosts: '{{ target }}' user: ... playbook contd….
ansible-playbook user.yml --extra-vars "target = "<your host variable>"
如果未定义{{target}},则剧本不会执行任何操作.如果需要,也可以通过hosts文件传递.如果没有提供额外的变量,这不会有害.
$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts