Записать переменную в файл в Ansible

103

Я извлекаю JSON через модуль URI и хочу записать полученный контент в файл. Я могу получить контент и вывести его в отладчик, поэтому я знаю, что контент был получен, но я не знаю, как лучше всего писать файлы.

Кейт Адлер
источник

Ответы:

201

Вы можете использовать copyмодуль с contentпараметром:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

Документы здесь: модуль копирования

Рамон де ла Фуэнте
источник
5
content = "{{your_json_feed}}" работает с пробелами и новой строкой. Цитаты важны.
m.kocikowski
@RamondelaFuente Если я хочу добавить в файл несколько варов, мне нужно использовать модуль «копировать» несколько раз или есть другой способ?
KishoreReddy
1
@KishoreReddy Я полагаю, вы можете использовать синтаксис jinja2 для добавления переменных. Что-то вроде "{{variable ~ another_variable}}". Не очень красиво, но если ситуация станет более сложной, вы можете использовать template:модуль и заполнить его переменными, зарегистрированными во время выполнения.
Ramon de la Fuente
Это работает лучше, когда вы хотите сгенерировать файл суммы sha256 в форме shahash /path/to/file(обратите внимание на 2 пробела между ними), а затем проверить из командной строки (через sha256sum -c shafile) то, что вы сгенерировали с помощью Ansible.
Daniel Андрей Минкэ
12

Основываясь на ответе Рамона, я столкнулся с ошибкой. Проблема, когда пробелы в JSON, которые я пытался написать, я исправил, изменив задачу в playbook, чтобы она выглядела так:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

На данный момент я не уверен, зачем это было нужно. Я предполагаю, что это как-то связано с тем, как заменяются переменные в Ansible и анализируется полученный файл.

Тобиас Кремер
источник
11

Если вы не пишете файлы очень маленького размера, вам, вероятно, следует использовать шаблоны .

Пример:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Янус Троельсен
источник
2
Хотя ответ Рамона касается именно того, о чем спрашивали, этот ответ в целом является лучшим подходом. Например, если у вас есть playbook, который создает виртуальные машины в облаке, и вы хотите создать инвентарь хостов для другого playbook, шаблон - это то, что вам нужно.
Луис Артола
Вы можете объяснить, почему это лучше?
Vorticity
@ Завихрение лучше чем что?
Янус Троелсен,
@JanusTroelsen Извините, можете ли вы объяснить, почему это лучше, чем принятый ответ при написании больших файлов?
Vorticity
1
@Vorticity, потому что он становится громоздким, когда у вас есть файл, встроенный в другой файл. вам нужно экранирование, и подсветка синтаксиса не сработает. механизм шаблонов позволяет вставлять что-то посередине, если вам это нужно.
Янус Троэльсен,
0

Теперь мы можем напрямую указать целевой файл с destопцией. В приведенном ниже примере выходной файл json сохраняется в/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
Venkata
источник