【问题标题】:How to group set of tasks into a block in ansible playbook?如何将一组任务分组到 ansible playbook 中的一个块中?
【发布时间】:2017-01-10 13:43:12
【问题描述】:

我正在创建一个用于配置我们的构建系统的 ansible playbook。其中一部分是我开始编写为 CentOS 安装 java(open JDK 和 Oracle JDK)的角色。 Open JDK 可通过 YUM 包管理器获得,因此没有幂等性问题。对于 oracle Java,我需要下载、安装、符号链接并清理。为了创建幂等性,我正在寻找更简洁的方法,例如这是我的代码。基本上我正在检查符号链接以确定是否安装了 java 并注册一个变量以便稍后在 WHEN 模块中使用它。我不喜欢在安装 jdk 的所有四个步骤中使用 When 语句。如何将所有四个步骤(下载、安装、符号链接和清理)分组到一个块中,并根据一个 when 语句使它们全部运行?

- name: Check if Java 8 is instaled
  stat: path=~/java/oraclejdk8
  register: oraclejdk8_sym

- name: Download Java 8
  command: "wget --no-cookies -O {{ jdk_download_path }}/{{ oraclejdk8.jdk_rpm_file }} --no-check-certificate --header 'Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie' {{ oraclejdk8.jdk_rpm_url }}"
  when: oraclejdk8_sym.stat.islnk is not defined

- name: Install Java 8
  yum: name={{ java_archive }} state=present
  when: oraclejdk8_sym.stat.islnk is not defined

- name: Symlink to ~/java/oraclejdk8
  file: path=~/java/ state=directory mode=0755
  command: "ln -s /usr/java/jdk{{ oraclejdk8.jdk_version  }} ~/java/oraclejdk8"
  when: oraclejdk8_sym.stat.islnk is not defined

- name: Clean up
  file: state=absent path={{ jdk_download_path}}/{{ oraclejdk8.jdk_rpm_file }}
  when: oraclejdk8_sym.stat.islnk is not defined

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    在 Ansible 2.x 中,您可以这样做:

    - name: Check if Java 8 is instaled
      stat: path=~/java/oraclejdk8
      register: oraclejdk8_sym
    
    - block:   
        - name: Download Java 8
          command: "wget --no-cookies -O {{ jdk_download_path }}/{{ oraclejdk8.jdk_rpm_file }} --no-check-certificate --header 'Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie' {{ oraclejdk8.jdk_rpm_url }}"
    
        - name: Install Java 8
          yum: name={{ java_archive }} state=present
    
        - name: Symlink to ~/java/oraclejdk8
          file: path=~/java/ state=directory mode=0755
        - command: "ln -s /usr/java/jdk{{ oraclejdk8.jdk_version  }} ~/java/oraclejdk8"
    
    
        - name: Clean up
          file: state=absent path={{ jdk_download_path}}/{{ oraclejdk8.jdk_rpm_file }}
    
      when: oraclejdk8_sym.stat.islnk is not defined
    

    【讨论】:

    • 尝试使用blockwith_items 而不是when。错误 ERROR! Syntax Error while loading YAML. did not find expected key 指向 - block。试图从- block 中删除- ,得到指向with_items 的错误。 (ansible v2.7)
    • 跟进:块不能用于循环列表。作者建议使用包含而不是块
    【解决方案2】:

    如果您使用的是 Ansible 2.0,则可以使用新的“块”功能(请参阅此处的新功能介绍:http://www.slideshare.net/jimi-c/whats-new-in-v2-ansiblefest-london-2015)。在 1.x 上,你可以将你的 java 东西打包成一个角色,并在角色上做一个“when”语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-19
      • 2023-03-11
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2021-06-21
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多