Ansible错误:’first argument must be string or compiled pattern’

39次阅读
没有评论

问题描述

在使用Ansible时遇到了一个错误,错误信息为”‘first argument must be string or compiled pattern'”。该错误出现在他的playbook中的某个任务中,任务的目标是在配置文件中替换字符串并添加一个数据库数组。用户尝试了一些方法,但仍无法解决这个问题。他想知道应该如何处理这个错误。

解决方案

请注意以下操作可能因版本差异而有所不同,请提前做好备份工作。

方案1

根据用户提供的错误信息,错误似乎出现在替换字符串的任务中。让我们来看一下用户提供的任务代码:

- name: replace hostname in config
  replace:
    path: /opt/agentd.conf
    regexp: #\s+Hostname\=
    replace: Hostname={{hname}}
    backup: yes

在这个任务中,问题出现在正则表达式部分。错误提示”first argument must be string or compiled pattern”意味着在正则表达式中存在问题。解决这个问题的方法是修改正则表达式,确保其格式正确。正确的正则表达式应该包括引号,将其视为字符串。下面是修正后的任务代码:

- name: replace hostname in config
  replace:
    path: /opt/agentd.conf
    regexp: '#\s+Hostname\='
    replace: Hostname={{hname}}
    backup: yes

修改后的正则表达式包括单引号,将其作为字符串处理。这样,你应该不会再遇到”first argument must be string or compiled pattern”的错误了。

方案2

如果你想要更精确的匹配替换,可以在正则表达式中使用.*$。这样,你可以确保替换的是整行,而不仅仅是’# Hostname=’。以下是带有更精确匹配的任务代码示例:

- name: replace hostname in config
  replace:
    path: /opt/agentd.conf
    regexp: '#\s+Hostname\=.*$'
    replace: Hostname={{hname}}
    backup: yes

上述代码中的正则表达式#\s+Hostname\=.*$将匹配以’# Hostname=’开头的整行,这样你就不会出现”Hostname=oldhostnamenewhostname”的问题。

请根据你的需求选择其中一种方案进行尝试,记得在执行前备份你的配置文件以防万一。

正文完