تقترح هذه المقالة نصوصًا برمجية لأتمتة :
- تثبيت Raspbian على Raspberry Pi عبر سكربت bash مخصص
- تكوين وتأمين أدنى لـ Raspbian عبر Ansible باستخدام دور مخصص.
تثبيت Raspbian
قبل البدء ننتقل إلى مجلد عمل، على سبيل المثال ~/rpi
بعد ذلك ندخل بطاقة microSD (مثلاً عبر محول) إلى جهاز الكمبيوتر ونحدد مسار بطاقة microSD
تساعد الأدوات dmesg أو lsblk في هذا التحديد
## Dans ces exemples la microSD a été détectée sur sdd ce qui donne comme chemin /dev/sdd## via dmesgjls42@boo:~/rpi$ sudo dmesg |tail[94655.145112] scsi host8: usb-storage 1-1.2:1.0[94656.175566] scsi 8:0:0:0: Direct-Access Generic USB SD Reader 1.00 PQ: 0 ANSI: 0 CCS[94656.176298] sd 8:0:0:0: Attached scsi generic sg4 type 0[94656.177494] sd 8:0:0:0: [sdd] 62333952 512-byte logical blocks: (31.9 GB/29.7 GiB)[94656.178010] sd 8:0:0:0: [sdd] Write Protect is off[94656.178014] sd 8:0:0:0: [sdd] Mode Sense: 4b 00 00 08[94656.178638] sd 8:0:0:0: [sdd] No Caching mode page found[94656.178647] sd 8:0:0:0: [sdd] Assuming drive cache: write through[94656.182648] sdd: sdd1 sdd2[94656.185135] sd 8:0:0:0: [sdd] Attached SCSI removable disk
## ou via lsblkjls42@boo:~/rpi$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT[...]sdd 8:48 1 29,7G 0 disk├─sdd1 8:49 1 43,9M 0 part└─sdd2 8:50 1 1,7G 0 partبعد ذلك يمكننا تثبيت Raspbian على بطاقة microSD مثلاً عبر install_raspbian.sh
أثناء هذا التثبيت سيتم إنشاء نقطة إرفاق /mnt/sdd
#!/bin/bash
# Ici on configure le chemin de la microSD# et le point de montage nécessaire à la bonne exécution du scriptmsd_fs="/dev/sdd"mountpoint="/mnt/sdd"
[ -d ${mountpoint} ] || mkdir ${mountpoint}[ -b ${msd_fs} ] || { echo "${msd_fs} non disponible" ; exit 1 ;}
#raspbian_version="2018-06-27-raspbian-stretch-lite.zip"raspbian_version=""if [ -z ${raspbian_version} ]then raspbian_version=$(curl -s https://downloads.raspberrypi.org/raspbian_lite_latest | \ grep "raspbian_lite"| perl -nle 'print $1 if /.*href=".*images\/.*\/([0-9].*)"/') if [ -e ${raspbian_version} ] then echo "La dernière image de Raspbian est déjà présente" else echo "Téléchargement de la dernière image de Raspbian" curl -s -L https://downloads.raspberrypi.org/raspbian_lite_latest --output ${raspbian_version} fifi
echo -e "Déploiement de ${raspbian_version} to ${msd_fs}"time unzip -p ${raspbian_version} | sudo dd of=${msd_fs} bs=4M conv=fsync && \echo -e "Montage de ${msd_fs}1 to ${mountpoint}" && \sudo mount ${msd_fs}1 ${mountpoint} && \echo -e "Activation du SSH sur Rasbpian" && \sudo touch ${mountpoint}/ssh && \echo -e "Vérification de l'activation SSH" && \sudo ls -l ${mountpoint}/ssh && \echo -e "Démontage ${msd_fs}1" && \sudo umount ${mountpoint}نعطيه أذونات التنفيذ ثم نشغّله بصلاحيات root
chmod 700 install_raspbian.shsudo ./install_raspbian.shوالنتيجة:
jls42@boo:~/rpi$ sudo ./install_raspbian.shTéléchargement de la dernière image de RaspbianDéploiement de 2018-11-13-raspbian-stretch-lite.zip to /dev/sdd0+28463 enregistrements lus0+28463 enregistrements écrits1866465280 bytes (1,9 GB, 1,7 GiB) copied, 102,911 s, 18,1 MB/s
real 1m42,923suser 0m14,203ssys 0m2,851sMontage de /dev/sdd1 to /mnt/sddActivation du SSH sur RasbpianVérification de l'activation SSH-rwxr-xr-x 1 root root 0 déc. 8 22:45 /mnt/sdd/sshDémontage /dev/sdd1في هذه المرحلة تم إعداد بطاقة microSD، ويمكن إدخالها مباشرة في Raspberry Pi.
تكوين وتأمين Raspbian
بمجرد إدخال بطاقة microSD وأصبح Raspberry Pi قابلاً للوصول عبر SSH، نقوم بـ:
- استرجاع دور Ansible الخاص بالتهيئة
- تحضير playbook لـ Ansible
- تشغيل سكربت Ansible
استرجاع دور Ansible ansible-rpi-init
قمت بتطوير دور Ansible لأجل هذه الأتمتة، إليك كيفية استرجاعه :
git clone git@gitlab.com:jls42/ansible-rpi-init.git roles/ansible-rpi-initمما يعطي :
jls42@boo:~/rpi$ git clone https://gitlab.com/jls42/ansible-rpi-init.git roles/ansible-rpi-initClonage dans 'roles/ansible-rpi-init'...remote: Enumerating objects: 17, done.remote: Counting objects: 100% (17/17), done.remote: Compressing objects: 100% (9/9), done.remote: Total 17 (delta 0), reused 0 (delta 0)Dépaquetage des objets: 100% (17/17), fait.إنشاء ملف الجرد المسمى inventory
في مثال الجرد هذا يمتلك Raspberry Pi عنوان IP 192.168.1.190
[rpi1]192.168.1.190 servername=rpi1توليد هاش لكلمة المرور عبر mkpasswd ونحتفظ بالنتيجة للإجراء التالي
## ici le mot de passe est 'osef'jls42@boo:~$ mkpasswd --method=sha-512Mot de passe :$6$KRDQqQeZT$Bu439CILeJqHmwoxCwHXsgTJ5JEQjpZWfzCw6Deggfhip.DGScoCnUSBi.Hqnkh1OZUhTBaQees6GooW.PSLe.إنشاء playbook لـ Ansible باسم init_rpi.yml
---- name: "Initialisation du Rapsberry Pi" hosts: rpi1 remote_user: "pi" roles: - roles/ansible-rpi-init vars: rpi_password: "$6$KRDQqQeZT$Bu439CILeJqHmwoxCwHXsgTJ5JEQjpZWfzCw6Deggfhip.DGScoCnUSBi.Hqnkh1OZUhTBaQees6GooW.PSLe."توليد زوج مفاتيح SSH إن لم يكن لدينا واحد بالفعل
jls42@boo:~$ [ -f ~/.ssh/id_rsa.pub ] || ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/home/jls42/.ssh/id_rsa):Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /home/jls42/.ssh/id_rsa.Your public key has been saved in /home/jls42/.ssh/id_rsa.pub.The key fingerprint is:SHA256:qHhedMjuI0LySVAp2mpFQMozuqBwI00FZo0oHX7rkYI jls42@booThe key's randomart image is:+---[RSA 2048]----+|.=**. ||*+=o. ||+B+ . ||+++o + o ||Eo* + = S ||*=o= = . ||+=..+ o || +o.o. || ..... |+----[SHA256]-----+في هذه المرحلة تتواجد الملفات التالية
jls42@boo:~/rpi$ tree.├── 2018-11-13-raspbian-stretch-lite.zip├── init_rpi.yml├── install_raspbian.sh├── inventory└── roles └── ansible-rpi-init ├── defaults │ └── main.yml ├── handlers │ └── main.yml ├── LICENSE ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml
8 directories, 13 filesتشغيل Ansible مع الـ playbook init_rpi.yml
## Le mot de passe par défaut est : "raspberry"export ANSIBLE_HOST_KEY_CHECKING=Falseansible-playbook -k -b -i inventory init_rpi.ymlمما يعطي
jls42@boo:~/rpi$ ansible-playbook -k -b -i inventory init_rpi.ymlSSH password:
PLAY [Initialisation du Rapsberry Pi] ******************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************Saturday 08 December 2018 23:46:18 +0100 (0:00:00.050) 0:00:00.050 *****ok: [192.168.1.190]
TASK [roles/ansible-rpi-init : Mise à jour raspbian] ***************************************************************************************************************************************************************************************Saturday 08 December 2018 23:46:22 +0100 (0:00:03.502) 0:00:03.553 *****changed: [192.168.1.190]
TASK [roles/ansible-rpi-init : Configuration du nom] ***************************************************************************************************************************************************************************************Saturday 08 December 2018 23:47:53 +0100 (0:01:31.114) 0:01:34.667 *****changed: [192.168.1.190]
TASK [roles/ansible-rpi-init : Ajoute le nom du serveur dans le fichier /etc/hosts] ********************************************************************************************************************************************************Saturday 08 December 2018 23:47:55 +0100 (0:00:01.944) 0:01:36.612 *****changed: [192.168.1.190]
TASK [roles/ansible-rpi-init : Ajoute la clef publique] ************************************************************************************************************************************************************************************Saturday 08 December 2018 23:47:56 +0100 (0:00:01.031) 0:01:37.643 *****changed: [192.168.1.190]
TASK [roles/ansible-rpi-init : Mise à jour du mot de passe de l'utilisateur pi] ************************************************************************************************************************************************************Saturday 08 December 2018 23:47:57 +0100 (0:00:01.183) 0:01:38.826 *****changed: [192.168.1.190]
TASK [roles/ansible-rpi-init : Redémarrage] ************************************************************************************************************************************************************************************************Saturday 08 December 2018 23:47:58 +0100 (0:00:01.249) 0:01:40.075 *****changed: [192.168.1.190]
TASK [roles/ansible-rpi-init : Attente suite au redémarrage] *******************************************************************************************************************************************************************************Saturday 08 December 2018 23:48:00 +0100 (0:00:01.714) 0:01:41.790 *****ok: [192.168.1.190]
PLAY RECAP *********************************************************************************************************************************************************************************************************************************192.168.1.190 : ok=8 changed=6 unreachable=0 failed=0
Saturday 08 December 2018 23:49:00 +0100 (0:01:00.451) 0:02:42.241 *****===============================================================================roles/ansible-rpi-init ------------------------------------------------ 158.69ssetup ------------------------------------------------------------------- 3.50s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~total ----------------------------------------------------------------- 162.19sPlaybook run took 0 days, 0 hours, 2 minutes, 42 secondsوهكذا :
- تم تغيير كلمة مرور الوصول للمستخدم “pi”
- بات الوصول ممكنًا الآن دون كلمة مرور
- يمتلك Raspberry Pi الاسم المحدد في servername (عبر ملف الجرد)
التحقق
نتصل بـ Raspberry Pi لتأكيد الوصول الصحيح بدون كلمة مرور وصحة الاسم
jls42@boo:~/rpi$ ssh pi@192.168.1.190Linux rpi1 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l
The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Sat Dec 8 22:47:59 2018 from 192.168.1.42pi@rpi1:~ $استمتع !
تمت ترجمة هذا المستند من الإصدار fr إلى اللغة ar باستخدام النموذج gpt-5-mini. لمزيد من المعلومات حول عملية الترجمة، راجع https://gitlab.com/jls42/ai-powered-markdown-translator