Regex 用于提取 WordPress wp-config 数据库信息并使用 ansible 自动执行以更新共享托管环境

问题描述 投票:0回答:1

亲爱的,

我需要您对下面的正则表达式的支持,我已经研究了过去 5 个小时,但无法弄清楚

define\(\s*[\'"]DB_HOST[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]\)

我的任务很简单,我需要一个正则表达式来提取 WordPress 数据库信息,我将在 Ansible 剧本中使用它

/\*\* The host of the database for WordPress \*/
define( 'DB_HOST', 'database_host_here' );

以上是格式

在 ChatGPT 和其他 GenAI 工具的帮助下,我尝试了不止正则表达式,但由于正则表达式转义问题,每个输出都失败了

这是我当前的剧本

---
- name: Update wp-config.php with new template
  hosts: localhost

  vars_prompt:
    - name: username
      prompt: "Enter the username"
      private: false

  vars:
    wp_config_filename: "wp-config.php"
    enable_debug: false
    multi_site: false
    search_paths:
      - "/home/{{ username }}/public_html/public"

  tasks:
    - name: Find wp-config.php files
      ansible.builtin.find:
        paths: "{{ search_paths }}"
        patterns: "{{ wp_config_filename }}"
      register: wp_config_files

    - name: Fail if no wp-config.php files found
      ansible.builtin.fail:
        msg: "No wp-config.php files found in the provided paths."
      when: wp_config_files.matched == 0

    - name: Debug wp-config.php files
      ansible.builtin.debug:
        var: wp_config_files

    - name: Read existing wp-config.php for database credentials
      ansible.builtin.slurp:
        src: "{{ item.path }}"
      loop: "{{ wp_config_files.files }}"
      loop_control:
        loop_var: item
      register: wp_config_content
      when: wp_config_files.matched > 0

    - name: Decode base64 encoded wp-config.php content
      ansible.builtin.set_fact:
        wp_config_decoded: "{{ wp_config_content.results | map(attribute='content') | map('b64decode') | list }}"

    - name: Debug decoded wp-config.php content
      ansible.builtin.debug:
        var: wp_config_decoded

    - name: Set database credentials from existing wp-config.php
      ansible.builtin.set_fact:
        db_host: "{{ item | regex_search('define\\(\\s*[\'\"]DB_HOST[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('localhost') }}"
        db_name: "{{ item | regex_search('define\\(\\s*[\'\"]DB_NAME[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('wordpress') }}"
        db_user: "{{ item | regex_search('define\\(\\s*[\'\"]DB_USER[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('root') }}"
        db_password: "{{ item | regex_search('define\\(\\s*[\'\"]DB_PASSWORD[\'\"]\\s*,\\s*[\'\"]([^\'\"]+)[\'\"]') | default('password') }}"
      loop: "{{ wp_config_decoded }}"
      loop_control:
        loop_var: item

    - name: Debug extracted database credentials
      ansible.builtin.debug:
        msg: >
          DB Name: {{ db_name }},
          DB User: {{ db_user }},
          DB Password: {{ db_password }},
          DB Host: {{ db_host }}

    - name: Create a new wp-config.php from template
      ansible.builtin.template:
        src: "wp-config.php.j2"
        dest: "{{ item.path }}"
        mode: "0644"
      loop: "{{ wp_config_files.files }}"
      when: wp_config_files.matched > 0

我有一个包含多个 WordPress 网站的共享托管环境,我想让所有设置都相同,因此我想自动检测数据库信息,更新模板,并将其放置在正确的路径中。

define\(\s*[\'"]DB_HOST[\'"]\s*,\s*[\'"]([^\'"]+)[\'"]\)

ansible失败了

更新

感谢@WiktorStribiżew,我能够找到问题的解决方案

使用 regex_search for ansible 的新的和更新的正则表达式值

regex_search('define\\s*\\(\\s*[\\x22\\x27]DB_HOST[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([^\\x22\\x27]+)[\\x22\\x27]\\s*\\)', '\\1') | first
regex automation ansible yaml
1个回答
0
投票

如果您无法理解如何在字符串文字中转义双引号和单引号,可以使用一种解决方法来将双引号和单引号添加到正则表达式模式中。这适用于大多数(如果不是全部)NFA 正则表达式引擎。

您可以将

"
\x22
以及
'
\x27
转义实体相匹配。

所以,你的图案看起来像这样

regex_search('define\\(\\s*[\\x22\\x27]DB_HOST[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([^\\x22\\x27]+)[\\x22\\x27]\\s*\\)')

注意,如果需要从结果中获取组值,则需要将其指定为

regex_search
的第二个参数:

regex_search('define\\(\\s*[\\x22\\x27]DB_HOST[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([^\\x22\\x27]+)[\\x22\\x27]\\s*\\)', '\\1')

由于代码执行的结果是获得一个列表,并且您只需要该列表中的第一项,因此您只需在正则表达式搜索命令后添加

 | first
即可。

© www.soinside.com 2019 - 2024. All rights reserved.