it-swarm.com.ru

Как создать новый системный сервис от ansible-playbook

Я создал скрипт для запуска/остановки моего приложения. Теперь я хочу добавить его в качестве системной службы Centos. Сначала я создал задачу для создания ссылки из моего скрипта на /etc/init.d/service_name, как показано ниже.

---

- name: create startup link
  file: src={{ cooltoo_service_script }} dest={{ cooltoo_service_init }} state=link

После создания сервиса я хочу добавить его в системный сервис. Для этого используется команда "chkconfig --add service_name". Интересно, есть ли модуль ansible для этого вместо жестко заданной команды в файле ansible-playbook. Я посмотрел на эту страницу http://docs.ansible.com/ansible/service_module.html но он показывает только, как управлять службой, а не создавать новую.

16
Zhao Yi

Модуль 'service' поддерживает аргумент 'enabled'.

Вот пример части сборника, который, как я признаю, выглядит как попытка новичка. Предполагается, что RHEL/CentOS 6.x использует SysV, а не systemd.

  - name: install rhel sysv supervisord init script
    copy: src=etc/rc.d/init.d/supervisord dest=/etc/rc.d/init.d/supervisord owner=root group=root mode=0755

  - name: install rhel sysv supervisord sysconfig
    copy: src=etc/sysconfig/supervisord dest=/etc/sysconfig/supervisord owner=root group=root mode=0640

  - name: enable sysv supervisord service
    service: name=supervisord enabled=yes

  - name: start supervisord
    service: name=supervisord state=started

ВАЖНО Множество пользовательских сценариев инициализации завершатся неудачно с Ansible и SysV init; причина в том, что опция 'status' (статус супервизора службы) должна возвращать LSB-совместимый код возврата. В противном случае Ansible не будет знать, работает ли служба или нет, и идемпотентность не будет работать (перезапуск все равно будет работать, потому что это безоговорочно)

Вот часть скрипта, которую я только что переписал, чтобы использовать функцию «status» в /etc/init.d/functions (этот же шаблон вы заметите в других init-скриптах, предоставленных Red Hat в/etc/init.d /

status)
    /usr/bin/supervisorctl $OPTIONS status
    status -p $PIDFILE supervisord
    # The 'status' option should return one of the LSB-defined return-codes,
    # in particular, return-code 3 should mean that the service is not
    # currently running. This is particularly important for Ansible's 'service'
    # module, as without this behaviour it won't know if a service is up or down.
    RETVAL=$?
    ;;

Ссылка: http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html

Если запрашивается действие статуса, сценарий инициализации вернет следующие коды состояния выхода.

0 программа запущена или служба исправна 1 программа не работает и /var/run файл pid существует 2 программа не работает и файл блокировки/var/lock существует 3 программа не запущена 4 программа или статус службы неизвестен 5-99 зарезервировано для будущего использования LSB 100-149 зарезервировано для использования в распределении 150-199 зарезервировано для применения 200-254 зарезервировано

13
Cameron Kerr

Приведенный ниже фрагмент кода создаст Сервис в CentOS 7.

Код

Задачи

/tasks/main.yml

- name: TeamCity | Create environment file
  template: src=teamcity.env.j2 dest=/etc/sysconfig/teamcity
- name: TeamCity | Create Unit file
  template: src=teamcity.service.j2 dest=/lib/systemd/system/teamcity.service mode=644
  notify:
    - reload systemctl
- name: TeamCity | Start teamcity
  service: name=teamcity.service state=started enabled=yes

Шаблоны

/templates/teamcity.service.j2

[Unit]
Description=JetBrains TeamCity
Requires=network.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/teamcity
ExecStart={{teamcity.installation_path}}/bin/teamcity-server.sh start
ExecStop={{teamcity.installation_path}}/bin/teamcity-server.sh stop
User=teamcity
PIDFile={{teamcity.installation_path}}/teamcity.pid
Environment="TEAMCITY_PID_FILE_PATH={{teamcity.installation_path}}/teamcity.pid"
[Install]
WantedBy=multi-user.target

\ Шаблоны\teamcity.env.j2

TEAMCITY_DATA_PATH="{{ teamcity.data_path }}"

Обработчики

\ Обработчики\main.yml

- name: reload systemctl
  command: systemctl daemon-reload

Ссылка :

30
JosephKumarMichael

Действительно, модуль service управляет только уже зарегистрированными службами, как вы уже поняли. Насколько мне известно, нет модуля для регистрации службы.

Знаете ли вы, что этот шаг можно пропустить с некоторыми изменениями в вашем скрипте init.d? Если скрипт следует этим правилам, вы можете просто использовать модуль service, чтобы включить/запустить службу.

1
udondan

Для RedHat/CentOS 7 (с использованием systemd/systemctl) эквивалент chkconfig --add ${SERVICE_NAME} равен systemctl daemon-reload [ via fedoraproject.org ].

Затем, используя модуль systemd из Ansible 2.2 или выше, вы можете запустить службу с предшествующим systemctl daemon-reload, например, так [ через docs.ansible.com ]:

# Example action to restart service cron on centos, in all cases, also issue daemon-reload to pick up config changes
- systemd:
    state: restarted
    daemon_reload: yes
    name: crond

Исходя из моего опыта, параметр daemon_reload также может использоваться в универсальном модуле service, хотя он не задокументирован и может не работать в несистемных системах:

- service:
    state: restarted
    daemon_reload: yes
    name: crond
0
StockB