我正在尝试从文件读取远程主机上的数据库密码/etc/mysql/debian.cnf
。文件格式如下。有没有办法解析该password
字段,以便我可以通过 Ansible 删除 mysql 用户?
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
password = 5unnyv4l3
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = 5unnyv4l3
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
答案1
看起来“slurp”模块可以满足您的要求: https://docs.ansible.com/ansible/latest/modules/slurp_module.html
- name: extract password from file
slurp:
src: /etc/mysql/debian.cnf
register: mypasswordfile
- name: Set User Password
user: name=newUser
password="{{ passwordfile['content'] | b64decode | regex_findall('password = \"(.+)\"') | first }}"
测试并修复后进行编辑。
答案2
如果文件位于 ansible 系统本地,则可以使用ini 查找它将从 ini 样式文件中读取值。如果您的文件位于远程,则可以使用 fetch/slurp 将副本拉取到本地系统。
我猜查找应该是这样的
- debug: msg="Password is {{ lookup('ini', 'password section=client file=my.cnf') }}"
答案3
您可以使用命令或 shell 模块并使用 awk/sed 执行此操作,例如:
- name: get the value in the block on the file
command: >
awk -F ' *= *' '{ if ($1 ~ /^\[/) section=$1;
else if ($1 ~ /^password/ && section ~ /^\[client\]$/ ) print $2 }'
"{{ file_path }}"
register: password_value
在这种情况下,要处理同一行中的注释,您可以这样做
- name: setting the password without comments
set_fact:
password: "{{ password_value.stdout.split('#')[0] }}"