Ansible 跳过我的标签

caz*_*a19 2 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
Run Code Online (Sandbox Code Playgroud)

这是剧本:

---
 - 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
Run Code Online (Sandbox Code Playgroud)

我通过这个命令运行它:

ansible-playbook lamp.yml -i hosts
Run Code Online (Sandbox Code Playgroud)

但它仍然在任务中扮演每一个角色。第二种方式。角色配置是一样的。剧本示例:

---
 - 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
Run Code Online (Sandbox Code Playgroud)

命令示例:

ansible-playbook lamp.yml -i hosts --tags "configure"
Run Code Online (Sandbox Code Playgroud)

同样的结果。如果when条件有利,Ansible 会跳过任务。我希望这不是一个错误,因为我在网络中没有遇到任何类似的问题。认为是我的错,但还是认不出它在哪里。可能 Ansible 用户中的某个人遇到了类似的问题。请提示我。

udo*_*dan 5

我相信你误解了标签的工作原理。如果在调用 ansible-playbook 时不提供任何标签,则一切都会被执行。

绝对没有办法定义只有在分配的标签被传递时才会执行的任务。您必须明确指定--skip-tags "debian_install"是不希望执行这些任务还是使用不同的标签调用 Ansible。正如@ydaetskcoR 已经在上面推荐的那样,通过调用--tags "configure"您没有标记为configure实际上应该跳过的任务。

如果情况并非如此,您可能已经发现了一个错误。但我不知道自从我使用 Ansible(大约 1 年,我相信是 1.6 版)以来,任何版本都存在类似问题

这个问题,您不能强制 Ansible 仅在提供分配的标签时执行任务,在我看来,这是 Ansible 的最大问题之一。这不仅是一个缺乏的功能,而且会变得非常危险。想象一下,您有一个任务来擦除数据库、重新启动服务、删除用户等。您可能已经创建了仅在将相应的标记应用于调用时才调用的任务。然后你不小心运行了没有任何标签的剧本。繁荣!

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