Как я могу скопировать многострочную строку в файл с буквенными символами новой строки? - PullRequest
0 голосов
/ 05 апреля 2019

Итак, я знаю, что могу сделать что-то вроде этого:

copy:
  dest: /etc/issue
  content: |
    Hello
    World

Но это не работает:

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 в объявлении переменной.

- 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») должен храниться в двух местах.

Обновление

Я нашел лучший способ сделать это, основываясь на этом посте . Он сохраняет баннер в отдельном файле, а затем использует его для изменения обоих файлов конфигурации. Таким образом, значение хранится только в одном месте. Тем не менее, ответ, данный @larsks, действительно отвечает на вопрос так, как он был задан изначально.

- 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

1 Ответ

1 голос
/ 05 апреля 2019

Вы уже знаете, как указать значение с помощью буквальных символов новой строки;вы делаете это при установке клавиши content в первом примере.Вы можете установить значение переменной таким же образом:

---
- hosts: localhost
  gather_facts: false
  vars:
    mytext: |
      Hello
      World
  tasks:
    - copy:
        dest: ./output.txt
        content: "{{ mytext }}"

Это создаст output.txt с содержимым:

Hello
World

Если вместо этого ваша цель - иметь такой контент...

[org/gnome/login-screen]

banner-message-text = "Hello\nWorld"

... тогда вам не нужны буквальные символы новой строки, вам нужен литерал \n, и в этом случае это будет работать:

---
- 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

Что бырезультат:

[org/gnome/login-screen]
banner-message-text = Hello\nWorld

Если вы хотите, чтобы значение в файле конфигурации указывалось в кавычках, то:

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

Что дает вам:

[org/gnome/login-screen]
banner-message-text = "Hello\nWorld"

Вы также можетесделайте это так:

---
- 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

Вы получите тот же результат, что и в предыдущем примере.

...