ansible模块之include_tasks:为什么加了tags后导入的任务没有执行?

本文探讨了Ansible中include_tasks模块在使用标签(tags)时的特殊情况及解决方案。当试图仅执行带有特定标签的任务时,会发现被包含的任务文件并未执行。文章详细解释了这一现象的原因,并提供了确保被包含任务正确执行的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ansible模块之include_tasks:为什么加了tags后导入的任务没有执行?

本文中ansible的版本为2.9。

场景再现

下面是Role中的要测试的任务:

# role01.yml
# ...前面的tasks

- name: included task for test
  include_tasks: test01.yml
  tags: 
    - test01

# ... 后面的tasks

在执行整个Role时,test01.yml会被正常导入playbook并执行:

$ ansible-playbook -i hosts.ini all role01.yml

但是当我们想通过tags单独测试这个任务时,

$ ansible-playbook -i hosts.ini all role01.yml --tags "test01"

奇怪的事情发生了:include_tasks本身这个任务执行成功了,但是被导入的test01.yml却并没有被执行!

原因分析

在对include_tasks任务使用tags时,只会对include_tasks任务本身生效,而并不会对其中包含的任务生效。

那如果我们要对其中包含的任务也生效,该怎么做呢?

解决办法

可以通过include_tasks模块的apply参数,为包含的任务添加标签。

将上面的任务改成下面的形式

# role01.yml
# ...前面的tasks

- name: included task for test
  include_tasks: 
    file: test01.yml
    apply:
      tags: test01
  tags: always

# ... 后面的tasks

然后调用即可:

$ ansible-playbook -i hosts.ini all role01.yml --tags "test01"

注意,上面的 tags: always 不能省略,否则 include_tasks本身不会被执行。always标签只对include_tasks本身生效。在调用其他tags时,include_tasks也会always执行,但是其中包含的任务不会被执行。

### 使用 Ansible 部署 LNMP 平台 #### 一、概述 Ansible 是一种强大的自动化工具,能够简化服务器配置管理以及应用程序部署过程。通过使用 Playbook 文件来描述任务流程,可以高效完成 LNMP 架构的部署工作[^1]。 --- #### 二、准备工作 在正式开始之前,需确保以下条件已满足: - **目标主机列表**:定义好要部署的目标服务器 IP 地址。 - **SSH 密钥认证**:设置免密登录至远程节点。 - **Python 支持**:确认所有被控端均已安装 Python 解释器(默认版本通常为 Python 2 或 Python 3)。 对于 LNMP 的基本组成来说,主要包括以下几个部分: - Nginx (Web Server) - MariaDB/MySQL (Database Management System) - PHP (Scripting Language) --- #### 三、Playbook 结构设计 以下是基于角色的方式构建的一个简单框架: ##### 1. 初始化项目结构 运行如下命令初始化各子模块的角色文件夹: ```bash ansible-galaxy init role_nginx ansible-galaxy init role_php ansible-galaxy init role_mariadb ansible-galaxy init role_wordpress ``` 这些命名可以根据实际需求调整路径位置 `/root/juben.dir` 下面创建对应目录存放剧本及相关资源文件。 ##### 2. 编写 Inventory 列表 编辑 inventory 文件指明哪些设备参与此次操作: ```ini [lamp_servers] server1 ansible_host=192.168.x.y server2 ansible_host=192.168.a.b ... ``` ##### 3. 创建主 playbook 文件 `deploy_lnmp.yml` 此文档负责调用各个独立的任务单元并按顺序执行它们。 ```yaml --- - hosts: lamp_servers become: yes roles: - { role: system_initialization } - { role: role_nginx, tags: ['nginx'] } - { role: role_php, tags: ['php'] } - { role: role_mariadb,tags:['db']} #- Optional additional services like caching etc. ``` 每一步骤都应包含详细的说明文档以便于维护人员理解意图所在[^2]。 --- #### 四、具体实施细节 ##### (1)系统初始化 这部分涉及到了很多前期准备事项比如更新 yum 源地址、预装依赖包等动作。可以通过下面这段 YAML 片段展示部分内容片段: ```yaml tasks: - name: Ensure EPEL repository is installed and enabled on CentOS/RHEL systems only when required. dnf: name: epel-release state: present when: "'CentOS' in ansible_distribution or 'RedHat' in ansible_distribution" - name: Install common packages across all distributions. package: name: - wget - unzip - git-core state: latest # 更改历史记录格式样例 - lineinfile: path: /etc/bashrc regexp: '^export HISTTIMEFORMAT' line: export HISTTIMEFORMAT="%F %T " create: true ... ``` ##### (2)Nginx WebServer 设置 利用官方仓库快速获取最新稳定版软件包即可满足大部分场景下的功能诉求。 ```yaml roles/nginx/tasks/main.yaml: - include_tasks: install_packages.yml - template: src=jinja_template.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root mode='0644' handlers/main.yaml: - service: name=nginx state=restarted ``` ##### (3)MariaDB 数据库服务搭建 同样采用 YUM 方式引入外部存储引擎支持插件等功能扩展选项。 ```yaml roles/mariadb/tasks/main.yaml: - apt_repository: repo: deb [arch=amd64,i386,ppc64el] http://ftp.osuosl.org/pub/mariadb/repo/$version/ubuntu $release main update_cache: yes - mysql_user: check_implicit_admin: no login_password: "{{ db_root_pass }}" name: root@localhost password: new_secure_pwd_here priv: "*.*:ALL" state: present ``` ##### (4)PHP-FPM 运行时环境定制化处理 最后别忘了关联 FastCGI 处理程序使得动态页面渲染成为可能。 ```yaml roles/php/tasks/main.yaml: - copy: content: "<?php echo phpinfo(); ?>" dest: "/var/www/html/info.php" - command: systemctl restart php-fpm.service creates=/run/php-fpm.sock notifies="Restart web server" ``` --- #### 五、测试验证阶段 完成以上全部环节之后就可以着手检验成果啦!建议从以下几个方面入手评估效果好坏程度: 1. 访问首页链接查看是否正常载; 2. 登录后台管理系统尝试新增文章或者评论之类交互行为; 3. 查阅错误日志排查潜在隐患点等等。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GottdesKrieges

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值