{"id":678,"date":"2020-10-18T13:25:11","date_gmt":"2020-10-18T12:25:11","guid":{"rendered":"http:\/\/www.netexpertise.eu\/fr\/?p=678"},"modified":"2022-02-12T09:08:09","modified_gmt":"2022-02-12T08:08:09","slug":"ajout-dun-slave-jenkins-avec-ansible","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html","title":{"rendered":"Enregistrer un Slave Jenkins avec Ansible"},"content":{"rendered":"\n<p>Nous avons vu pr\u00e9c\u00e9demment comment <a href=\"\/fr\/devops\/jenkins\/enregistrement-auto-dun-esclave-jenkins-avec-une-api-rest.html\">ajouter un esclave Jenkins<\/a> en appelant une API REST avec Curl. Automatisons ceci avec <a href=\"\/fr\/category\/devops\/ansible\">Ansible<\/a> pour avoir un nouveau noeud disponible en quelques minutes!<\/p>\n\n\n\n<p>Vous aurez tout d&rsquo;abord besoin d&rsquo;un utilisateur Jenkins et son token associ\u00e9 avec les bons droits. \u00ab\u00a0Agent connect\u00a0\u00bb et \u00ab\u00a0create\u00a0\u00bb devraient suffire. J&rsquo;appellerai cet utilisateur \u00ab\u00a0node\u00a0\u00bb tout simplement. Connectez-vous sur Jenkins avec cet utilisateur et cr\u00e9ez un nouveau token.<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"http:\/\/www.netexpertise.eu\/fr\/wp-content\/uploads\/cropped-columbus.jpg\"><img src=\"\/uploads\/cafe-morning-coffee-drink-drinking-604600.jpg\" alt=\"Slave Jenkins avec Ansible\"\/><\/a><\/figure><\/div>\n\n\n\n<p><br>Les d\u00e9tails du nouveau noeud doivent \u00eatre pass\u00e9s \u00e0 l&rsquo;URL REST. Int\u00e9grons ces param\u00e8tres dans un template Jinja2 comme ceci:<br>&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\"><code>{\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}\n<\/code><\/code><\/pre>\n\n\n\n<p>&nbsp;<br>Adaptez le mod\u00e8le selon vos besoins, si vous souhaitez un agent SSH par exemple.<\/p>\n\n\n\n<p>Les variables qui vont \u00eatre remplac\u00e9es dans le template peuvent \u00eatre d\u00e9finies dans le fichier \u00ab\u00a0default\u00a0\u00bb suivant:<\/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\/\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>jenkins_user se connectera au master et cr\u00e9era le nouveau noeud, en s&rsquo;authentifiant avec le jenkins_token cr\u00e9\u00e9 pr\u00e9c\u00e9demment.<br>jenkins_slave_user est l&rsquo;utilisateur syst\u00e8me qui lancera le service Jenkins sur le node.<\/p>\n\n\n\n<p>Nous pouvons maintenant ajouter une t\u00e2che Ansible \u00e0 notre r\u00f4le. Nous appelons tout d&rsquo;abord l&rsquo;API REST:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: cr\u00e9ation du noeud sur le ma\u00eetre 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\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>J&rsquo;ai ajout\u00e9 le code de retour 400 au cas o\u00f9 le noeud existe d\u00e9j\u00e0 mais vous pouvez l&rsquo;enlever si vous pr\u00e9f\u00e9rez que ca s&rsquo;arr\u00eate dans ce cas. Je le passe en \u00e9chec si l&rsquo;erreur n&rsquo;est pas &lsquo;already exists&rsquo;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: continue au cas o\u00f9 l'agent existe d\u00e9j\u00e0\n  fail:\n  when: &gt;\n          webpage.status == '400'\n          and 'already exists' not in webpage.x_error\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>Le service agent Jenkins a besoin d&rsquo;une cl\u00e9 du master pour d\u00e9marrer. La cl\u00e9 est disponible dans la page de l&rsquo;agent au format XML.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: r\u00e9cup\u00e9ration du contenu de la page de l'agent\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: r\u00e9cup\u00e9ration de la cl\u00e9 contenu dans le xml\n  xml:\n    xmlstring: \"{{slavepage.content}}\"\n    xpath: \/jnlp\/application-desc\/argument\n    content: text\n  register: secretxml\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>La cl\u00e9 sera stock\u00e9e dans le fichier \/etc\/default\/jenkins-slave de l&rsquo;utilisateur syst\u00e8me qui est charg\u00e9 au d\u00e9marrage du service.<br>En voici le 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\"\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>Ajoutez l&rsquo;init script. Nous pouvons maintenant copier ces 2 fichiers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: copie du fichier de param\u00e8tres 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: Copie de l'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\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>Et nous nous assurons que le service est bien d\u00e9marr\u00e9:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">- name: red\u00e9marrage et activation du service jenkins-slave si besoin\n  service:\n    name: jenkins-slave\n    enabled: yes\n    state: restarted\n  when: jenkins_config.changed\n\n- name: d\u00e9marrage et activation du service jenkins-slave\n  service:\n    name: jenkins-slave\n    enabled: yes\n    state: started\n<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>Ces \u00e9tapes sont la base mais vous pouvez faire bien plus comme ajouter la cr\u00e9ation de l&rsquo;utilisateur syst\u00e8me Jenkins, ajouter votre propre autorit\u00e9 de certification si vous \u00eates sur une IP priv\u00e9e, et bien plus.<br><br>Voyez aussi comment <a href=\"\/fr\/devops\/ansible\/rendez-ansible-6x-plus-rapide-avec-ces-3-astuces.html\">acc\u00e9l\u00e9rer Ansible<\/a> et optimiser vos temps de d\u00e9ploiement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons vu pr\u00e9c\u00e9demment comment ajouter un esclave Jenkins en appelant une API REST avec Curl. Automatisons ceci avec Ansible pour avoir un nouveau noeud disponible en quelques minutes! Vous aurez tout d&rsquo;abord besoin d&rsquo;un utilisateur Jenkins et son token associ\u00e9 avec les bons droits. \u00ab\u00a0Agent connect\u00a0\u00bb et \u00ab\u00a0create\u00a0\u00bb devraient suffire. J&rsquo;appellerai cet utilisateur \u00ab\u00a0node\u00a0\u00bb [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[441,442],"tags":[444,443],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Enregistrer un Slave Jenkins avec Ansible<\/title>\n<meta name=\"description\" content=\"Comment enregistrer un slave Jenkins automatiquement avec les playbooks Ansible et les API REST 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\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Enregistrer un Slave Jenkins avec Ansible\" \/>\n<meta property=\"og:description\" content=\"Comment enregistrer un slave Jenkins automatiquement avec les playbooks Ansible et les API REST Jenkins\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-18T12:25:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-12T08:08:09+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\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html\",\"url\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html\",\"name\":\"Netexpertise - Enregistrer un Slave Jenkins avec Ansible\",\"isPartOf\":{\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/#website\"},\"datePublished\":\"2020-10-18T12:25:11+00:00\",\"dateModified\":\"2022-02-12T08:08:09+00:00\",\"author\":{\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632\"},\"description\":\"Comment enregistrer un slave Jenkins automatiquement avec les playbooks Ansible et les API REST Jenkins\",\"breadcrumb\":{\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.netexpertise.eu\/fr\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enregistrer un Slave Jenkins avec Ansible\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/#website\",\"url\":\"http:\/\/www.netexpertise.eu\/fr\/\",\"name\":\"Netexpertise\",\"description\":\"Syst\u00e8mes \/ R\u00e9seaux \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.netexpertise.eu\/fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/#\/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\"},\"sameAs\":[\"http:\/\/www.netexpertise.eu\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Netexpertise - Enregistrer un Slave Jenkins avec Ansible","description":"Comment enregistrer un slave Jenkins automatiquement avec les playbooks Ansible et les API REST 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\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html","og_locale":"fr_FR","og_type":"article","og_title":"Netexpertise - Enregistrer un Slave Jenkins avec Ansible","og_description":"Comment enregistrer un slave Jenkins automatiquement avec les playbooks Ansible et les API REST Jenkins","og_url":"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html","og_site_name":"Netexpertise","article_published_time":"2020-10-18T12:25:11+00:00","article_modified_time":"2022-02-12T08:08:09+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\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html","url":"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html","name":"Netexpertise - Enregistrer un Slave Jenkins avec Ansible","isPartOf":{"@id":"http:\/\/www.netexpertise.eu\/fr\/#website"},"datePublished":"2020-10-18T12:25:11+00:00","dateModified":"2022-02-12T08:08:09+00:00","author":{"@id":"http:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632"},"description":"Comment enregistrer un slave Jenkins automatiquement avec les playbooks Ansible et les API REST Jenkins","breadcrumb":{"@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/ansible\/ajout-dun-slave-jenkins-avec-ansible.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.netexpertise.eu\/fr"},{"@type":"ListItem","position":2,"name":"Enregistrer un Slave Jenkins avec Ansible"}]},{"@type":"WebSite","@id":"http:\/\/www.netexpertise.eu\/fr\/#website","url":"http:\/\/www.netexpertise.eu\/fr\/","name":"Netexpertise","description":"Syst\u00e8mes \/ R\u00e9seaux \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.netexpertise.eu\/fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632","name":"dave","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.netexpertise.eu\/fr\/#\/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"},"sameAs":["http:\/\/www.netexpertise.eu"]}]}},"_links":{"self":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts\/678"}],"collection":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/comments?post=678"}],"version-history":[{"count":0,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts\/678\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/media?parent=678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/categories?post=678"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/tags?post=678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}