如何从文件中读取一行到 ansible 变量中

如何从文件中读取一行到 ansible 变量中

我正在尝试从文件读取远程主机上的数据库密码/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] }}"

相关内容