在单个条件下对多个ansible任务进行分组

时间:2015-12-23 17:27:23

标签: if-statement solr task conditional ansible

我使用ansible作为系统编排工具。首先,让我描述一下我最终的目标。

我想创建一个或两个剧集,从网上抓取solr,自行设置,然后根据某些配置启动索引。如果到目前为止听起来有任何疑问,请在这里阻止我。

现在,如果我不需要,我不想抓住solr tarball,所以我现在有一个看起来像这样的任务/游戏。

- stat: path="path to solr home/solr/bin/init script"
  register: solr_script

- name: getting solr
  when: solr_script.stat.exists == False
  shell: mkdir -p "path to download dir"
  get_url: url="download url" dest= "path to download dir"
  shell: tar zxvf "path to download dir/tgz file" -C "path to solr home"
  shell: rm -rf "path to download dir"

- name: start solr
  shell: "path to solr home/solr/bin/solr init script" start
  sudo: yes

我尝试检查solr init脚本是否已经下载,然后再去抓取它。

当我按原样运行此脚本时,我收到错误

multiple actions specified in task: 'shell' and 'getting solr' 

这似乎是合理的,也许格式错了?我试过这个

- name: getting solr
  when: solr_script.stat.exists == False
      shell: mkdir -p "path to download dir"
      get_url: url="download url" dest= "path to download dir"
      shell: tar zxvf "path to download dir/tgz file" -C "path to solr home"
      shell: rm -rf "path to download dir"

语法错误。

在ansible文档页面上,我看到了这些信息。

Note that if you have several tasks that all share the same conditional statement, you can affix the conditional to a task include statement as below. All the tasks get evaluated, but the conditional is applied to each and every task:

这似乎正在达到我的需要。

然后他们跟进了这个例子。

- include: tasks/sometasks.yml
  when: "'reticulating splines' in output"

我不太了解" include",这个例子似乎并没有说明我想要的东西。所以,如果我的初始假设是正确的,这确实是我想要获得solr的方式,那么我将如何编写一个有条件地执行一组任务的ansible任务。

3 个答案:

答案 0 :(得分:9)

在Ansible 2.0中,它可能是这样的:

- block:
    - shell: mkdir -p "path to download dir"
    - get_url: url="download url" dest= "path to download dir"
    - shell: tar zxvf "path to download dir/tgz file" -C "path to solr home"
    - shell: rm -rf "path to download dir"
  when: solr_script.stat.exists == False

希望这会对你有所帮助。

答案 1 :(得分:1)

这是无效的:

- name: getting solr
  when: solr_script.stat.exists == False
  shell: mkdir -p "path to download dir"
  get_url: url="download url" dest= "path to download dir"
  shell: tar zxvf "path to download dir/tgz file" -C "path to solr home"
  shell: rm -rf "path to download dir"

任务由名称(可选),一个任务/模块以及whenwith等修饰符组成。您不能拥有多个任务(在本例中为{{ 1}}& shell)在任务中。因此,您需要将其分解为多个任务:

get_url

等等......

要有条件地执行一系列任务,您可以执行以下操作:

  1. 您可以使用问题中提到的- name: make solr directory file: path=/path/to/download/dir" state=directory - name: download solr get_url: url=<url> dest=/path/to/download/dir - name: unpack solr shell: tar xvzf ... 语句,这样您就可以将条件应用于该包含文件中的所有任务。

  2. 您可以创建一个执行所有任务的角色,并再次使用条件来调用它(或者只是将角色应用于您希望将角色应用到的主机等)

  3. 您可以分别为每个任务添加include个子句。

  4. 您可以使用whenshellcreates等其他模块的参数,这些模块将查找是否存在用于确定是否存在的文件执行任务。

答案 2 :(得分:0)

对于ansible 2.x,请使用另一个接受的答案。您可以使用ansible 1.9.x使用include语句执行此操作。

首先在当前角色目录中为此创建两个.yml文件,main.ymlsolr.yml

您的main.yml应如下:

- stat: path="path to solr home/solr/bin/init script"
  register: solr_script

- include: solr.yml
  when: solr_script.stat.exists == False

solr.yml文件中,您希望为main.yml中的包含条件运行所有任务:

- shell: mkdir -p "path to download dir"
- get_url: url="download url" dest= "path to download dir"
- shell: tar zxvf "path to download dir/tgz file" -C "path to solr home"
- shell: rm -rf "path to download dir"

有关include statements的更多信息。希望有道理,干杯!