{"id":21221,"date":"2025-10-21T13:35:44","date_gmt":"2025-10-21T19:35:44","guid":{"rendered":"https:\/\/sada.services\/?p=21221"},"modified":"2025-10-27T11:41:38","modified_gmt":"2025-10-27T17:41:38","slug":"ansible-instalacion-semaphore-ubuntu-24-04","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=21221","title":{"rendered":"Ansible: Instalaci\u00f3n Semaphore Ubuntu 24.04"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li>Actualizamos e instalamos dependencias<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>su - root\napt update &amp;&amp; apt upgrade -y &amp;&amp; apt autoremove -y &amp;&amp; apt clean\napt install -y wget tar git\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Instalaci\u00f3n de la BD<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install -y postgresql postgresql-contrib<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verifica que el servicio est\u00e9 activo:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status postgresql<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"888\" height=\"219\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1725.png\" alt=\"\" class=\"wp-image-21222\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1725.png 888w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1725-300x74.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1725-768x189.png 768w\" sizes=\"(max-width: 888px) 100vw, 888px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear usuario y base de datos para Semaphore<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>su - postgres\npsql\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"437\" height=\"156\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1726.png\" alt=\"\" class=\"wp-image-21225\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1726.png 437w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1726-300x107.png 300w\" sizes=\"(max-width: 437px) 100vw, 437px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>crear la base de datos y usuario para Semaphore:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE USER semaphore_user WITH PASSWORD 'user4semaphore';\nCREATE DATABASE semaphore_db OWNER semaphore_user;\nGRANT ALL PRIVILEGES ON DATABASE semaphore_db TO semaphore_user;\n\\q<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"827\" height=\"194\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1727.png\" alt=\"\" class=\"wp-image-21226\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1727.png 827w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1727-300x70.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1727-768x180.png 768w\" sizes=\"(max-width: 827px) 100vw, 827px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Salimos de postgres y root<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>exit\nexit<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"272\" height=\"179\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1728.png\" alt=\"\" class=\"wp-image-21228\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear los directorios para losplybooks y logs de semaphore<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># con usuario cgi\n\nmkdir -p \/home\/cgi\/semaphore\/logs\nmkdir -p \/home\/cgi\/semaphore\/tmp\nchown -R cgi:cgi \/home\/cgi\/semaphore\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configuramos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>semaphore setup<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Descargar la \u00faltima versi\u00f3n de semaphore <\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/semaphoreui\/semaphore\/releases\/\">https:\/\/github.com\/semaphoreui\/semaphore\/releases\/<\/a><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/root\nwget https:\/\/github.com\/semaphoreui\/semaphore\/releases\/download\/v2.16.32\/semaphore_2.16.32_linux_amd64.deb\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Instalamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>dpkg -i semaphore_2.16.32_linux_amd64.deb\nexit<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>como el usuario cgi configuramos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>semaphore setup<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wizzard<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello! You will now be guided through a setup to:\n\n1. Set up configuration for a MySQL\/MariaDB database\n2. Set up a path for your playbooks (auto-created)\n3. Run database Migrations\n4. Set up initial semaphore user &amp; password\n\nWhat database to use:\n   1 - MySQL\n   2 - BoltDB (DEPRECATED!!!)\n   3 - PostgreSQL\n   4 - SQLite\n (default 1): 3\n\ndb Hostname (default 127.0.0.1:5432): \n\ndb User (default root): semaphore_user\n\ndb Password: user4semaphore\n\ndb Name (default semaphore): semaphore_db\n\nPlaybook path (default \/tmp\/semaphore): \/home\/cgi\/semaphore\/tmp\n\nPublic URL (optional, example: https:\/\/example.com\/semaphore): \n\nEnable email alerts? (yes\/no) (default no): \n\nEnable telegram alerts? (yes\/no) (default no): \n\nEnable slack alerts? (yes\/no) (default no): \n\nEnable Rocket.Chat alerts? (yes\/no) (default no): \n\nEnable Microsoft Team Channel alerts? (yes\/no) (default no): yes\n\nMicrosoft Teams Webhook URL: \n\nEnable LDAP authentication? (yes\/no) (default no): \n\nConfig output directory (default \/home\/cgi\/semaphore):\n\n...\n\n&gt; Username: gmatamoros\n &gt; Email: gustavo.matamoros.gonzalez@una.ac.cr\nWARN&#91;0266] no rows in result set                         fields.level=Warn\n &gt; Your name: Gustavo Matamoros Gonz\u00e1lez\n &gt; Password: A2\n\n\nYou are all setup Gustavo Matamoros Gonz\u00e1lez!\n Re-launch this program pointing to the configuration file\n\n.\/semaphore server --config \/home\/cgi\/config.json\n\n To run as daemon:\n\nnohup .\/semaphore server --config \/home\/cgi\/config.json &amp;\n\n You can login with gustavo.matamoros.gonzalez@una.ac.cr or gmatamoros.<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esto crea el archivo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cat cat \/home\/cgi\/semaphore\/config.json<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Contenido<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n \t\"postgres\": {\n \t\t\"host\": \"127.0.0.1:5432\",\n \t\t\"user\": \"semaphore_user\",\n \t\t\"pass\": \"user4semaphore\",\n \t\t\"name\": \"semaphore_db\",\n \t\t\"options\": {\n \t\t\t\"sslmode\": \"disable\"\n \t\t}\n \t},\n \t\"dialect\": \"postgres\",\n \t\"tmp_path\": \"\/home\/cgi\/semaphore\/playbooks\",\n \t\"cookie_hash\": \"58GUP2OjIQ3Tv5PUWcp2mO0Jhyhx4saaq7Xp2\/1\/KWw=\",\n \t\"cookie_encryption\": \"gHB2cyoUOL8kZ7WWhWPJVm64XmQckRMR\/ueq2ZZDe0U=\",\n \t\"access_key_encryption\": \"OgErfTBwj43U3nUua3Hx+MK9IuipEtA\/IuYWgfDJQNs=\",\n \t\"microsoft_teams_alert\": true\n }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora lo probamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>semaphore server --config \/home\/cgi\/semaphore\/config.json<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"212\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1729.png\" alt=\"\" class=\"wp-image-21230\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1729.png 858w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1729-300x74.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1729-768x190.png 768w\" sizes=\"(max-width: 858px) 100vw, 858px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Abrimos el navegador<\/li>\n\n\n\n<li><a href=\"http:\/\/10.0.100.89:3000\/\">http:\/\/10.0.100.89:3000\/<\/a><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"518\" height=\"526\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1730.png\" alt=\"\" class=\"wp-image-21231\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1730.png 518w, https:\/\/sada.services\/wp-content\/uploads\/2025\/10\/Seleccion_1730-295x300.png 295w\" sizes=\"(max-width: 518px) 100vw, 518px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora para crearlo como servicio <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>su - root\nnano \/etc\/systemd\/system\/semaphore.service<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Ansible Semaphore Web UI\nAfter=network.target\n\n&#91;Service]\nUser=cgi\nGroup=cgi\nWorkingDirectory=\/home\/cgi\/semaphore\nExecStart=semaphore server --config \/home\/cgi\/semaphore\/config.json\nEnvironment=PATH=\/usr\/local\/bin:\/usr\/bin:\/bin\nEnvironment=SSH_AUTH_SOCK=\/home\/cgi\/.ssh\/ssh-agent.sock\nRestart=always\nStandardOutput=append:\/home\/cgi\/semaphore\/logs\/semaphore.log\nStandardError=append:\/home\/cgi\/semaphore\/logs\/semaphore.err\n\n&#91;Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Activar el servicio:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl daemon-reload\nsystemctl enable --now semaphore\nsystemctl status semaphore<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>el programa se configuro para tener la carpeta de los temporales en  \/home\/cgi\/semaphore\/tmp <\/li>\n\n\n\n<li>Por tanto debemos programar un cron para borrar esta carpeta <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>crontab -e<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregar el cron que: Limpia archivos con m\u00e1s de 7 d\u00edas, una vez por semana a las 3 a.m.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>0 3 * * 0 find \/home\/cgi\/semaphore\/tmp -type f -mtime +7 -delete<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-21221","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/21221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21221"}],"version-history":[{"count":11,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/21221\/revisions"}],"predecessor-version":[{"id":21328,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/21221\/revisions\/21328"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}