首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多行字符串复制到包含文字换行符的文件中?

如何将多行字符串复制到包含文字换行符的文件中?
EN

Stack Overflow用户
提问于 2019-04-06 01:56:28
回答 1查看 15.1K关注 0票数 6

所以我知道我可以这样做:

代码语言:javascript
复制
copy:
  dest: /etc/issue
  content: |
    Hello
    World

但这不起作用:

代码语言:javascript
复制
vars:
  login_banner_text: !!str |-
    "Hello\nWorld"
tasks:
  - name: Set TTY login banner
    copy:
      dest: /etc/issue
      content: "{{ login_banner_text }}"

换行符直接打印到文件中,不进行解析,也就是说,它是由\n字符串填充的一行。我希望在不复制文件的情况下完成此操作,因为我需要将此文本复制到两个文件中。

对于一个文件,\n字符串需要保持未解析状态,因此将其作为一行写入文件。另一方面,我希望对\n进行解释,以便将文本展开为多行。

第一个文件正在使用ini_file模块进行修改。使用变量声明中的显式\n,此任务按预期工作。

代码语言:javascript
复制
- name: "Set message"
  ini_file:
    dest: /etc/dconf/db/gdm.d/00-security-settings
    section: org/gnome/login-screen
    option: banner-message-text
    value: string '{{ login_banner_text }}'
    create: yes
    tags:
      - always

但是,其他模块的行为也是如此。

如果我将文件复制到适当的位置,则必须在两个位置维护相当长的文本(而不是"Hello World")。

更新

我发现了一种更好的方法,那就是基于this post。它将标语存储在单独的文件中,然后使用该文件修改两个配置文件。因此,该值仅存储在一个位置。然而,@larsks给出的答案确实回答了最初提出的问题。

代码语言:javascript
复制
- hosts: 127.0.0.1
  connection: local
  vars:
    login_banner_text: "{{ lookup('file', 'login_banner.txt') }}"
  tasks:
    - name: "Set the GNOME3 Login Warning Banner Text"
      ini_file:
        dest: /etc/dconf/db/gdm.d/00-security-settings
        section: org/gnome/login-screen
        option: banner-message-text
        value: '{{ login_banner_text | to_json }}'
        create: yes
      tags:
        - always
    - name: "Set the TTY Login Warning Banner Text"
      copy:
        dest: '/etc/issue'
        content: "{{ '\n' + login_banner_text + '\n' }}"
      tags:
        - always
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-06 02:49:09

您已经知道如何使用文字换行符指定值;在第一个示例中设置content键时就是这样做的。您可以用同样的方法设置变量的值:

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false
  vars:
    mytext: |
      Hello
      World
  tasks:
    - copy:
        dest: ./output.txt
        content: "{{ mytext }}"

这将创建包含以下内容的output.txt

代码语言:javascript
复制
Hello
World

相反,如果你的目标是拥有这样的内容...

代码语言:javascript
复制
[org/gnome/login-screen]

banner-message-text = "Hello\nWorld"

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false
  vars:
    mytext: "Hello\\nWorld"

  tasks:
    - ini_file:
        dest: ./example.ini
        section: org/gnome/login-screen
        option: banner-message-text
        value: "{{ mytext }}"
        create: true

这将导致:

代码语言:javascript
复制
[org/gnome/login-screen]
banner-message-text = Hello\nWorld

如果您想要引用配置文件中的值,那么:

代码语言:javascript
复制
    - ini_file:
        dest: ./example.ini
        section: org/gnome/login-screen
        option: banner-message-text
        value: '"{{ mytext }}"'
        create: true

这让你明白了:

代码语言:javascript
复制
[org/gnome/login-screen]
banner-message-text = "Hello\nWorld"

你也可以这样做:

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false
  vars:
    mytext: |-
      Hello
      World

  tasks:
    - ini_file:
        dest: ./example.ini
        section: org/gnome/login-screen
        option: banner-message-text
        value: '{{ mytext|to_json }}'
        create: true

这将得到与前一个示例相同的输出。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55540994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档