不工作等待基于日志数据通过Ansible启动JBoss服务器
我试图通过Ansible启动JBoss服务,并使用wai_for module等待JBoss启动。然而,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
- 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单词。我也弄明白了。看见一只白鹭。检查一下