当我在我的剧本中标记任何特定标签时,Ansible会忽略它并执行我角色中的每个任务。当我在ansible-playbook
命令中标记标签时,我观察到同样的效果。
显然,这是一个简单的例子。我正在尝试更改LAMP堆栈配置。
这是角色:
- name: install packages [Debian]
apt: name={{ item }} state=present
with_items:
- php5-fpm
- php5-mysql
- php5-gd
- php5-imagick
- php5-pgsql
when: ansible_distribution == "Debian"
tags:
- debian_install
- name: change php configuration
lineinfile: dest={{ item.dest }} regexp={{ item.regexp }} line={{ item.line }}
with_items:
- { dest: '/etc/php5/fpm/php.ini', regexp: '^cgi.fix_pathinfo=', line: 'cgi.fix_pathinfo=0' }
tags:
- configure
- name: make site directory
file: path={{ site_directory }} owner={{ remote_user }} group={{ remote_group }} mode=0755 state=directory
tags:
- configure
这是剧本:
---
- hosts: webservers
remote_user: "{{ remote_user }}"
become: sudo
gather_facts: yes
vars_files:
- host_vars/all.yml
roles:
- { role: iptables, tags: 'configure' }
- { role: apache, tags: 'configure' }
- { role: mysql, tags: 'configure' }
- { role: php, tags: 'configure' }
post_tasks:
- reboot.yml
我正在通过此命令运行它:
ansible-playbook lamp.yml -i hosts
但它仍然可以完成任务中的每个角色。 第二种方式。角色配置是一样的。 Playbook示例:
---
- hosts: webservers
remote_user: "{{ remote_user }}"
become: sudo
gather_facts: yes
vars_files:
- host_vars/all.yml
roles:
- iptables
- apache
- mysql
- php
post_tasks:
- reboot.yml
命令示例:
ansible-playbook lamp.yml -i hosts --tags "configure"
同样的结果。 Ansible跳过任务,如果它有利于when
条件。我希望这不是一个bug,因为我没有在网上遇到任何类似的问题。认为这是我的坏事,但仍然无法识别它在哪里。可能是Ansible用户的某个人遇到了类似的问题。提示我,请。
答案 0 :(得分:4)
我相信你误解了标签是如何工作的。如果在调用ansible-playbook时没有提供任何标记,则所有都会被执行。
绝对没有办法定义只有在传递指定标签时才会执行的任务。如果您不希望执行这些任务,则显式必须指定--skip-tags "debian_install"
或使用其他标记调用Ansible。正如@ydaetskcoR已经在上面表示的那样,通过致电--tags "configure"
,您的任务将被标记为configure
,实际上应该被跳过。
如果真的不是这样的话,你可能会发现一个错误。但是我不知道在任何版本中都有这样的问题,因为我使用Ansible(大约1年,我相信版本1.6)
这个问题,你不能强迫Ansible只在提供指定的标签时执行任务,在我看来是Ansible最大的问题之一。这不仅缺乏功能,而且可能非常危险。想象一下,您有一项任务是擦除数据库,重新启动服务,删除用户等。您可能创建的任务仅在相应的标记应用于呼叫时才被调用。然后你不小心运行了没有任何标签的剧本。吊杆!
因此很多人不直接致电Ansible。相反,他们使用简单的bash包装器脚本,以确保正确设置所有--tags
和--skip-tags
。默认情况下,跳过危险标记,只有在显式调用脚本运行危险任务时才允许它们。