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 用户中的某个人遇到了类似的问题。请提示我。
我相信你误解了标签的工作原理。如果在调用 ansible-playbook 时不提供任何标签,则一切都会被执行。
绝对没有办法定义只有在分配的标签被传递时才会执行的任务。您必须明确指定--skip-tags "debian_install"是不希望执行这些任务还是使用不同的标签调用 Ansible。正如@ydaetskcoR 已经在上面推荐的那样,通过调用--tags "configure"您没有标记为configure实际上应该跳过的任务。
如果情况并非如此,您可能已经发现了一个错误。但我不知道自从我使用 Ansible(大约 1 年,我相信是 1.6 版)以来,任何版本都存在类似问题
这个问题,您不能强制 Ansible 仅在提供分配的标签时执行任务,在我看来,这是 Ansible 的最大问题之一。这不仅是一个缺乏的功能,而且会变得非常危险。想象一下,您有一个任务来擦除数据库、重新启动服务、删除用户等。您可能已经创建了仅在将相应的标记应用于调用时才调用的任务。然后你不小心运行了没有任何标签的剧本。繁荣!
因此,许多人不直接调用 Ansible。相反,他们使用一个简单的 bash 包装器脚本,以确保所有--tags和--skip-tags都正确设置。默认情况下跳过危险标签,只有在显式调用脚本来运行危险任务时才允许它们。
| 归档时间: |
|
| 查看次数: |
3707 次 |
| 最近记录: |