ansible:将循环(直到)与条件(何时)组合

ansible:将循环(直到)与条件(何时)组合,ansible,vagrant-provision,Ansible,Vagrant Provision,我正在尝试在本地vagrant vm中安装和配置应用程序服务器。对于资源调配,使用Ansible。 第一次启动完成后即可进行配置。此时它正在本地主机上侦听:8000。之后,我可以复制配置文件并重新启动服务。之后,端口更改为8081 问题是,在覆盖配置文件之前,我需要等待第一次启动完成。为了检查第一次启动是否完成,我在循环中使用了url模块,效果很好。因此,vm在第一次启动时得到配置——配置 但是,如果有另一个流浪规定,Ansible playbook使用循环执行url模块,则由于端口更改而失败。

我正在尝试在本地vagrant vm中安装和配置应用程序服务器。对于资源调配,使用Ansible。 第一次启动完成后即可进行配置。此时它正在本地主机上侦听:8000。之后,我可以复制配置文件并重新启动服务。之后,端口更改为8081

问题是,在覆盖配置文件之前,我需要等待第一次启动完成。为了检查第一次启动是否完成,我在循环中使用了url模块,效果很好。因此,vm在第一次启动时得到配置——配置

但是,如果有另一个流浪规定,Ansible playbook使用循环执行url模块,则由于端口更改而失败。所以我试了一下:

- name: configure / check for default server.conf


- command: grep "url.httpport=8081" "/{{ base_dir }}/conf/server.conf"
  ignore_errors: yes
  register: output

- name: configure / Check that app-server is installed successfully (8000)
  block:
    - get_url:
        url: http://localhost:8000/version.txt
        dest: /tmp
      register: result
      until: result is succeeded
      retries: 10
      delay: 30
      register: started
  when: output.rc == 1

- name: configure / Check that app-server is installed successfully (8081)
  block:
    - get_url:
        url: http://localhost:8081/version.txt
        dest: /tmp
      register: result
      until: result is succeeded
      retries: 10
      delay: 30
      register: started
  when: output.rc == 0
我的想法是,关于返回代码,选择正确的块,跳过另一个。但结果是:

TASK [glue-tomcat8 : configure / check for default server.conf] ***
fatal: [devaws]: FAILED! => {"changed": true, "cmd": ["grep", ".url.httpport=8081", "/opt5/conf/server.conf"], "delta": "0:00:00.003016", "end": "2018-05-22 07:11:51.382776", "msg": "non-zero return code", "rc": 1, "start": "2018-05-22 07:11:51.379760", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [glue-tomcat8 : Check that app server is installed successfully (8000)] ***
fatal: [devaws]: FAILED! => {"msg": "The conditional check 'result is succeeded' failed. The error was: The failed test expects a dictionary"}
因此,get_url模块的条件检查似乎存在问题。
单独使用时,没有When条件(When)且不在块内部时,它工作正常。我的猜测是,Ansible在何时合并之前存在问题。我在文档中找不到任何与此相关的内容。因此,我们非常感谢您的帮助。

首先,我建议不要只在一(1)项任务中使用块。这没有道理

其次,我建议使用
wait_for
模块检查端口。因此,如果要检查端口8000或8001,请执行以下操作:

---
  - name: Wait_For Example
    hosts: localhost
    gather_facts: False


    tasks:

      - name: Wait for port 443
        wait_for:
          port: 443
          delay: 0
          timeout: 3
          state: started
        register: _port443
        ignore_errors: True


      - name: Wait for port 8001
        wait_for:
          port: 8001
          delay: 0
          timeout: 3
          state: started
        register: _port8001
        ignore_errors: True


      - name: Debug
        debug:
          var: _port443
        when: 
          - _port443.state is defined
          - _port443.state == "started"
          - _port443.port == 443


      - name: Debug
        debug:
          var: _port8001
        when: 
          - _port8001.state is defined
          - _port8001.state == "started"
          - _port8001.port == 443

请小心,因为在这两种情况下都使用相同的变量
start

首先,我建议不要仅对一(1)个任务使用块。这没有道理

其次,我建议使用
wait_for
模块检查端口。因此,如果要检查端口8000或8001,请执行以下操作:

---
  - name: Wait_For Example
    hosts: localhost
    gather_facts: False


    tasks:

      - name: Wait for port 443
        wait_for:
          port: 443
          delay: 0
          timeout: 3
          state: started
        register: _port443
        ignore_errors: True


      - name: Wait for port 8001
        wait_for:
          port: 8001
          delay: 0
          timeout: 3
          state: started
        register: _port8001
        ignore_errors: True


      - name: Debug
        debug:
          var: _port443
        when: 
          - _port443.state is defined
          - _port443.state == "started"
          - _port443.port == 443


      - name: Debug
        debug:
          var: _port8001
        when: 
          - _port8001.state is defined
          - _port8001.state == "started"
          - _port8001.port == 443

请小心,因为在这两种情况下使用的是相同的变量
start

我让它工作了。这是第8层(自我)问题:) 启动的变量是一个遗留变量,不需要。看起来Ansible被这个变量激怒了。这是我的工作代码:

- command: grep "url.httpport=8081" "/{{ base_dir }}/conf/server.conf"
  ignore_errors: yes
  register: output

- get_url:
    url: http://localhost:8000/version.txt
    dest: /tmp
  register: result
  until: result is succeeded
  retries: 10
  delay: 30
  when: output.rc == 1

- get_url:
    url: http://localhost:8081/version.txt
    dest: /tmp
  register: result
  until: result is succeeded
  retries: 10
  delay: 30
  when: output.rc == 0

我让它工作了。这是第8层(自我)问题:) 启动的变量是一个遗留变量,不需要。看起来Ansible被这个变量激怒了。这是我的工作代码:

- command: grep "url.httpport=8081" "/{{ base_dir }}/conf/server.conf"
  ignore_errors: yes
  register: output

- get_url:
    url: http://localhost:8000/version.txt
    dest: /tmp
  register: result
  until: result is succeeded
  retries: 10
  delay: 30
  when: output.rc == 1

- get_url:
    url: http://localhost:8081/version.txt
    dest: /tmp
  register: result
  until: result is succeeded
  retries: 10
  delay: 30
  when: output.rc == 0

谢谢你的回答。对打开的端口进行检查是不够的,因为服务器在完全提取和加载jar文件之前就已经打开了端口。所以这不是一个有效的检查,因此我需要尝试下载version.txt文件。启动的变量是我以前尝试过但忘了删除的东西的剩余部分。对不起,谢谢你的回答。对打开的端口进行检查是不够的,因为服务器在完全提取和加载jar文件之前就已经打开了端口。所以这不是一个有效的检查,因此我需要尝试下载version.txt文件。启动的变量是我以前尝试过但忘了删除的东西的剩余部分。很抱歉,不要将块用于单个任务。另外,请注意块的错误处理可能会让您感到惊讶。这些是单个任务,因此当单独执行每个任务时,应按预期选择更多任务。不要对单个任务使用块。另外,请注意块的错误处理可能会让您感到惊讶。这些都是单个任务,因此当单独执行每个任务时,应该按照您的预期选择更多任务。