linux Ansible跳过我的标签

wqsoz72f  于 2023-02-07  发布在  Linux
关注(0)|答案(1)|浏览(172)

当我在剧本中标记任何特定标签时,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

但它仍然执行任务中的每个角色。第二种方式。角色配置是相同的。行动手册示例:

---
 - 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"

同样的结果。如果when条件有利,Ansible跳过任务。我希望这不是一个bug,因为我在net中没有遇到任何类似的问题。认为这是我的错,但仍然无法识别它在哪里。可能Ansible用户中的某个人面临类似的问题。请提示我。

hxzsmxv2

hxzsmxv21#

我相信你误解了标签的工作原理,如果你在调用ansible-playbook时没有提供任何标签,那么 everything 就会被执行。
要使ansible(〉= 2.1)默认忽略任务,可以添加never标记,因此对于您的用例,可以定义以下标记:

tags:
  - never
  - configure

现在,只有当您使用--tagd configure显式调用ansible时,它才会执行。
旧答案,前Ansible 2.1:
绝对没有办法定义只有在传递了指定的标记时才会执行的任务。如果不想执行这些任务,您必须显式指定--skip-tags "debian_install",或者使用不同的标记调用Ansible。正如上面推荐的@ydaetskcoR,通过调用--tags "configure",您的任务实际上应该跳过没有标记为configure的任务。
如果不是这样的话,你可能发现了一个bug。但是我不知道自从我使用Ansible以来(大约1年,我相信是1.6版本),任何版本都有这样的问题。
这个问题,你不能强迫Ansible只在提供分配的标记时执行任务,在我看来是Ansible最大的问题之一。这不仅是一个缺乏的功能,而且可能变得非常危险。想象一下你有一个任务要擦除数据库,重启服务,删除用户,你可能已经创建了一个只有当相应的标签被应用到调用时才被调用的脚本。然后你不小心运行了一个没有任何标签的剧本。
因此很多人不直接调用Ansible,而是使用一个简单的bash wrapper脚本,确保所有--tags--skip-tags都设置正确。默认情况下,跳过危险标签,只有在显式调用脚本来运行危险任务时才允许它们。

相关问题