Ansible部署MySQL8时提取的root密码含多余符号,如何修剪?
解决Ansible提取MySQL 8初始root密码后格式异常问题
问题根源
你用regex_findall提取密码时,该模块返回的是列表类型(即使只匹配到一个结果),直接在模板中引用列表变量就会输出带[]和引号的格式,比如['th6k(gZeJSt4']。
修复方案
方案1:直接取列表第一个元素
修改提取密码的set_fact任务,在正则匹配结果后加[0],直接获取列表中的唯一密码字符串:
- name: 从日志提取root初始密码到mysql_root_old_password变量 set_fact: mysql_root_old_password: "{{ (mysql_root_old_password.content | b64decode | regex_findall('generated for root@localhost: (.*)$', 'multiline=true'))[0] }}"
方案2:用first过滤器(更安全)
如果担心日志中没有匹配到密码的情况,可以用first过滤器结合default,避免报错:
- name: 从日志提取root初始密码到mysql_root_old_password变量 set_fact: mysql_root_old_password: "{{ (mysql_root_old_password.content | b64decode | regex_findall('generated for root@localhost: (.*)$', 'multiline=true')) | first | default('', true) }}"
模板文件调整
确保my.cnf.j2中的password字段直接引用处理后的变量即可:
[client] user=root password={{ mysql_root_old_password }}
为什么之前的修剪任务无效?
你之前的trim password任务是对列表变量执行正则,而不是字符串,所以无法正确提取密码内容。必须先将列表转为单个字符串后再处理,上述方案已经直接解决了这个问题,无需额外修剪步骤。
内容的提问来源于stack exchange,提问作者azgardweb
相关产品推荐
相关产品推荐

