Назад | Перейти на главную страницу

недоступная задача, генерирующая странный синтаксис для файла определения logrotate

Я использую определение доступного logrotate для logrotate в ubuntu 14.04, которое имеет определение, как показано ниже

---

- name: dependencies
  apt: pkg={{item}} state=latest
  with_items:
    - unzip
    - jq

- name: check if already downloaded
  stat: path={{nomad_download_folder}}/{{nomad_archive}}
  register: nomad_archive_stat

- name: download
  get_url: >
    url={{nomad_download}}
    dest={{nomad_download_folder}}
    sha256sum={{nomad_checksum}}
  register: nomad_downloaded
  when: nomad_archive_stat.stat.exists == false

- name: group
  group: >
    name={{nomad_group}}
    state=present
  register: nomad_group_created

# On Nomad schedulers
- name: user
  user: >
    home={{nomad_home}}
    name={{nomad_user}}
    system=yes
    groups={{nomad_group}}
    append=yes
  when: (nomad_group_created | changed) and (nomad_is_server == true)

# On Nomad runners
- name: user
  user: >
    home={{nomad_home}}
    name={{nomad_user}}
    system=yes
    groups={{nomad_group}},docker
    append=yes
  when: (nomad_group_created | changed) and (nomad_is_server == false)

- name: directories
  file: >
    state=directory
    path={{item}}
    owner={{nomad_user}}
    group={{nomad_group}}
  with_items:
    - "{{nomad_home}}"
    - "{{nomad_home}}/bin"
    - "{{nomad_config_dir}}"

- name: check for log directory
  stat: path={{nomad_log_file | dirname}}
  register: nomad_log_directory_stat

- name: create log directory
  file: >
    state=directory
    path={{nomad_log_file | dirname}}
    owner={{nomad_user}}
    group={{nomad_group}}
  when: not nomad_log_directory_stat.stat.exists

- name: touch log file
  file: >
    state=touch
    path={{nomad_log_file}}
    owner={{nomad_user}}
    group={{nomad_group}}
  changed_when: false

- name: install
  unarchive: >
    src={{nomad_download_folder}}/{{nomad_archive}}
    dest={{nomad_home}}/bin
    copy=no
  when: nomad_downloaded | changed

- name: link executable in PATH
  file: >
    state=link
    src={{nomad_home}}/bin/nomad
    dest=/usr/local/bin/nomad

- name: set ownership
  file: >
    state=directory
    path={{nomad_home}}
    owner={{nomad_user}}
    group={{nomad_group}}
    recurse=yes
  when: nomad_downloaded | changed

- name: nomad config file
  template: >
    src=nomad.conf.j2
    dest={{nomad_config_file}}
    owner={{nomad_user}}
    group={{nomad_group}}
    mode=0755
  notify:
    - restart nomad

- name: copy nomad upstart script
  template: >
    src=nomad.upstart.conf.j2
    dest=/etc/init/nomad.conf
    owner={{nomad_user}}
    group={{nomad_group}}
    mode=0755
  notify:
    - restart nomad

- name: rotate log file
  logrotate: name=nomad path={{nomad_log_file}}
  args:
    options:
      - daily
      - missingok
      - rotate 3
      - compress
      - delaycompress
      - copytruncate
      - notifempty

Это приводит к созданию файла со странным синтаксисом, который показан ниже.

sudo cat /etc/logrotate.d/nomad

# Generated by Ansible.
# Local modifications will be overwritten.

/var/log/nomad.log {
  [
  '
  d
  a
  i
  l
  y
  '
  ,

  '
  m
  i
  s
  s
  i
  n
  g
  o
  k
  '
  ,

  '
  r
  o
  t
  a
  t
  e

  3
  '
  ,

  '
  c
  o
  m
  p
  r
  e
  s
  s
  '
  ,

  '
  d
  e
  l
  a
  y
  c
  o
  m
  p
  r
  e
  s
  s
  '
  ,

  '
  c
  o
  p
  y
  t
  r
  u
  n
  c
  a
  t
  e
  '
  ,

  '
  n
  o
  t
  i
  f
  e
  m
  p
  t
  y
  '
  ]
}

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

$sudo ansible --version
ansible 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.4 LTS
Release:    14.04
Codename:   trusty

Если я клонирую этот модуль из github и создаю такую ​​книгу:

- hosts: localhost
  roles:
    - logrotate
  tasks:
    - logrotate: name=myapp path=/tmp/myapp.log
      args:
        options:
          - daily
          - rotate 8
          - postrotate
          - exec script
          - endscript

Он работает нормально, и в результате получается файл конфигурации logrotate, который выглядит так:

# Generated by Ansible.
# Local modifications will be overwritten.
/tmp/myapp.log {
  daily
  rotate 8
  postrotate
  exec script
  endscript
}

Если вы наблюдаете разное поведение при использовании идентичного сценария, не могли бы вы обновить свой вопрос, чтобы указать, какую версию ansible вы используете (и на какой платформе вы его используете)?

Между прочим, синтаксис, который вы используете, немного странный; вы смешиваете устаревший синтаксис key = value с предпочтительным синтаксисом словаря YAML. Это не влияет на работу (сценарий в любом случае работает одинаково), но в целом вы бы написали его так:

- hosts: localhost
  roles:
    - logrotate
  tasks:
    - logrotate:
        name: myapp
        path: /tmp/myapp.log
        options:
          - daily
          - rotate 8
          - postrotate
          - exec script
          - endscript