Ansible:根据条件将值从一个文件复制到另一个文件

时间:2020-06-28 13:22:46

标签: loops split ansible

我已经尝试了很多方法来在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代码以完成此操作。谢谢:)

1 个答案:

答案 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 }}"