不工作等待基于日志数据通过Ansible启动JBoss服务器

不工作等待基于日志数据通过Ansible启动JBoss服务器,ansible,jboss,Ansible,Jboss,我试图通过Ansible启动JBoss服务,并使用wai_for module等待JBoss启动。然而,JBoss服务启动了,但是等待仍然在进行,直到超时,然后点击错误。下面是我的代码 - name: Get the contents of the last line from log command: "tail -n 1 /home/nityo/application.log" register: tail_output - name: Create a var

我试图通过Ansible启动JBoss服务,并使用wai_for module等待JBoss启动。然而,JBoss服务启动了,但是等待仍然在进行,直到超时,然后点击错误。下面是我的代码

- name: Get the contents of the last line from log
  command: "tail -n 1 /home/nityo/application.log"
  register: tail_output

- name: Create a variable with a meaningful name, just for clarity
  set_fact:
    last_line_of_the_log_file: "{{ tail_output.stdout }}"

- name: JBoss service starting
  service:
    name: "jboss.service"
    state: started
  become: yes
  become_user: root

- name:Wait for server started
  wait_for:
    path: "//home/nityo/application.log"
    search_regex: "{{ last_line_of_the_log_file }}\r(.*\r)*.*JBoss EAP.*started.*"
    timeout: 600

此外,我们可以将所有thsi合并为一个任务,而不是多个任务

输出日志示例

2020-10-11 01:13:42,009 INFO  [org.jboss.as] JBoss EAP 7.2 (WildFly Core) running in 100281ms - service to be running
2020-10-11 01:13:42,005 INFO  [org.jboss.as] processing data
2020-10-11 01:13:43,009 INFO  [org.jboss.as] JBoss EAP 7.2 (WildFly Core) stopped in 100281ms - service to be stopped
-
-
-
-
-
-
-
2020-10-11 01:13:48,009 INFO  [org.jboss.as] JBoss EAP 7.2 (WildFly Core) started in 100281ms - service to be started

它永远不会在上一个任务中匹配,因为您正在搜索最后一个日志文件行以及一些额外的内容。您正在正则表达式中使用一个变量,该变量包含一个字符串,如果您在其末尾添加其他人员,则该字符串将永远不匹配

因此,跳过第一个和第二个任务,并更改最后一个任务的search_regex参数

您可以使用ansible fact
ansible\u date\u time
(如中所述),并使用部分日期、时间和/或历元秒通过set\u fact模块构建正则表达式。因此,您的正则表达式将与日志文件行匹配,时间戳不早于10分钟

使用
date
可以创建特定小时的时间戳。剧本可以如下所示:

---
- name: check logfile last 10 Minutes
  hosts:
  - localhost
  gather_facts: no
  tasks:
  - name: set now timestring
    command: 'date +"%Y-%m-%d %H"'
    register: date_now
  - name: set_now
    set_fact:
      now: "{{ date_now.stdout }}"
  - name: set 10 minutes ago timestring
    command: 'date +"%Y-%m-%d %H" -d "10 minutes ago"'
    register: date_10min_ago
  - name: set 10min_ago
    set_fact:
      ten_min_ago: "{{ date_10min_ago.stdout }}"
  - name: debug
    debug:
      msg: "({{ now }}|{{ ten_min_ago }}).*JBoss EAP.*started.*"
  - name: Wait for server started
    wait_for:
      path: "//home/nityo/application.log"
      search_regex: "({{ now }}|{{ ten_min_ago }}).*JBoss EAP.*started"
      timeout: 600
TASK [debug] **********************
ok: [localhost] => {
    "msg": "(2020-10-12 08|2020-10-12 08).*JBoss EAP.*started.*"
}
如果达到Daly限制,则时间戳完全不同。在一小时的时间里,这似乎是多余的。调试输出正则表达式的外观如下:

---
- name: check logfile last 10 Minutes
  hosts:
  - localhost
  gather_facts: no
  tasks:
  - name: set now timestring
    command: 'date +"%Y-%m-%d %H"'
    register: date_now
  - name: set_now
    set_fact:
      now: "{{ date_now.stdout }}"
  - name: set 10 minutes ago timestring
    command: 'date +"%Y-%m-%d %H" -d "10 minutes ago"'
    register: date_10min_ago
  - name: set 10min_ago
    set_fact:
      ten_min_ago: "{{ date_10min_ago.stdout }}"
  - name: debug
    debug:
      msg: "({{ now }}|{{ ten_min_ago }}).*JBoss EAP.*started.*"
  - name: Wait for server started
    wait_for:
      path: "//home/nityo/application.log"
      search_regex: "({{ now }}|{{ ten_min_ago }}).*JBoss EAP.*started"
      timeout: 600
TASK [debug] **********************
ok: [localhost] => {
    "msg": "(2020-10-12 08|2020-10-12 08).*JBoss EAP.*started.*"
}

在变量到达此任务时,
等待模块检查的默认间隔内,
日志文件的最后一行中存储的内容可能不匹配

通过解析日志文件来检查服务状态可能很棘手。然而,我认为最干净的方法是匹配日志文件中的模式
jbosseap.*start.
。但是,为了使其可靠地工作,最好在启动服务之前先从一个空日志文件开始

#备份带有日期/时间戳的日志文件
-shell:cat/home/nityo/application.log>>/home/nityo/application-$(日期%b-%d-%H-%M)。日志
#启动服务前清空文件内容
-命令:truncate-s0/home/nityo/application.log
-等待:
路径:“/home/nityo/application.log”
搜索正则表达式:“JBoss EAP.*已启动。*”
超时:600
如果日志在给定的时间跨度内以不同的方式生成,那么解析日志文件可能会出错。您可以调整时间、重试次数和搜索模式,以获得更一致的结果

更新:

最好等待一段时间,滚动到
tail
命令获取的默认行(10)之外,以避免与以前的启动匹配。然后使用egrep

#暂停并等待日志滚动超过“tail”获取的10行
-暂停:
秒:30
-shell:tail/home/nityo/application.log | grep-e“JBoss EAP.*已启动”
寄存器:file\u tail
直到:文件尾成功
#根据记录速率使用适当的值
重试次数:30次
延误:20

您可以在日志文件中添加一个示例
最后一行吗?如果是这样,那么在
wait_for
中匹配的可能性很小。是的。第一个任务将获得最后一行。之后,服务器重新启动。当服务器重新启动时,生成输出大致需要5分钟,但这取决于具体情况。有时可能更长。因此,基本上,输出一直在变化,然后我可以区分。有时服务器一天启动两次。然后它如何知道它需要寻找最新的值。这就是我出来检查最后一行的原因,然后在那之后重新启动服务器,如果匹配了该模式,然后停止,因为这意味着jboss服务器已经启动了。您有一些示例。我无法想象能做什么我认为我不能做空文件的建议。我将尝试您提供的下一个解决方案。如果日志文件的文件内容是一个问题,可以备份它,然后清空它。祝你在其他选择上好运!但是我试过了,它在JBoss EAP中出现单词之前就停止了,几秒钟内就停止了。它没有等到它完全执行。我怀疑是因为我们没有提供时间输入,比如从当前时间开始,它应该从tail中获取值。您之前的答案是好的,但是,应该包含时间戳,以便在该时间戳之后检查是否可以grep单词。我也弄明白了。看见一只白鹭。检查一下