30 Ansible für ff@home aufsetzen.page 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. ---
  2. format: markdown
  3. title: Ansible ff@home aufsetzen
  4. toc: yes
  5. ...
  6. # Software
  7. - Debian 12 (bookworm) oder Ubuntu 22.04
  8. - python3 und ansible
  9. ***** Es empfiehlt sich, eine python virtuelle Umgebung zu verwenden *****
  10. Nur für die folgende Paketinstallation sind root-Rechte erforderlich,alle weiteren Terminaleingaben erfolgen als normaler user.
  11. Die folgenden Pakete installieren:
  12. $ sudo apt install python3-pip python3-venv
  13. Dann 1) in das Basisverzeichnis gehen (bei mir /datadisk) und die virtuelle Umgebung anlegen
  14. $ python3 -m venv ffhome
  15. Dadurch wird das ffhome-Verzeichnis angelegt, dorthin wechseln mit "cd ffhome".
  16. In dem Verzeichnis ffhome die venv-Umgebung aktivieren
  17. $ source bin/activate
  18. oder 2) mit "git clone" ein Verzeichnis mit einem git-Inhalt erzeugen
  19. $ git clone https://...
  20. Dann in das git-Basisverzeichnis "cd gitverzeichnis" gehen und die virtuelle Umgebung anlegen
  21. $ python3 -m venv .venv
  22. In dem git-Verzeichnis die venv-Umgebung aktivieren
  23. $ source .venv/bin/activate
  24. Dadurch ändert sich der prompt, je nach Einstellung $ oder 0]:
  25. (ffhome) 18:16:41[frankb@berglap /datadisk/ffhome 0]
  26. Zum Verlassen der Umgebung:
  27. $ deactivate oder Terminal Fenster schliessen
  28. Jetzt kann ansible in der ffhome oder git-Verzeichnis Umgebung installiert werden:
  29. $ pip3 install ansible
  30. 18:11:20[frankb@berglap /datadisk/ffhome 0]
  31. Die Verzeichnistruktur der Testumgebung
  32. $ tree -L 4 /datadisk/ffhome
  33. /datadisk/ffhome
  34. ├── ansible.cfg
  35. ├── bin
  36. │   ├── activate
  37. │   ├── activate.csh
  38. │   ├── activate.fish
  39. │   ├── Activate.ps1
  40. │   ├── ansible
  41. │   ├── ansible-community
  42. ...
  43. │   └── yamllint
  44. ├── include
  45. ├── inventory
  46. │   ├── hosts.yaml
  47. │   └── host_vars
  48. |    ├── bergdesk
  49. │      │   ├── vars
  50. │      │   ├── vars.01.bak
  51. │      │   ├── vars.02.bak
  52. │      │   └── vault
  53. │      ├── berghofen
  54. │      │   ├── vars
  55. │      │   ├── vars.01.bak
  56. │      │   ├── vars.bak
  57. │      │   └── vault
  58. │      ├── berglap
  59. │      │   ├── vars
  60. │      │   ├── vars.01.bak
  61. │      │   ├── vars.bak
  62. │      │   └── vault
  63. │      └── luna
  64. │      ├── vars
  65. │      └── vault
  66. ├── lib
  67. │   └── python3.10
  68. ├── lib64 -> lib
  69. ...
  70. ├── playbooks
  71. │   ├── resources
  72. │   │   └── host
  73. │   │   ├── tincbergdesk.gz
  74. │   │   └── tincberghofen.gz
  75. │   ├── templates
  76. │   │   ├── tinc-up.lan.j2
  77. │   │   └── tinc-up.wan.j2
  78. │   ├── tincbuild.yaml
  79. │   └── update.yaml
  80. └── pyvenv.cfg
  81. Bei den ... sind Zeilen der Übersichtlichkeit halber weggelassen.
  82. Die verwendete ansible.cfg:
  83. [defaults]
  84. inventory=./inventory/
  85. roles_path=./roles
  86. playbook_dir=./playbooks/
  87. interpreter_python=auto_silent
  88. #vault_password_file=~/.vault-password
  89. log_path=/tmp/ansible_ffhome.log
  90. cow_selection=random
  91. nocows=True
  92. stdout_callback=yaml
  93. display_args_to_stdout=True
  94. [privilege_escalation]
  95. become=True
  96. [ssh_connection]
  97. pipelining=True
  98. Datei mit den beteiligten Hosts inventory/hosts.yaml
  99. ---
  100. all:
  101. vars:
  102. ansible_port: 24
  103. ansible_user: frankb
  104. ansible_become: true
  105. apus:
  106. hosts:
  107. berghofen:
  108. ansible_host: 192.168.178.51
  109. ansible_user: fb
  110. ansible_become_password: "{{ berghofen_password }}"
  111. desktops:
  112. hosts:
  113. bergdesk:
  114. ansible_host: 192.168.178.201
  115. ansible_become_pass: '{{ bergdesk_password }}'
  116. berglap:
  117. ansible_host: 192.168.178.52
  118. ansible_become_pass: '{{ berglap_password }}'
  119. luna:
  120. ansible_host: 192.168.178.224
  121. ansible_become_pass: '{{ luna_password }}'
  122. altlast:
  123. hosts:
  124. hoerde:
  125. ansible_host: 193.43.220.136
  126. ansible_become: true
  127. ansible_become_method: su
  128. supernodes:
  129. hosts:
  130. 31.172.33.20:
  131. ansible_port: 22
  132. snng-dus01.ffdo.de:
  133. ansible_port: 22
  134. snng-dtm01.ffdo.de:
  135. ansible_port: 22
  136. Die Gruppen apus und desktops enthalten die testhosts, die Gruppen altlast und supernodes sind nicht komplett einbezogen.
  137. Im Verzeichnis inventory/host_vars sind Variablen für die einzelnen hosts, u.a. die passwords, in vars unverschlüsselt, in vault aes256 geschützt. Weiter sind Parameter für tinc enthalten, nur in vars, unverschlüsselt.
  138. Beispielhaft für berghofen
  139. $ cat berghofen/vars
  140. ---
  141. berghofen_password: "{{ vault_berghofen_password }}"
  142. tinc_bindto: 192.168.178.51
  143. wan_broadcast_ip: 193.43.220.191
  144. wan_ip: 193.43.220.162/27
  145. lan_broadcast_ip: 192.168.34.255
  146. lan_ip: 192.168.34.1/24
  147. $ cat berghofen/vault
  148. $ANSIBLE_VAULT;1.2;AES256;xx
  149. 35656536383233636434636533613830303439316263636436363932333636626462616461636537
  150. 3838626266396332363236643361626134393238636133640a646333333866643161356333626564
  151. 32373735343033633666353763376230646137663639373438393537663031643562376365396337
  152. 3161646534666236350a303366373433373833373066353030363766616166666361376637393464
  153. 30613139313661643932373239333865616338653132613530393161656466326561633537383535
  154. 3631356664643139383037636565346630643036353364333866
  155. In der vault Datei (hier Klartext)
  156. ---
  157. vault_berghofen_password: hier das echte PW eintragen
  158. dann die vault Datei verschlüsseln mit
  159. $ ansible-vault encrypt vault --vault-id xxxxx@prompt
  160. anzeigen kann man die Datei mit
  161. $ ansible-vault view vault
  162. und wieder entschlüsseln mit
  163. $ ansible-vault decrypt vault
  164. Es gibt z.Zt. zwei playbooks: update.yaml und tincbuild.yaml
  165. $ cat playbooks/update.yaml
  166. ---
  167. # name: update yaml
  168. - hosts: [desktops,apus,altlast]
  169. tasks:
  170. - name: Testausgabe
  171. debug: msg="Hallo von {{ ansible_hostname }} Ansible managed!"
  172. - name: df -h Aufruf
  173. command: df -h /
  174. changed_when: false
  175. register: df_cmd
  176. - debug:
  177. msg: '{{df_cmd.stdout_lines}} {{ansible_distribution }}'
  178. - name: ping meine hosts
  179. ansible.builtin.ping:
  180. changed_when: false
  181. # - name: Warte auf enter Taste
  182. # ansible.builtin.pause:
  183. - name: Ist flatpak installiert
  184. stat:
  185. path: /usr/bin/flatpak
  186. register: flatpak_file
  187. when: ansible_os_family == "Debian"
  188. - name: Update flatpak Pakete falls snap vh
  189. command: /usr/bin/flatpak update
  190. when: ansible_os_family == "Debian" and flatpak_file.stat.exists
  191. - name: Ist snap installiert
  192. stat:
  193. path: /usr/bin/snap
  194. register: snap_file
  195. when: ansible_os_family == "Debian"
  196. - name: Update snap Pakete falls snap vh
  197. command: /usr/bin/snap refresh
  198. when: ansible_os_family == "Debian" and snap_file.stat.exists
  199. - name: apt update mit upgrade und autoremove
  200. ansible.builtin.apt:
  201. update_cache: yes
  202. cache_valid_time: 3600
  203. autoremove: yes
  204. upgrade: 'yes'
  205. when: ansible_os_family == "Debian"
  206. - stat:
  207. path: /var/run/needrestart
  208. register: needrestart_file
  209. - name: reboot falls erforderlich
  210. ansible.builtin.reboot:
  211. when:
  212. - ansible_os_family == "Debian" and
  213. ( needrestart_file.stat.exists or
  214. rebootreq_file.stat.exists
  215. )
  216. - name: playbook hier beenden bei ! debian
  217. meta: end_play
  218. when: ansible_os_family != "Debian"
  219. $ cat playbooks/tincbuild.yaml
  220. ---
  221. # name: tincbuild yaml
  222. - hosts: [desktops, apus, altlast]
  223. vars:
  224. TINC_VERSION: 1.1pre18
  225. tinc_dev: /dev/net/tun
  226. tinc_mode: switch
  227. tinc_adr_family: ipv4
  228. tinc_max_timeout: 30
  229. tinc_port:
  230. lan: 10001
  231. wan: 661
  232. tasks:
  233. # - name: Show facts available on the system
  234. # ansible.builtin.debug:
  235. # var: ansible_facts
  236. # das folgende klappt leider nicht {{tinc_port.{{ item }}}} syntaxfehler
  237. # geschachtelte variablen gehen nicht.
  238. # - name: willi
  239. # debug: msg="var {{ tinc_port.{{lan}}}}"
  240. - name: Testausgabe
  241. debug: msg="Hallo von {{ ansible_hostname }} Ansible managed!"
  242. - name: df -h Aufruf
  243. command: df -h /
  244. changed_when: false
  245. register: df_cmd
  246. - debug:
  247. msg: '{{df_cmd.stdout_lines}} {{ansible_distribution }}'
  248. # - name: ping meine hosts
  249. # ansible.builtin.ping:
  250. # changed_when: false
  251. # - name: Warte auf enter Taste
  252. # ansible.builtin.pause:
  253. - name: playbook hier beenden bei ! debian
  254. meta: end_play
  255. when: ansible_os_family != "Debian"
  256. - name: Ist tinc Konfigurationsverzeichnis vorhanden
  257. stat:
  258. path: /etc/tinc
  259. register: tinckonf
  260. - name: Gibt es Sicherung von tinc Konfiguration
  261. # ueberlebt keinen reboot
  262. stat:
  263. path: /tmp/tinc{{ ansible_hostname }}.gz
  264. register: tincgz
  265. - name: Konfiguration packen wenn noetig
  266. community.general.archive:
  267. path: /etc/tinc
  268. dest: /tmp/tinc{{ ansible_hostname }}.gz
  269. when: tinckonf.stat.exists
  270. - name: Gesicherte Konfiguration auf Controlnode kopieren
  271. ansible.builtin.fetch:
  272. src: /tmp/tinc{{ ansible_hostname }}.gz
  273. dest: resources/host/
  274. flat: true
  275. when: tinckonf.stat.exists
  276. # - name: Gesicherte Konfiguration auf targetnode loeschen
  277. # file:
  278. # name: /tmp/tinc{{ ansible_hostname }}.gz
  279. # state: absent
  280. # when: tincgz.stat.exists
  281. - name: Abhängigkeiten fuer tinc installieren
  282. apt:
  283. pkg: "{{ item }}"
  284. state: present
  285. with_items:
  286. - build-essential
  287. - libncurses-dev
  288. - libreadline-dev
  289. - pkg-config
  290. - zlib1g-dev
  291. - liblzo2-dev
  292. - libssl-dev
  293. - texinfo
  294. - name: create directory for tinc
  295. file:
  296. name: /opt/tinc
  297. state: directory
  298. - name: Download tinc source
  299. get_url:
  300. url: "https://www.tinc-vpn.org/packages/tinc-{{TINC_VERSION}}.tar.gz"
  301. dest: /opt/tinc/tinc-{{TINC_VERSION}}.tar.gz
  302. register: gettinc
  303. - name: tinc-Quellen entpacken
  304. unarchive:
  305. src: /opt/tinc/tinc-{{TINC_VERSION}}.tar.gz
  306. dest: /usr/src
  307. remote_src: true
  308. when:
  309. - gettinc.changed
  310. - name: Pruefen tinc programm vh
  311. stat:
  312. path: /usr/sbin/tinc
  313. register: tinc_bin
  314. - name: tinc kompilieren und installieren
  315. shell: "cd /usr/src/tinc-{{TINC_VERSION}}
  316. && ./configure --prefix=/usr --sysconfdir=/etc --runstatedir=/run
  317. --localstatedir=/var --with-systemd
  318. && make
  319. && make install"
  320. when:
  321. - tinc_bin.stat.exists == False or gettinc.changed
  322. - name: Gibt es schon eine (alte) tinc Konfiguration
  323. stat:
  324. path: /etc/tinc
  325. register: tinc_etc
  326. - name: tinc Konfigurationsreste beseitigen
  327. file:
  328. path: /etc/tinc
  329. state: absent
  330. when:
  331. - tinc_etc.stat.exists
  332. - name: tinc lan/wan vorkonfigurieren in mehreren Schritten
  333. shell: "tinc --net={{ item }} init {{ansible_hostname}}"
  334. with_items:
  335. - lan
  336. - wan
  337. # when:
  338. # - tinc_bin.stat.exists == False or gettinc.changed
  339. - name: 2048er priv und pub keys löschen
  340. shell: "rm /etc/tinc/{{ item }}/*.priv
  341. && rm /etc/tinc/{{ item }}/hosts/*"
  342. with_items:
  343. - lan
  344. - wan
  345. # when:
  346. # - tinc_bin.stat.exists == False or gettinc.changed
  347. - name: 4096er keys generieren
  348. shell: "tinc --net={{ item }} -b generate-keys 4096"
  349. with_items:
  350. - lan
  351. - wan
  352. # when:
  353. # - tinc_bin.stat.exists == False or gettinc.changed
  354. - name: tinc.conf einrichten
  355. shell: "tinc --net={{ item }} set Device {{tinc_dev}}
  356. && tinc --net={{ item }} set Mode {{tinc_mode}}
  357. && tinc --net={{ item }} set AddressFamily {{tinc_adr_family}}
  358. && tinc --net={{ item }} set MaxTimeout {{tinc_max_timeout}}
  359. && tinc --net={{ item }} set BindToAddress {{tinc_bindto}}"
  360. with_items:
  361. - lan
  362. - wan
  363. # when:
  364. # - tinc_bin.stat.exists == False or gettinc.changed
  365. - name: lan/wan ports setzen
  366. # das geht leider nicht in loop, da Variablen nicht geschachtelt
  367. shell: "tinc --net=lan set Port {{ tinc_port.lan }}
  368. && tinc --net=wan set Port {{ tinc_port.wan }}"
  369. - name: tinc-up anpassen
  370. ansible.builtin.template:
  371. src: templates/tinc-up.{{ item }}.j2
  372. dest: /etc/tinc/{{ item }}/tinc-up
  373. with_items:
  374. - lan
  375. - wan
  376. # when:
  377. # - tinc_bin.stat.exists == False or gettinc.changed
  378. - meta: end_play
  379. Für tinc-up werden folgende templates verwendet
  380. $ cat playbooks/templates/tinc-up.lan.j2
  381. #!/bin/sh
  382. ip addr add {{ lan_ip }} brd {{ lan_broadcast_ip }} dev $INTERFACE
  383. ip link set $INTERFACE mtu 1504 up
  384. $ cat playbooks/templates/tinc-up.wan.j2
  385. #!/bin/sh
  386. ip addr add {{ wan_ip }} brd {{ wan_broadcast_ip }} dev $INTERFACE
  387. ip link set $INTERFACE mtu 1504 up
  388. Aufruf der beiden playbooks mit
  389. $ ansible-playbook -b playbooks/update.yaml -i inventory/hosts.yaml --ask-vault-pass
  390. $ ansible-playbook -b playbooks/tincbuild.yaml -i inventory/hosts.yaml --ask-vault-pass
  391. Gekürzte Ausgabe:
  392. (ffhome) 20:55:59[frankb@berglap /datadisk/ffhome 4] ansible-playbook -b playbooks/update.yaml -i inventory/hosts.yaml --ask-vault-pass
  393. Vault password:
  394. PLAY [desktops,apus,altlast] ***************************************************************
  395. TASK [Gathering Facts] *********************************************************************
  396. [WARNING]: Platform linux on host berglap is using the discovered Python interpreter at
  397. /usr/bin/python3.10, but future installation of another Python interpreter could change the
  398. meaning of that path. See https://docs.ansible.com/ansible-
  399. core/2.17/reference_appendices/interpreter_discovery.html for more information.
  400. ok: [berglap]
  401. [WARNING]: Platform linux on host bergdesk is using the discovered Python interpreter at
  402. /usr/bin/python3.11, but future installation of another Python interpreter could change the
  403. meaning of that path. See https://docs.ansible.com/ansible-
  404. core/2.17/reference_appendices/interpreter_discovery.html for more information.
  405. ok: [bergdesk]
  406. fatal: [luna]: UNREACHABLE! => changed=false
  407. msg: 'Failed to connect to the host via ssh: ssh: connect to host 192.168.178.224 port 24: No route to host'
  408. unreachable: true
  409. [WARNING]: Platform linux on host berghofen is using the discovered Python interpreter at
  410. /usr/bin/python3.11, but future installation of another Python interpreter could change the
  411. meaning of that path. See https://docs.ansible.com/ansible-
  412. core/2.17/reference_appendices/interpreter_discovery.html for more information.
  413. ok: [berghofen]
  414. [WARNING]: Platform freebsd on host hoerde is using the discovered Python interpreter at
  415. /usr/local/bin/python3.9, but future installation of another Python interpreter could
  416. change the meaning of that path. See https://docs.ansible.com/ansible-
  417. core/2.17/reference_appendices/interpreter_discovery.html for more information.
  418. ok: [hoerde]
  419. TASK [Testausgabe] *************************************************************************
  420. ok: [bergdesk] =>
  421. msg: Hallo von bergdesk Ansible managed!
  422. ok: [berglap] =>
  423. msg: Hallo von berglap Ansible managed!
  424. ok: [berghofen] =>
  425. msg: Hallo von berghofen Ansible managed!
  426. ok: [hoerde] =>
  427. msg: Hallo von hoerde Ansible managed!
  428. TASK [df -h Aufruf] ************************************************************************
  429. ok: [berglap]
  430. ok: [bergdesk]
  431. ok: [berghofen]
  432. ok: [hoerde]
  433. TASK [debug] *******************************************************************************
  434. ok: [bergdesk] =>
  435. msg: '[''Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf'', ''/dev/sdb1 439G 98G 319G 24% /''] Debian'
  436. ok: [berglap] =>
  437. msg: '[''Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf'', ''/dev/mapper/system-root 444G 298G 124G 71% /''] Ubuntu'
  438. ok: [berghofen] =>
  439. msg: '[''Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf'', ''/dev/sda6 18G 5,1G 12G 30% /''] Debian'
  440. ok: [hoerde] =>
  441. msg: '[''Filesystem Size Used Avail Capacity Mounted on'', ''s3pool25/jail/hoerde.ffdo.net 3.9G 891M 3.0G 22% /''] FreeBSD'
  442. TASK [ping meine hosts] ********************************************************************
  443. ok: [berglap]
  444. ok: [bergdesk]
  445. ok: [berghofen]
  446. ok: [hoerde]
  447. ...
  448. PLAY RECAP *********************************************************************************
  449. bergdesk : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  450. berghofen : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  451. berglap : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  452. hoerde : ok=5 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
  453. luna : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0