我已经尝试了很多方法来在Ansible中完成此操作,但仍然遇到问题:/
因此,我必须从一个文件中读取凭据(用户名和密码):
文件1 :(目的地:/home/usr/Desktop/file1.txt)
#this is a cred file
number= 8910334
user= xyz #(this maybe username=xyz also)
password= abc
读取文件内容后,我需要根据以下内容,在找到“'”和“密码”的任何地方分隔('=')符号:
用户密钥=用户
用户值= xyz
密码密钥=密码
密码值= abc
file2 :(目标:/home/usr/Desktop/file2.txt)
#Hi, I need credentials
school= spsg
user = #(this value may be blank or may be filled with some other entry or it may be xyz.user.name= )
password= #(this value may be blank or may be filled with some other entry or it may be xyz.password.value= )
现在,在file2中,我希望将user = ________值和密码= __________值替换为从file1中提取的用户值和密码值。 (用户名和密码的行号可能会有所不同,因此请不要将行号分别设置为[1]和[2])
此外,除了file2之外,还有其他一些文件需要file1中的值,因此如果此任务通过循环完成会更好。
请向我建议可能的YAML代码以完成此操作。谢谢:)
答案 0 :(得分:1)
如果文件不是本地fetch,则为它。然后是下面的任务
vars:
file_name: file1.txt
tasks:
- set_fact:
my_vars: "{{ my_vars|default([]) +
[{'key': item, 'value': my_value}] }}"
loop: "{{ lookup('pipe', my_cat).splitlines()|
select('match', my_regex_comment)|
map('regex_replace', my_regex, my_replace)|
map('trim')|
list }}"
vars:
my_regex_comment: '^(?!\s*\#).*$' # filter commented line
my_regex_any_comment: '(\s*\#.*)' # match comment in value
my_regex: '^(.*?)=(.*)$' # match key and value
my_replace: '\1' # replace with key
my_replace_empty: "" # delete
my_cat: "{{ 'cat ' ~ file_name }}"
my_ini: "{{ item ~ ' type=properties file=' ~ file_name }}"
my_value: "{{ lookup('ini', my_ini)|
regex_replace(my_regex_any_comment, my_replace_empty) }}"
- debug:
var: my_vars
给予
my_vars:
- key: number
value: '8910334'
- key: user
value: xyz
- key: password
value: abc
使用template写入文件。例如下面的任务和模板
- template:
src: file2.txt.j2
dest: file2.txt
shell> cat file2.txt.j2
{% for item in my_vars %}
{{ item.key }}={{ item.value }}
{% endfor %}
给予
shell> cat file2.txt
number=8910334
user=xyz
password=abc
下一个选择是使用lineinfile添加或替换循环中的变量
- lineinfile:
path: file2.txt
regex: '^\s*{{ item.key }}\s*=(.*)$'
line: '{{ item.key }}={{ item.value }}'
loop: "{{ my_vars }}"