index.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. <!DOCTYPE html>
  2. <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
  3. <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <link rel="shortcut icon" href="../../../img/favicon.ico">
  9. <title>Automatisation - Les Tutoriels du Yojik</title>
  10. <link rel="stylesheet" href="../../../css/theme.css" />
  11. <link rel="stylesheet" href="../../../css/theme_extra.css" />
  12. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" />
  13. <script>
  14. // Current page data
  15. var mkdocs_page_name = "Automatisation";
  16. var mkdocs_page_input_path = "Tutoriels/tutoraspi/Automatisation.md";
  17. var mkdocs_page_url = null;
  18. </script>
  19. <script src="../../../js/jquery-2.1.1.min.js" defer></script>
  20. <script src="../../../js/modernizr-2.8.3.min.js" defer></script>
  21. <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
  22. <script>hljs.initHighlightingOnLoad();</script>
  23. </head>
  24. <body class="wy-body-for-nav" role="document">
  25. <div class="wy-grid-for-nav">
  26. <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
  27. <div class="wy-side-scroll">
  28. <div class="wy-side-nav-search">
  29. <a href="../../.." class="icon icon-home"> Les Tutoriels du Yojik</a>
  30. <div role="search">
  31. <form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
  32. <input type="text" name="q" placeholder="Search docs" title="Type search term here" />
  33. </form>
  34. </div>
  35. </div>
  36. <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
  37. <p class="caption"><span class="caption-text">Home</span></p>
  38. <ul>
  39. <li class="toctree-l1"><a class="reference internal" href="../../..">Page d'accueil</a>
  40. </li>
  41. </ul>
  42. <p class="caption"><span class="caption-text">Tutoriels</span></p>
  43. <ul>
  44. <li class="toctree-l1"><a class="reference internal" href="../../tutos/">Introduction</a>
  45. </li>
  46. <li class="toctree-l1"><a class="reference internal" href="#">Installation d'un serveur sécurisé, version Debian/Stretch (obsolète)</a>
  47. <ul>
  48. <li class="toctree-l2"><a class="reference internal" href="../../tutostretch/tutostretch/">Présentation</a>
  49. </li>
  50. <li class="toctree-l2"><a class="reference internal" href="#">Installation</a>
  51. <ul>
  52. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-de-base/">Installation du système de base</a>
  53. </li>
  54. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/ovh/">Démarrage sur serveur OVH</a>
  55. </li>
  56. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Premi%C3%A8re-Etape-S%C3%A9curisation/">Première étapes de sécurisation du serveur</a>
  57. </li>
  58. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Configuration-R%C3%A9seau/">Configuration du réseau</a>
  59. </li>
  60. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Serveur-Temps/">Installation d'un serveur de temps</a>
  61. </li>
  62. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Parre-Feu/">Installation d'un pare-feu</a>
  63. </li>
  64. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Fail2ban/">Contrer les attaques de brute-force avec fail2ban</a>
  65. </li>
  66. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Serveur-Courrier-Basique/">Installation d'un serveur de courrier basique</a>
  67. </li>
  68. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Serveur-DNS/">Installation du serveur DNS</a>
  69. </li>
  70. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Serveur-Web/">Installation d'un serveur web</a>
  71. </li>
  72. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Dovecot-Authentification/">Installation de dovecot et de l'authentification</a>
  73. </li>
  74. <li class="toctree-l3"><a class="" href="../../tutostretch/Installation-Certificats-Letsencrypt.md)">Installation des certificats letsencrypt</a>
  75. </li>
  76. <li class="toctree-l3"><a class="" href="../../tutostretch/courrier-SPF-DKIM-OPENDMARC.md">Ajout des enregistrements **spf**, **DKIM**, **DMARC** au fichier de zone DNS</a>
  77. </li>
  78. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Courrier-Comptes-Virtuels/">Ajout des comptes émail virtuels</a>
  79. </li>
  80. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Surveillance-Serveur/">Installation de programmes de surveillance du serveur</a>
  81. </li>
  82. <li class="toctree-l3"><a class="reference internal" href="../../tutostretch/Installation-Webmail/">Installation d'un webmail (rainloop)</a>
  83. </li>
  84. <li class="toctree-l3"><a class="" href="../../tutostretch/Sécurisation-Serveur-Web">Sécurisation d'un serveur WEB</a>
  85. </li>
  86. </ul>
  87. </li>
  88. </ul>
  89. </li>
  90. <li class="toctree-l1"><a class="reference internal" href="#">Installation d'un serveur sécurisé, version Debian/Buster (en cours d'écriture)</a>
  91. <ul>
  92. <li class="toctree-l2"><a class="reference internal" href="../../tutobuster/1-tutobuster/">Présentation</a>
  93. </li>
  94. <li class="toctree-l2"><a class="reference internal" href="../../tutobuster/2-Installation-de-base/">Installation de base</a>
  95. </li>
  96. <li class="toctree-l2"><a class="reference internal" href="../../tutobuster/3-ovh/">Démarrage sur serveur OVH</a>
  97. </li>
  98. <li class="toctree-l2"><a class="reference internal" href="../../tutobuster/4-Plan/">Plan d'ensemble</a>
  99. </li>
  100. <li class="toctree-l2"><a class="reference internal" href="../../tutobuster/5-Premi%C3%A8re-Etape-S%C3%A9curisation/">Premières étapes de sécurisation du serveur</a>
  101. </li>
  102. </ul>
  103. </li>
  104. <li class="toctree-l1"><a class="reference internal" href="#">Installation d'un serveur sécurisé, version Debian/Buster sur RaspberryPI</a>
  105. <ul>
  106. <li class="toctree-l2"><a class="reference internal" href="../R%C3%A9sum%C3%A9/">Résumé</a>
  107. </li>
  108. <li class="toctree-l2"><a class="reference internal" href="../tutoraspi/">Présentation</a>
  109. </li>
  110. <li class="toctree-l2"><a class="reference internal" href="../Installation-de-base/">Installation de base</a>
  111. </li>
  112. <li class="toctree-l2"><a class="reference internal" href="../Premier-d%C3%A9marrage/">Premier démarrage</a>
  113. </li>
  114. <li class="toctree-l2"><a class="reference internal" href="../Etat-des-lieux/">État des lieux</a>
  115. </li>
  116. <li class="toctree-l2"><a class="reference internal" href="../S%C3%A9curisation-SSH/">Sécurisation SSH</a>
  117. </li>
  118. <li class="toctree-l2"><a class="reference internal" href="../R%C3%A9seau/">Réseau (des IPs fixes)</a>
  119. </li>
  120. <li class="toctree-l2"><a class="reference internal" href="../Knot/">Installation de Knot-resolver</a>
  121. </li>
  122. <li class="toctree-l2"><a class="reference internal" href="../Firewall/">Installation d'un pare-feux</a>
  123. </li>
  124. <li class="toctree-l2"><a class="reference internal" href="../Fail2ban/">Contrer les attaques de force brute</a>
  125. </li>
  126. <li class="toctree-l2"><a class="reference internal" href="../Logwatch/">Surveillance du serveur</a>
  127. </li>
  128. <li class="toctree-l2"><a class="reference internal" href="../Installation-courrier-basique/">Installation d'un serveur de courriers basique</a>
  129. </li>
  130. <li class="toctree-l2"><a class="reference internal" href="../Exemple-d-utilisation-serveur-Web/">Exemple d'utilisation avec un serveur Web</a>
  131. </li>
  132. <li class="toctree-l2"><a class="reference internal" href="../Annexe/">Annexe</a>
  133. </li>
  134. </ul>
  135. </li>
  136. <li class="toctree-l1"><a class="reference internal" href="#">Domotique</a>
  137. <ul>
  138. <li class="toctree-l2"><a class="reference internal" href="../../Domotique/Introduction/">Introduction</a>
  139. </li>
  140. <li class="toctree-l2"><a class="reference internal" href="../../Domotique/Le-mat%C3%A9riel/">Le matériel</a>
  141. </li>
  142. </ul>
  143. </li>
  144. <li class="toctree-l1"><a class="reference internal" href="#">Tutoriel Anki</a>
  145. <ul>
  146. <li class="toctree-l2"><a class="reference internal" href="../../tutoanki/Introduction/">Introduction</a>
  147. </li>
  148. <li class="toctree-l2"><a class="reference internal" href="../../tutoanki/Installation/">Installation</a>
  149. </li>
  150. <li class="toctree-l2"><a class="reference internal" href="../../tutoanki/Les-fiches/">Les fiches</a>
  151. </li>
  152. <li class="toctree-l2"><a class="reference internal" href="../../tutoanki/Premi%C3%A8re-utilisation/">Premières utilisations et impressions</a>
  153. </li>
  154. <li class="toctree-l2"><a class="reference internal" href="../../tutoanki/Personnalisation/">Personnalisation</a>
  155. </li>
  156. <li class="toctree-l2"><a class="reference internal" href="../../tutoanki/Cartes/">Les cartes</a>
  157. </li>
  158. </ul>
  159. </li>
  160. </ul>
  161. </div>
  162. </div>
  163. </nav>
  164. <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
  165. <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
  166. <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
  167. <a href="../../..">Les Tutoriels du Yojik</a>
  168. </nav>
  169. <div class="wy-nav-content">
  170. <div class="rst-content">
  171. <div role="navigation" aria-label="breadcrumbs navigation">
  172. <ul class="wy-breadcrumbs">
  173. <li><a href="../../..">Docs</a> &raquo;</li>
  174. <li>Automatisation</li>
  175. <li class="wy-breadcrumbs-aside">
  176. </li>
  177. </ul>
  178. <hr/>
  179. </div>
  180. <div role="main">
  181. <div class="section">
  182. <h1 id="automatisation">Automatisation</h1>
  183. <p>jeton smartthings: f9f05f67-0e9c-4c99-883e-5cf249eaa2a2</p>
  184. <p>Maintenant que nous avons fait toutes ces manipulations à la main, nous allons pouvoir automatiser la configuration de notre raspi d'une façon automatique avec <strong>ansible</strong>.</p>
  185. <p>En fait, le but est de pouvoir déployer notre serveur en un minimum de temps. Nous ajouterons une partie variable, appelée les <strong>facts</strong>, ce qui nous permettra d'installer différents serveurs avec des options différentes ainsi que des services parfois dictintcs.</p>
  186. <p>Nous allons reprendre toutes les étapes et les <strong>scripter</strong> dans un <strong>playbook ansible</strong>.</p>
  187. <h2 id="principe">Principe</h2>
  188. <h3 id="creation-dun-utilisateur-dedie-sur-le-poste-client">Création d'un utilisateur dédié sur le poste client</h3>
  189. <p>Il est parfaitement possible d'utiliser un <strong>role</strong> ansible tout prêt de création d'un nouvel utilisateur sur notre poste client, mais pour ça, il faut que <strong>ansible</strong> soit déjà installé.</p>
  190. <p>Nous allons donc créer un utilisateur <strong>deborah</strong> de façon classique avec la commande adduser:</p>
  191. <pre><code>eric@aldebaran:~$ sudo adduser deborah
  192. [sudo] Mot de passe de eric :
  193. Ajout de l'utilisateur « deborah » ...
  194. Ajout du nouveau groupe « deborah » (1002) ...
  195. Ajout du nouvel utilisateur « deborah » (1002) avec le groupe « deborah » ...
  196. Création du répertoire personnel « /home/deborah »...
  197. Copie des fichiers depuis « /etc/skel »...
  198. Nouveau mot de passe :
  199. Retapez le nouveau mot de passe :
  200. passwd: password updated successfully
  201. Changing the user information for deborah
  202. Enter the new value, or press ENTER for the default
  203. Full Name []: Déborah
  204. Room Number []:
  205. Work Phone []:
  206. Home Phone []:
  207. Other []:
  208. chfn: name with non-ASCII characters: 'Déborah'
  209. Cette information est-elle correcte ? [O/n]
  210. eric@aldebaran:~$
  211. </code></pre>
  212. <h3 id="installation-de-ansible-sur-le-compte-du-nouvel-utilisateur">Installation de <strong>ansible</strong> sur le compte du nouvel utilisateur</h3>
  213. <p>Nous allons assumer que <strong>python</strong> est déjà installé, ce qui est le cas pour une installation desktop Debian normale.</p>
  214. <p>Passons à l'utilisateur <strong>deborah</strong> juste créé:</p>
  215. <pre><code>eric@aldebaran:~$ su - deborah
  216. Mot de passe :
  217. deborah@aldebaran:~$
  218. </code></pre>
  219. <ul>
  220. <li>
  221. <p>vérification de notre installation python</p>
  222. <p>deborah@aldebaran:~$ python3 --version
  223. Python 3.9.1
  224. deborah@aldebaran:~$</p>
  225. </li>
  226. <li>
  227. <p>installation de ansible</p>
  228. </li>
  229. </ul>
  230. <p>Nous installons ansible avec <strong>pip3</strong>; nous aurions pu utiliser la paquet ansible tout prêt, mais il n'aurait pas été aussi à jour. Une autre solution aurait été d'utiliser <strong>virtualenv</strong>. Je rajouterai éventuellement un paragraphe pour expliquer le fonctionnement de virtualenv.</p>
  231. <p><strong>ansible</strong> ainsi que les autres binaires sont installés dans le répertoire utilisateur <strong>~/.local/bin</strong>. Ce chemin est déjà programmé dans le fichier <strong>.profile</strong> et pour que ce chemin soit pris en compte, il suffit de "<strong>sourcer</strong>" le fichier <strong>.profile</strong></p>
  232. <pre><code>deborah@aldebaran:~$ source .profile
  233. </code></pre>
  234. <p>Le résultat est le suivant:</p>
  235. <pre><code>deborah@aldebaran:~$ ansible --version
  236. ansible 2.10.4
  237. config file = /etc/ansible/ansible.cfg
  238. configured module search path = ['/home/deborah/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  239. ansible python module location = /home/deborah/.local/lib/python3.9/site-packages/ansible
  240. executable location = /home/deborah/.local/bin/ansible
  241. python version = 3.9.1 (default, Dec 8 2020, 07:51:42) [GCC 10.2.0]
  242. deborah@aldebaran:~$
  243. </code></pre>
  244. <p>Voilà, <strong>ansible</strong> est installé, en version 2.10.4.</p>
  245. <h3 id="configuration-ssh">Configuration <strong>ssh</strong></h3>
  246. <p>Nous allons suivre la méthode décrite dans un chapitre précédent:</p>
  247. <pre><code>deborah@aldebaran:~$ ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/piras_ed25519 -C "eric@yojik.eu"
  248. ...
  249. deborah@aldebaran:~$
  250. </code></pre>
  251. <h3 id="recuperation-adresse-ip">Récupération adresse IP</h3>
  252. <p>L'adresse ip par défaut est attribuée par le serveur dhcp de notre box, et donc, est sujet à variation suivant le nombre des autres dispositifs connectés.</p>
  253. <p>Même méthode que précédemment avec nmap:</p>
  254. <ul>
  255. <li>
  256. <p>L'adresse dynamique récupérée est : 192.168.111.33</p>
  257. </li>
  258. <li>
  259. <p>L'utilisateur (avec droits sudo) est par défaut: pi</p>
  260. </li>
  261. <li>
  262. <p>Le mot de passe par défaut est : raspberry</p>
  263. </li>
  264. </ul>
  265. <h3 id="copie-de-notre-clef-publique-sur-le-raspi-et-connexion">Copie de notre clef publique sur le raspi et connexion</h3>
  266. <pre><code>deborah@aldebaran:~$ ssh-copy-id -i ~/.ssh/piras_ed25519.pub pi@192.168.111.33
  267. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/deborah/.ssh/piras_ed25519.pub"
  268. The authenticity of host '192.168.111.33 (192.168.111.33)' can't be established.
  269. ECDSA key fingerprint is SHA256:JA3Eb2suh7qz7iwkoKL0yzbO698fj3EF4/vrhW7LTds.
  270. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
  271. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  272. /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
  273. pi@192.168.111.33's password:
  274. Number of key(s) added: 1
  275. Now try logging into the machine, with: "ssh 'pi@192.168.111.33'"
  276. and check to make sure that only the key(s) you wanted were added.
  277. deborah@aldebaran:~$
  278. </code></pre>
  279. <p>Connexion:</p>
  280. <pre><code>deborah@aldebaran:~$ ssh -i ./.ssh/piras_ed25519 pi@192.168.111.33
  281. Enter passphrase for key './.ssh/piras_ed25519':
  282. Linux raspberrypi 5.4.51+ #1333 Mon Aug 10 16:38:02 BST 2020 armv6l
  283. The programs included with the Debian GNU/Linux system are free software;
  284. the exact distribution terms for each program are described in the
  285. individual files in /usr/share/doc/*/copyright.
  286. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  287. permitted by applicable law.
  288. Last login: Sun Dec 27 17:31:01 2020 from 192.168.111.150
  289. pi@raspberrypi:~ $
  290. </code></pre>
  291. <p>Tout fonctionne.</p>
  292. <h3 id="lancement-de-raspi-config">Lancement de raspi-config</h3>
  293. <p>Configurez votre raspi avec la commande:</p>
  294. <pre><code>sudo raspi-config
  295. </code></pre>
  296. <p>Retaillez la partition root pour occuper toute la place disponible. Changez les locales ainsi que le mappage clavier. (pas très butile si vous ne vous connectez pas directement sur le raspi avec un clavier, mais bon, faites-le par précaution si vous devez vous connecter un jour directement)</p>
  297. <h3 id="changement-du-mot-de-passe">Changement du mot de passe</h3>
  298. <p>Après avoir généré un mot de passe aléatoire avec pwgen, tapez la commande suivante (il était aussi possible de le changer avec l'utilitaire <strong>raspi-config</strong> vu au paragraphe précédent):</p>
  299. <pre><code>pi@raspberrypi:~ $ passwd
  300. Changement du mot de passe pour pi.
  301. Current password:
  302. Nouveau mot de passe :
  303. Retapez le nouveau mot de passe :
  304. passwd: password updated successfully
  305. pi@raspberrypi:~ $
  306. </code></pre>
  307. <p>Le reste se fera avec <strong>ansible</strong>. On sort avec "Ctrl D".</p>
  308. <h3 id="nos-serveurs">Nos serveurs</h3>
  309. <p>L'identité de nos serveurs comme les caractéristiques de connexion, port SSH, adresse IP sont conservées dans un fichier inventaire appelé <strong>inventory</strong> dans le jargon ansible.</p>
  310. <p>Il peut porter n'importe quel nom mais habituellement il est appelé <strong>inventory</strong>.</p>
  311. <ul>
  312. <li>
  313. <p>Création de la structure de répertoires/fichiers</p>
  314. <p>Nous allons aussi respecter la structure conseillée des répertoires de déploiement des playbooks ansible. Pour cela nous allons utiliser <strong>ansible-galaxy</strong> avec la commande suivante:</p>
  315. <pre><code>deborah@aldebaran:~$ ansible-galaxy init piras
  316. - Role piras was created successfully
  317. deborah@aldebaran:~$
  318. </code></pre>
  319. <p>La structure de répertoires a été créée pour nous.</p>
  320. <pre><code>deborah@aldebaran:~$ tree piras
  321. piras
  322. ├── defaults
  323. │   └── main.yml
  324. ├── files
  325. ├── handlers
  326. │   └── main.yml
  327. ├── meta
  328. │   └── main.yml
  329. ├── README.md
  330. ├── tasks
  331. │   └── main.yml
  332. ├── templates
  333. ├── tests
  334. │   ├── inventory
  335. │   └── test.yml
  336. └── vars
  337. └── main.yml
  338. 8 directories, 8 files
  339. deborah@aldebaran:~$
  340. </code></pre>
  341. <p>Les actions à accomplir sont saisies dans des fichiers au format YAML. Le fichier inventaire qui contient les machines à configurer, les <strong>hosts</strong> peut être en format YAML ou INI (format des fichiers de configuration Windows).</p>
  342. </li>
  343. <li>
  344. <p>Création du fichier inventaire</p>
  345. <p>2 formats pour ça:</p>
  346. <ol>
  347. <li>
  348. <p>Format INI</p>
  349. <pre><code>[vps]
  350. ns1 ansible_port=22 ansible_host=ns1.yojik.eu
  351. ns2 ansible_port=22 ansible_host=ns2.yojik.eu
  352. [home]
  353. piras ansible_port=22 ansible_host=piras.yojik.net ansible_user=pi ansible_ssh_private_key_file=.ssh/piras_ed25519
  354. </code></pre>
  355. </li>
  356. <li>
  357. <p>Format YAML</p>
  358. <pre><code> ---
  359. # my hosts
  360. all:
  361. hosts:
  362. ns1:
  363. ansible_host: ns1.yojik.eu
  364. ns2:
  365. ansible_host: ns2.yojik.eu
  366. piras:
  367. ansible_host: piras.yojik.net
  368. ansible_user: pi
  369. ansible_ssh_private_key_file: .ssh/piras_ed25519
  370. ...
  371. </code></pre>
  372. <p>3 hosts sont configurés dans ce fichier inventaire: <strong>ns1</strong> et <strong>ns2</strong> sont deux VPS loués chez OVH qui servent de serveurs DNS. Et <strong>piras</strong> qui est l'objet de ce tutoriel.</p>
  373. <p>Vous noterez que j'ai mis les noms des machines (<strong>fqdn</strong>) et qu'il faut bien sûr renseigner les IPs de ces machines, soit dans le fichier <strong>/etc/hosts</strong> soit dans les zones du serveur DNS.</p>
  374. </li>
  375. </ol>
  376. </li>
  377. <li>
  378. <p>Test avec commandes ad-hoc</p>
  379. <p>On va envoyer une commande <strong>ping</strong> au raspi:</p>
  380. <pre><code>deborah@aldebaran:~$ ansible -i inventory piras -m ping
  381. Enter passphrase for key '.ssh/piras_ed25519':
  382. piras | SUCCESS =&gt; {
  383. "ansible_facts": {
  384. "discovered_interpreter_python": "/usr/bin/python"
  385. },
  386. "changed": false,
  387. "ping": "pong"
  388. }
  389. deborah@aldebaran:~$
  390. </code></pre>
  391. <p>Ca marche ;)</p>
  392. <p>On va envoyer une commande <strong>echo</strong> au raspi:</p>
  393. <pre><code>deborah@aldebaran:~$ ansible piras -i inventory -m command -a "echo 'salut'"
  394. Enter passphrase for key '.ssh/piras_ed25519':
  395. piras | CHANGED | rc=0 &gt;&gt;
  396. salut
  397. deborah@aldebaran:~$
  398. </code></pre>
  399. <p>Ca fonctionne.</p>
  400. </li>
  401. <li>
  402. <p>Test avec playbook</p>
  403. <p>Les playbook(s) sont des fichiers au format YAML qui décrivent les actions à accomplir. Varibales, boucles, tests sont disponibles pour assurer les fonctions nécessaires.</p>
  404. <ol>
  405. <li>
  406. <p>Exemple de playbook (nom: piras.yml)</p>
  407. <pre><code>-
  408. name: play-1
  409. hosts: piras
  410. tasks:
  411. - name: test de la connectivité
  412. action: ping
  413. </code></pre>
  414. </li>
  415. <li>
  416. <p>Test du playbook</p>
  417. <pre><code>deborah@aldebaran:~$ ansible-playbook piras.yml -i inventory
  418. PLAY [play-1] *************************************************************************************************************
  419. TASK [Gathering Facts] ****************************************************************************************************
  420. Enter passphrase for key '.ssh/piras_ed25519':
  421. ok: [piras]
  422. TASK [test de la connectivité] ********************************************************************************************
  423. ok: [piras]
  424. PLAY RECAP ****************************************************************************************************************
  425. piras : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  426. deborah@aldebaran:~$
  427. </code></pre>
  428. <p>Ca marche (ok=2.)</p>
  429. </li>
  430. </ol>
  431. </li>
  432. </ul>
  433. <h2 id="etat-des-lieux">État des lieux</h2>
  434. <p>Nous avons les données suivantes:</p>
  435. <ul>
  436. <li>adresse IP DHCP: <strong>192.168.111.33</strong>.</li>
  437. <li>adresse IPV4 fixe: <strong>192.168.111.171</strong> : à configurer.</li>
  438. <li>adresse IPV6 fixe: <strong>2a01:e0a:d0:3c20::171</strong> : à configurer.</li>
  439. <li>nom du user: <strong>pi</strong> (user prédéfini avec droits sudo)</li>
  440. <li>nom de la machine: <strong>raspberrypi</strong>: à configurer.</li>
  441. <li>
  442. <p>domaine de la machine: <strong>yojik.net</strong> (c'est le domaine de mon réseau local): à configurer.</p>
  443. <p>Le non complet sera donc: <strong>piras.yojik.net</strong></p>
  444. </li>
  445. </ul>
  446. <p>Un des premiers problèmes à résoudre est que l'adresse IP par défaut est donnée par DHCP, donc variable. Il faudra redémarrer le raspi une fois la modification de la configuration réseau faite et re-tester la connectivité.</p>
  447. <h3 id="tache-1">Tâche 1</h3>
  448. <p>Tester la connectivité:</p>
  449. <ul>
  450. <li>
  451. <p>Ajout de l'adresse du serveur toto à <strong>/etc/hosts</strong> du poste client.</p>
  452. <p>Nous pouvons le faire manuellement, ou avec un script shell, ou avec un playbook ansible.</p>
  453. <ol>
  454. <li>
  455. <p>à la main</p>
  456. <p>Utilisez votre éditeur préféré, et ajoutez/modifiez la ligne suivante à /etc/hosts:</p>
  457. <p>192.168.111.171 toto.yojik.net toto</p>
  458. </li>
  459. <li>
  460. <p>script shell</p>
  461. <pre><code>eric@aldebaran:~/ansible-toto$ cat play1.sh
  462. #!/bin/sh
  463. echo "192.168.111.171 toto.yojik.net toto" &gt;&gt; /etc/hosts
  464. cat /etc/hosts
  465. eric@aldebaran:~/ansible-toto$
  466. eric@aldebaran:~/ansible-toto$ chmod +x play1.sh
  467. eric@aldebaran:~/ansible-toto$ sudo ./play1.sh
  468. 127.0.0.1 localhost
  469. 192.168.111.150 aldebaran.yojik.net aldebaran
  470. # The following lines are desirable for IPv6 capable hosts
  471. ::1 localhost ip6-localhost ip6-loopback
  472. ff02::1 ip6-allnodes
  473. ff02::2 ip6-allrouters
  474. 192.168.111.171 toto.yojik.net toto
  475. eric@aldebaran:~/ansible-toto$
  476. </code></pre>
  477. <p>La ligne a bien été ajoutée à la fin du fichier.</p>
  478. </li>
  479. <li>
  480. <p>playbook ansible</p>
  481. <p>La playbook que nous verrons à l'étape suivante va mettre à jour le fichier /etc/hosts automatiquement avec les informations saisies dans le fichier <strong>variables</strong> de notre projet ansible.</p>
  482. </li>
  483. </ol>
  484. </li>
  485. <li>
  486. <p>test</p>
  487. </li>
  488. </ul>
  489. <h3 id="tache-2">Tâche 2</h3>
  490. <p>Nous allons mettre à jour notre hostname ainsi que le fichier <strong>/etc/hosts</strong>.
  491. Pour cela nous allons utiliser un role <strong>tout prêt</strong> disponible sur <strong>galaxy-ansible</strong>.</p>
  492. <p>Ce role s'appelle <strong>hostname</strong> et l'auteur en est: Mischa ter Smitten</p>
  493. <p>Pour installer ce role, tapez:</p>
  494. <pre><code>eric@aldebaran:~$ ansible-galaxy install oefenweb.hostname
  495. Starting galaxy role install process
  496. - downloading role 'hostname', owned by oefenweb
  497. - downloading role from https://github.com/Oefenweb/ansible-hostname/archive/v2.0.17.tar.gz
  498. - extracting oefenweb.hostname to /home/eric/.ansible/roles/oefenweb.hostname
  499. - oefenweb.hostname (v2.0.17) was installed successfully
  500. eric@aldebaran:~$
  501. </code></pre>
  502. <p>La documentation est disponible dans le répertoire:</p>
  503. <pre><code>~/.ansible/roles/oefenweb.hostname
  504. </code></pre>
  505. <p>Il nous faut entrer le <strong>fqdn</strong> dans le fichier inventaire, et créer des fichiers de variables dans le répertoire adéquat, avec un nom bien précis (en rapport avec le fqdn).</p>
  506. <ul>
  507. <li>mise à jour du nom d'hôte (hostname)</li>
  508. <li>test</li>
  509. </ul>
  510. <h3 id="tache-3">Tâche 3</h3>
  511. <ul>
  512. <li>création de l'une clef <strong>ssh</strong> sur le desktop</li>
  513. <li>ajout d'un enregistrement à <strong>./.ssh/config</strong> pour intégrer le nouveau serveur</li>
  514. <li>modification de <strong>/etc/hosts</strong> pour intégrer le fqdn de ce nouveau serveur</li>
  515. <li>test</li>
  516. </ul>
  517. <h3 id="tache-4">Tâche 4</h3>
  518. <ul>
  519. <li>copie de cette clef sur le raspi</li>
  520. <li>test de connexion avec cette clef</li>
  521. </ul>
  522. <h3 id="tache-5">Tâche 5</h3>
  523. <p>Sécurisation <strong>ssh</strong></p>
  524. <ul>
  525. <li>test d'audit du serveur</li>
  526. <li>création de nouvelles clefs sur le serveur</li>
  527. <li>copie d'un fichier <strong>sshd_config</strong> sur le serveur</li>
  528. <li>relance du daemon <strong>sshd</strong></li>
  529. <li>test de connexion</li>
  530. <li>test d'audit</li>
  531. </ul>
  532. <h3 id="tache-6">Tâche 6</h3>
  533. <p>Création d'adresse IPV4 et IPV6 fixes.</p>
  534. <ul>
  535. <li>modification de <strong>/etc/dhcpd/dhcpd.conf</strong></li>
  536. <li>reboot</li>
  537. </ul>
  538. </div>
  539. </div>
  540. <footer>
  541. <hr/>
  542. <div role="contentinfo">
  543. <!-- Copyright etc -->
  544. </div>
  545. Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
  546. </footer>
  547. </div>
  548. </div>
  549. </section>
  550. </div>
  551. <div class="rst-versions" role="note" aria-label="versions">
  552. <span class="rst-current-version" data-toggle="rst-current-version">
  553. </span>
  554. </div>
  555. <script>var base_url = '../../..';</script>
  556. <script src="../../../js/theme.js" defer></script>
  557. <script src="../../../search/main.js" defer></script>
  558. <script defer>
  559. window.onload = function () {
  560. SphinxRtdTheme.Navigation.enable(true);
  561. };
  562. </script>
  563. </body>
  564. </html>