Ansible跳过我的标签

时间:2016-01-20 06:34:47

标签: linux ansible ansible-playbook

当我在我的剧本中标记任何特定标签时,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用户的某个人遇到了类似的问题。提示我,请。

1 个答案:

答案 0 :(得分:4)

我相信你误解了标签是如何工作的。如果在调用ansible-playbook时没有提供任何标记,则所有都会被执行。

绝对没有办法定义只有在传递指定标签时才会执行的任务。如果您不希望执行这些任务,则显式必须指定--skip-tags "debian_install"或使用其他标记调用Ansible。正如@ydaetskcoR已经在上面表示的那样,通过致电--tags "configure",您的任务将被标记为configure,实际上应该被跳过。

如果真的不是这样的话,你可能会发现一个错误。但是我不知道在任何版本中都有这样的问题,因为我使用Ansible(大约1年,我相信版本1.6)

这个问题,你不能强迫Ansible只在提供指定的标签时执行任务,在我看来是Ansible最大的问题之一。这不仅缺乏功能,而且可能非常危险。想象一下,您有一项任务是擦除数据库,重新启动服务,删除用户等。您可能创建的任务仅在相应的标记应用于呼叫时才被调用。然后你不小心运行了没有任何标签的剧本。吊杆!

因此很多人不直接致电Ansible。相反,他们使用简单的bash包装器脚本,以确保正确设置所有--tags--skip-tags。默认情况下,跳过危险标记,只有在显式调用脚本运行危险任务时才允许它们。