{"id":555,"date":"2022-04-24T18:06:46","date_gmt":"2022-04-24T17:06:46","guid":{"rendered":"https:\/\/www.netexpertise.eu\/es\/?p=555"},"modified":"2022-04-24T18:06:46","modified_gmt":"2022-04-24T17:06:46","slug":"registrar-un-esclavo-de-jenkins-con-ansible","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html","title":{"rendered":"Registrar un Esclavo de Jenkins con Ansible"},"content":{"rendered":"\n<p>Anteriormente vimos c\u00f3mo <a href=\"\/es\/devops\/jenkins\/registrar-un-esclavo-jenkins-con-api-rest.html\">agregar un esclavo Jenkins<\/a> llamando a una API REST con Curl. \u00a1Automaticemos esto con <a href=\"\/es\/category\/devops\/ansible\">Ansible<\/a> para tener un nuevo nodo disponible en minutos!<\/p>\n\n\n\n<p>Primero necesitar\u00e1 un usuario de Jenkins y su token asociado con los permisos correctos. \u00abAgent connect\u00bb y \u00abcreate\u00bb deber\u00edan ser suficientes. Simplemente llamar\u00e9 a este usuario \u00abnode\u00bb. Inicie sesi\u00f3n en Jenkins con este usuario y cree un nuevo token.<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img src=\"\/uploads\/cafe-morning-coffee-drink-drinking-604600.jpg\" alt=\"Esclavo de Jenkins con Ansible\"\/><\/figure><\/div>\n\n\n\n<p><br>Los detalles del nuevo nodo deben pasarse a la URL REST. Incrustemos estos ajustes en una template Jinja2 como esta:<br><br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n   \"name\": \"{{ jenkins_node }}\",\n   \"nodeDescription\": \"slave {{ jenkins_node }}\",\n   \"numExecutors\": \"{{ jenkins_numExecutors }}\",\n   \"remoteFS\": \"{{ jenkins_remoteFS }}\",\n   \"labelString\": \"{{ jenkins_label }}\",\n   \"mode\": \"EXCLUSIVE\",\n   \"\": [\n      \"hudson.slaves.JNLPLauncher\",\n      \"hudson.slaves.RetentionStrategy$Always\"\n   ],\n   \"launcher\": {\n      \"stapler-class\": \"hudson.slaves.JNLPLauncher\",\n      \"$class\": \"hudson.slaves.JNLPLauncher\",\n      \"workDirSettings\": {\n         \"disabled\": true,\n         \"workDirPath\": \"\",\n         \"internalDir\": \"remoting\",\n         \"failIfWorkDirIsMissing\": false\n      },\n      \"tunnel\": \"\",\n      \"vmargs\": \"\"\n   },\n   \"retentionStrategy\": {\n      \"stapler-class\": \"hudson.slaves.RetentionStrategy$Always\",\n      \"$class\": \"hudson.slaves.RetentionStrategy$Always\"\n   },\n   \"nodeProperties\": {\n      \"stapler-class-bag\": \"true\",\n      \"hudson-slaves-EnvironmentVariablesNodeProperty\": {\n         \"env\": [\n            {\n               \"key\": \"JAVA_HOME\",\n               \"value\": \"{{ java_home }}\"\n            }\n         ]\n      },\n      \"_comment:\": {\n         \"hudson-tools-ToolLocationNodeProperty\": {\n           \"locations\": [\n               {\n                  \"key\": \"hudson.model.JDK$DescriptorImpl@JAVA-8\",\n                  \"home\": \"\/usr\/bin\/java\"\n               }\n            ]\n         }\n      }\n   }\n}<\/code><\/pre>\n\n\n\n<p><br>Adapta el modelo seg\u00fan sus necesidades, si quiere un agente SSH por ejemplo.<\/p>\n\n\n\n<p>Las variables que se reemplazar\u00e1n en la template se pueden definir en el siguiente archivo \u00abpredeterminado\u00bb:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">jenkins_slave_user: jenkins-slave\njenkins_token: xxxxxxde2152xxxxxxaa339exxxxxx48d6\njenkins_user: node\njenkins_url: https:\/\/jenkins.domain.lan\njenkins_node: \"{{ansible_hostname}}\"\njenkins_numExecutors: 4\njenkins_remoteFS: \/home\/jenkins-slave\njenkins_label: \"label_1 label_2 label_3\"\njava_home: \/usr\/lib\/jvm\/java-8-openjdk-amd64\/<\/code><\/pre>\n\n\n\n<p><br>jenkins_user se conectar\u00e1 al maestro y crear\u00e1 el nuevo nodo, autentic\u00e1ndose con el jenkins_token creado anteriormente.<br>jenkins_slave_user es el usuario sistema que iniciar\u00e1 el servicio de Jenkins en el nodo.<\/p>\n\n\n\n<p>Ahora podemos agregar una tarea de Ansible a nuestro rol. Primero llamamos a la API REST:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: crear el nodo en el maestro Jenkins\n  uri:\n    url: \"{{jenkins_url}}\/computer\/doCreateItem?name={{ jenkins_node }}&amp;type=hudson.slaves.DumbSlave\"\n    method: POST\n    body_format: form-urlencoded\n    force_basic_auth: yes\n    user: \"{{ jenkins_user }}\"\n    password: \"{{jenkins_token }}\"\n    body: \"json={{ lookup('template', 'node.json.j2', convert_data=False) }}\"\n    return_content: yes\n    status_code: 200, 302, 400\n  register: webpage<\/code><\/pre>\n\n\n\n<p><br>Agregu\u00e9 el c\u00f3digo de retorno 400 en caso de que el nodo ya exista, pero puede eliminarlo si prefiere que se detenga en este caso. Lo paso fail si el error no es &#8216;ya existe&#8217;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: continuar en caso de que el agente ya exista\n  fail:\n  when: >\n          webpage.status == '400'\n          and 'already exists' not in webpage.x_error<\/code><\/pre>\n\n\n\n<p><br>El servicio agente de Jenkins necesita una clave del maestro para comenzar. La clave est\u00e1 disponible en la p\u00e1gina del agente en formato XML.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: recuperar el contenido de la p\u00e1gina del agente\n  uri:\n    url: \"{{jenkins_url}}\/computer\/{{jenkins_node}}\/slave-agent.jnlp\"\n    method: POST\n    body_format: form-urlencoded\n    force_basic_auth: yes\n    user: \"{{ jenkins_user }}\"\n    password: \"{{ jenkins_token }}\"\n    return_content: yes\n    status_code: 200\n  register: slavepage\n\n- name: recuperar la clave contenida en el xml\n  xml:\n    xmlstring: \"{{slavepage.content}}\"\n    xpath: \/jnlp\/application-desc\/argument\n    content: text\n  register: secretxml<\/code><\/pre>\n\n\n\n<p><br>La clave se almacenar\u00e1 en el archivo \/etc\/default\/jenkins-slave del usuario sistema que se carga cuando se inicia el servicio.<br>Aqu\u00ed est\u00e1 la template:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">JENKINS_USER=\"jenkins-slave\"\nJENKINS_WORKDIR=$(eval echo \"~$JENKINS_USER\")\nJENKINS_URL={{ jenkins_url }}\nJENKINS_NODENAME=$(hostname)\nJENKINS_SECRET={{ jenkins_secret }}\nJAVA_ARGS=\"-Xmx6g\"<\/code><\/pre>\n\n\n\n<p><br>Agregue el script de inicio. Ahora podemos copiar estos 2 archivos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: copiar el archivo de configuraci\u00f3n de jenkins-slave\n  template:\n    src: jenkins-slave-default.j2\n    dest: \/etc\/default\/jenkins-slave\n    owner: jenkins-slave\n    group: jenkins-slave\n    mode: 0600\n  vars:\n    jenkins_secret: \"{{secretxml.matches[0].argument}}\"\n  register: jenkins_config\n\n- name: Copiar el init script jenkins-slave\n  copy:\n    src: jenkins-slave-init\n    dest: \/etc\/init.d\/jenkins-slave\n    owner: root\n    group: root\n    mode: 0755<\/code><\/pre>\n\n\n\n<p><br>Y nos aseguramos de que el servicio se inicie correctamente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: reiniciar y activar el servicio jenkins-slave si es necesario\n  service:\n    name: jenkins-slave\n    enabled: yes\n    state: restarted\n  when: jenkins_config.changed\n\n- name: iniciar y activar el servicio jenkins-slave\n  service:\n    name: jenkins-slave\n    enabled: yes\n    state: started<\/code><\/pre>\n\n\n\n<p><br>Estos pasos son los b\u00e1sicos, pero puede hacer mucho m\u00e1s, como agregar la creaci\u00f3n de usuario sistema Jenkins, agregar su propia CA si tiene una IP privada y mucho m\u00e1s.<\/p>\n\n\n\n<p>Vea tambi\u00e9n c\u00f3mo <a href=\"\/es\/devops\/ansible\/ansible-6x-mas-rapido-con-estos-3-consejos.html\">acelerar Ansible<\/a> y optimizar sus tiempos de implementaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anteriormente vimos c\u00f3mo agregar un esclavo Jenkins llamando a una API REST con Curl. \u00a1Automaticemos esto con Ansible para tener un nuevo nodo disponible en minutos! Primero necesitar\u00e1 un usuario de Jenkins y su token asociado con los permisos correctos. \u00abAgent connect\u00bb y \u00abcreate\u00bb deber\u00edan ser suficientes. Simplemente llamar\u00e9 a este usuario \u00abnode\u00bb. Inicie sesi\u00f3n [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[63,62,64],"tags":[67,115],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Registrar un Esclavo de Jenkins con Ansible<\/title>\n<meta name=\"description\" content=\"C\u00f3mo registrar un esclavo de Jenkins autom\u00e1ticamente con los playbooks de Ansible y las API REST de Jenkins\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Registrar un Esclavo de Jenkins con Ansible\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo registrar un esclavo de Jenkins autom\u00e1ticamente con los playbooks de Ansible y las API REST de Jenkins\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-24T17:06:46+00:00\" \/>\n<meta name=\"author\" content=\"dave\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@netexpertise\" \/>\n<meta name=\"twitter:site\" content=\"@netexpertise\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html\",\"url\":\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html\",\"name\":\"Netexpertise - Registrar un Esclavo de Jenkins con Ansible\",\"isPartOf\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#website\"},\"datePublished\":\"2022-04-24T17:06:46+00:00\",\"dateModified\":\"2022-04-24T17:06:46+00:00\",\"author\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf\"},\"description\":\"C\u00f3mo registrar un esclavo de Jenkins autom\u00e1ticamente con los playbooks de Ansible y las API REST de Jenkins\",\"breadcrumb\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"http:\/\/www.netexpertise.eu\/es\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Registrar un Esclavo de Jenkins con Ansible\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#website\",\"url\":\"http:\/\/www.netexpertise.eu\/es\/\",\"name\":\"Netexpertise\",\"description\":\"Sistemas \/ Redes \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.netexpertise.eu\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"caption\":\"dave\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Netexpertise - Registrar un Esclavo de Jenkins con Ansible","description":"C\u00f3mo registrar un esclavo de Jenkins autom\u00e1ticamente con los playbooks de Ansible y las API REST de Jenkins","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html","og_locale":"es_ES","og_type":"article","og_title":"Netexpertise - Registrar un Esclavo de Jenkins con Ansible","og_description":"C\u00f3mo registrar un esclavo de Jenkins autom\u00e1ticamente con los playbooks de Ansible y las API REST de Jenkins","og_url":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html","og_site_name":"Netexpertise","article_published_time":"2022-04-24T17:06:46+00:00","author":"dave","twitter_card":"summary_large_image","twitter_creator":"@netexpertise","twitter_site":"@netexpertise","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html","url":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html","name":"Netexpertise - Registrar un Esclavo de Jenkins con Ansible","isPartOf":{"@id":"http:\/\/www.netexpertise.eu\/es\/#website"},"datePublished":"2022-04-24T17:06:46+00:00","dateModified":"2022-04-24T17:06:46+00:00","author":{"@id":"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf"},"description":"C\u00f3mo registrar un esclavo de Jenkins autom\u00e1ticamente con los playbooks de Ansible y las API REST de Jenkins","breadcrumb":{"@id":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.netexpertise.eu\/es\/devops\/ansible\/registrar-un-esclavo-de-jenkins-con-ansible.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"http:\/\/www.netexpertise.eu\/es"},{"@type":"ListItem","position":2,"name":"Registrar un Esclavo de Jenkins con Ansible"}]},{"@type":"WebSite","@id":"http:\/\/www.netexpertise.eu\/es\/#website","url":"http:\/\/www.netexpertise.eu\/es\/","name":"Netexpertise","description":"Sistemas \/ Redes \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.netexpertise.eu\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Person","@id":"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf","name":"dave","image":{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/image\/","url":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","caption":"dave"}}]}},"_links":{"self":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/555"}],"collection":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/comments?post=555"}],"version-history":[{"count":8,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/555\/revisions"}],"predecessor-version":[{"id":576,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/555\/revisions\/576"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/media?parent=555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/categories?post=555"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/tags?post=555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}