├── .gitignore ├── README.md ├── ansible.cfg ├── beaglebone.yml ├── docs ├── README.md ├── facts_rpi3b └── facts_rpi4 ├── host_vars ├── blackhall.yml ├── cloverdale.yml ├── cloverleaf.yml ├── clovermill.yml ├── clovermine.yml ├── greystone.yml ├── jetson.yml └── whitehaven.yml ├── hosts ├── jetson.yml ├── local.yml ├── lock-default-user.yml ├── requirements.txt ├── roles ├── beaglebone │ ├── files │ │ └── etc │ │ │ └── default │ │ │ └── bb-boot │ ├── tasks │ │ ├── beaglebone-facts.yml │ │ ├── main.yml │ │ ├── software.yml │ │ └── users.yml │ ├── templates │ │ └── etc │ │ │ └── motd │ └── vars │ │ ├── beaglebone-models.yml │ │ └── users.yml ├── common │ ├── files │ │ ├── etc │ │ │ └── auto.master │ │ └── set_locale.sh │ ├── handlers │ │ └── main.yml │ ├── linux-facts.yml │ ├── tasks │ │ ├── autofs.yml │ │ ├── cpufreq.yml │ │ ├── main.yml │ │ ├── software.yml │ │ └── sshd.yml │ ├── templates │ │ └── etc │ │ │ ├── auto.nfs │ │ │ ├── default │ │ │ └── cpufrequtils │ │ │ └── hosts │ └── vars │ │ └── main.yml ├── jetson │ ├── files │ │ └── etc │ │ │ ├── docker │ │ │ └── daemon.json │ │ │ └── profile.d │ │ │ └── cuda.sh │ ├── handlers │ │ └── main.yml │ └── tasks │ │ ├── main.yml │ │ ├── software.yml │ │ └── swap.yml └── rpi │ ├── files │ └── etc │ │ └── timezone │ ├── tasks │ ├── darshan-dev.yml │ ├── loadconfig.yml │ ├── main.yml │ ├── raspi-config.yml │ ├── raspi-facts.yml │ ├── software.yml │ ├── ufw.yml │ └── users.yml │ ├── templates │ └── etc │ │ └── motd │ └── vars │ ├── main.yml │ ├── raspi-models.yml │ ├── users.yml │ └── users.yml.example └── rpi.yml /.gitignore: -------------------------------------------------------------------------------- 1 | local.retry 2 | ansible_env 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Raspberry Pi Ansible Playbook 2 | 3 | Glenn K. Lockwood, October 2018 - June 2021. 4 | 5 | ## Introduction 6 | 7 | This is an Ansible configuration that configures a fresh Raspbian installation 8 | on Raspberry Pi. It can be run in local (pull) mode, where ansible is running 9 | on the same Raspberry Pi to be configured, or standard remote mode. This 10 | playbook is known to run on Raspberry Pi OS 11. 11 | 12 | Also included are plays for use with other single-board computers including 13 | NVIDIA Jetson Nano and BeagleBone Black. 14 | 15 | ## Bootstrapping on Raspbian 16 | 17 | You will need ansible installed on the Raspberry Pi being configured. This 18 | playbook relies on Ansible 2.8 or newer, which means you can no longer use 19 | `sudo apt-get install ansible`. Instead, you must 20 | 21 | $ python3 -m venv --system-site-packages ansible_env 22 | 23 | If this fails, you may need to: 24 | 25 | $ sudo apt install python3-apt python3-virtualenv 26 | 27 | Then activate the environment and install ansible: 28 | 29 | $ source ./ansible_env/bin/activate 30 | 31 | # Make sure that pip will install into our virtualenv 32 | (ansible_env) $ which pip 33 | /home/pi/src/git/rpi-ansible/ansible/bin/pip 34 | 35 | # Install ansible and any other requirements 36 | (ansible_env) $ pip install -r requirements.txt 37 | 38 | Note that the Python 3.5 that ships with Debian 9.13 doesn't install pip when 39 | `-m venv` is used as above. It may be easier to simply use 40 | 41 | $ pip3 install --user ansible 42 | 43 | which pollutes your login Python environment, but is better than nothing. 44 | 45 | ## Configuration 46 | 47 | The contents of each file in `host_vars/` is the intended configuration state 48 | for each Raspberry Pi. Look at one of the examples included to get a feel for 49 | the configurations available. Most variables should be optional, and if left 50 | undefined, do not enforce a specific configuration. 51 | 52 | To add local users, create and edit `roles/rpi/vars/users.yml`. Follow the 53 | structure in `roles/rpi/vars/users.yml.example`. You can/should 54 | `ansible-vault` this file. 55 | 56 | ## Using Remote Mode 57 | 58 | Run one of the playbooks as you would do normally: 59 | 60 | (ansible_env) $ ansible-playbook ./rpi.yml 61 | 62 | The default hosts file and `become_*` configurations are set in ansible.cfg. 63 | 64 | If you are bootstrapping a completely fresh system with the default users and 65 | hostnames, you may have to do the following: 66 | 67 | **Step 1:** Add a config to `~/.ssh/config` to map your intended hostname to 68 | the IP address of your fresh system. For example, 69 | 70 | ``` 71 | Host mynewrpi 72 | Hostname 192.168.1.101 73 | User pi 74 | ``` 75 | 76 | This allows, for example, `ssh mynewrpi` to work even if `mynewrpi`'s hostname 77 | hasn't yet been from the default. 78 | 79 | **Step 2:** `ssh-copy-id mynewrpi` to ensure passwordless SSH works to the new 80 | host. This will also make sure that your step 1 above was done correctly. 81 | 82 | **Step 3:** Run the Ansible playbook to create new users and do most of the 83 | system configuration 84 | 85 | ## Using Local Mode 86 | 87 | Edit `local.yml` and add the mac address of `eth0` for the Raspberry Pi to 88 | configure to the `macaddrs` variable. Its key should be a mac address (all 89 | lower case) and the value should be the short hostname of that system. Each 90 | such entry's short hostname must match a file in the `host_vars/` directory. 91 | 92 | Then run the playbook: 93 | 94 | (ansible_env) $ ansible-playbook ./local.yml 95 | 96 | The playbook will self-discover its settings, then idempotently configure the 97 | Raspberry Pi. 98 | 99 | That said, it is better to use remote mode (so Ansible ssh'es into localhost) 100 | since that's what I most commonly test. 101 | 102 | ## After running the playbook 103 | 104 | This playbook purposely requires a few manual steps _after_ running the playbook 105 | to ensure that it does not lock you out of your Raspberry Pi. 106 | 107 | 1. If using remote mode, delete the changes you made to `~/.ssh/config` so 108 | that you switch to using the new user that Ansible created for subsequent 109 | Ansible connections. 110 | 111 | 2. While logged in as pi, `sudo passwd glock` (or whatever username you created) 112 | to set a password for that user. This is _not_ required to log in as that 113 | user, but it _is_ required to `sudo` as that user. You may also choose to 114 | set a password for the pi and/or root users. 115 | 116 | 3. `usermod --lock pi` to ensure that the default user is completely disabled. 117 | 118 | You can also use the `lock-default-user.yml` standalone playbook to disable 119 | the default users for all the supported board-specific roles. 120 | 121 | ## Optional configurations 122 | 123 | ### SSH host keys 124 | 125 | This playbook can install ssh host keys. To do so, 126 | 127 | 1. Drop the appropriate `ssh_host_*_key` files into `roles/common/files/etc/ssh/` 128 | 2. Rename each file from `ssh_host_*_key` to `ssh_host_*_key.{{ ansible_hostname }}` 129 | 3. `ansible-vault encrypt roles/common/files/etc/ssh/ssh_host_*_key.*` 130 | 131 | The playbook will detect the presence of these files and install them. 132 | 133 | ## Adding a new host to an existing role 134 | 135 | In broad strokes, the process for adding a new host whose board-specific role 136 | already exists is 137 | 138 | 1. Add the new host to `hosts`. 139 | 2. Creating `host_vars/newhost.yml` and filling it out appropriately. It's 140 | easiest to start with an existing file for the same board type (e.g., 141 | `cloverdale.yml` for Raspberry Pi) and change it. Be sure to change the 142 | `target_hostname` variable at minimum. 143 | 144 | ## Acknowledgment 145 | 146 | I stole a lot of knowledge from https://github.com/giuaig/ansible-raspi-config/. 147 | -------------------------------------------------------------------------------- /ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory=hosts 3 | ask_vault_pass=true 4 | deprecation_warnings=False 5 | 6 | [privilege_escalation] 7 | become=true 8 | become_user=root 9 | become_method=sudo 10 | become_ask_pass=true 11 | -------------------------------------------------------------------------------- /beaglebone.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: beaglebone 3 | module_defaults: 4 | apt: 5 | cache_valid_time: 3600 6 | roles: 7 | - common 8 | - beaglebone 9 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | This directory contains some example outputs from 2 | 3 | ansible -i hosts.remote -m setup cloverdale.local 4 | 5 | or 6 | 7 | ansible -m setup localhost 8 | -------------------------------------------------------------------------------- /docs/facts_rpi3b: -------------------------------------------------------------------------------- 1 | clovermine.local | SUCCESS => { 2 | "ansible_facts": { 3 | "ansible_all_ipv4_addresses": [ 4 | "192.168.1.154" 5 | ], 6 | "ansible_all_ipv6_addresses": [ 7 | "fe80::f40f:e3a9:b243:5db7" 8 | ], 9 | "ansible_apparmor": { 10 | "status": "disabled" 11 | }, 12 | "ansible_architecture": "armv7l", 13 | "ansible_bios_date": "NA", 14 | "ansible_bios_version": "NA", 15 | "ansible_cmdline": { 16 | "8250.nr_uarts": "1", 17 | "bcm2708_fb.fbheight": "480", 18 | "bcm2708_fb.fbswap": "1", 19 | "bcm2708_fb.fbwidth": "640", 20 | "console": "ttyS0,115200", 21 | "dwc_otg.lpm_enable": "0", 22 | "elevator": "deadline", 23 | "fsck.repair": "yes", 24 | "root": "/dev/mmcblk0p7", 25 | "rootfstype": "ext4", 26 | "rootwait": true, 27 | "vc_mem.mem_base": "0x3dc00000", 28 | "vc_mem.mem_size": "0x3f000000" 29 | }, 30 | "ansible_date_time": { 31 | "date": "2020-07-27", 32 | "day": "27", 33 | "epoch": "1595902916", 34 | "hour": "19", 35 | "iso8601": "2020-07-28T02:21:56Z", 36 | "iso8601_basic": "20200727T192156663195", 37 | "iso8601_basic_short": "20200727T192156", 38 | "iso8601_micro": "2020-07-28T02:21:56.663578Z", 39 | "minute": "21", 40 | "month": "07", 41 | "second": "56", 42 | "time": "19:21:56", 43 | "tz": "PDT", 44 | "tz_offset": "-0700", 45 | "weekday": "Monday", 46 | "weekday_number": "1", 47 | "weeknumber": "30", 48 | "year": "2020" 49 | }, 50 | "ansible_default_ipv4": { 51 | "address": "192.168.1.154", 52 | "alias": "wlan0", 53 | "broadcast": "192.168.1.255", 54 | "gateway": "192.168.1.1", 55 | "interface": "wlan0", 56 | "macaddress": "b8:27:eb:39:d7:57", 57 | "mtu": 1500, 58 | "netmask": "255.255.255.0", 59 | "network": "192.168.1.0", 60 | "type": "ether" 61 | }, 62 | "ansible_default_ipv6": {}, 63 | "ansible_device_links": { 64 | "ids": { 65 | "mmcblk0": [ 66 | "mmc-SD32G_0xa4301a4c" 67 | ], 68 | "mmcblk0p1": [ 69 | "mmc-SD32G_0xa4301a4c-part1" 70 | ], 71 | "mmcblk0p2": [ 72 | "mmc-SD32G_0xa4301a4c-part2" 73 | ], 74 | "mmcblk0p5": [ 75 | "mmc-SD32G_0xa4301a4c-part5" 76 | ], 77 | "mmcblk0p6": [ 78 | "mmc-SD32G_0xa4301a4c-part6" 79 | ], 80 | "mmcblk0p7": [ 81 | "mmc-SD32G_0xa4301a4c-part7" 82 | ] 83 | }, 84 | "labels": { 85 | "mmcblk0p1": [ 86 | "RECOVERY" 87 | ], 88 | "mmcblk0p5": [ 89 | "SETTINGS" 90 | ], 91 | "mmcblk0p6": [ 92 | "boot" 93 | ], 94 | "mmcblk0p7": [ 95 | "root0" 96 | ] 97 | }, 98 | "masters": {}, 99 | "uuids": { 100 | "mmcblk0p1": [ 101 | "0403-0201" 102 | ], 103 | "mmcblk0p5": [ 104 | "d524f27a-ae08-4ea5-80da-2249eb2aaf7c" 105 | ], 106 | "mmcblk0p6": [ 107 | "9E86-3165" 108 | ], 109 | "mmcblk0p7": [ 110 | "239c7028-85a7-4024-bc0a-1e79566cc737" 111 | ] 112 | } 113 | }, 114 | "ansible_devices": { 115 | "loop0": { 116 | "holders": [], 117 | "host": "", 118 | "links": { 119 | "ids": [], 120 | "labels": [], 121 | "masters": [], 122 | "uuids": [] 123 | }, 124 | "model": null, 125 | "partitions": {}, 126 | "removable": "0", 127 | "rotational": "1", 128 | "sas_address": null, 129 | "sas_device_handle": null, 130 | "scheduler_mode": "", 131 | "sectors": "0", 132 | "sectorsize": "512", 133 | "size": "0.00 Bytes", 134 | "support_discard": "0", 135 | "vendor": null, 136 | "virtual": 1 137 | }, 138 | "loop1": { 139 | "holders": [], 140 | "host": "", 141 | "links": { 142 | "ids": [], 143 | "labels": [], 144 | "masters": [], 145 | "uuids": [] 146 | }, 147 | "model": null, 148 | "partitions": {}, 149 | "removable": "0", 150 | "rotational": "1", 151 | "sas_address": null, 152 | "sas_device_handle": null, 153 | "scheduler_mode": "", 154 | "sectors": "0", 155 | "sectorsize": "512", 156 | "size": "0.00 Bytes", 157 | "support_discard": "0", 158 | "vendor": null, 159 | "virtual": 1 160 | }, 161 | "loop2": { 162 | "holders": [], 163 | "host": "", 164 | "links": { 165 | "ids": [], 166 | "labels": [], 167 | "masters": [], 168 | "uuids": [] 169 | }, 170 | "model": null, 171 | "partitions": {}, 172 | "removable": "0", 173 | "rotational": "1", 174 | "sas_address": null, 175 | "sas_device_handle": null, 176 | "scheduler_mode": "", 177 | "sectors": "0", 178 | "sectorsize": "512", 179 | "size": "0.00 Bytes", 180 | "support_discard": "0", 181 | "vendor": null, 182 | "virtual": 1 183 | }, 184 | "loop3": { 185 | "holders": [], 186 | "host": "", 187 | "links": { 188 | "ids": [], 189 | "labels": [], 190 | "masters": [], 191 | "uuids": [] 192 | }, 193 | "model": null, 194 | "partitions": {}, 195 | "removable": "0", 196 | "rotational": "1", 197 | "sas_address": null, 198 | "sas_device_handle": null, 199 | "scheduler_mode": "", 200 | "sectors": "0", 201 | "sectorsize": "512", 202 | "size": "0.00 Bytes", 203 | "support_discard": "0", 204 | "vendor": null, 205 | "virtual": 1 206 | }, 207 | "loop4": { 208 | "holders": [], 209 | "host": "", 210 | "links": { 211 | "ids": [], 212 | "labels": [], 213 | "masters": [], 214 | "uuids": [] 215 | }, 216 | "model": null, 217 | "partitions": {}, 218 | "removable": "0", 219 | "rotational": "1", 220 | "sas_address": null, 221 | "sas_device_handle": null, 222 | "scheduler_mode": "", 223 | "sectors": "0", 224 | "sectorsize": "512", 225 | "size": "0.00 Bytes", 226 | "support_discard": "0", 227 | "vendor": null, 228 | "virtual": 1 229 | }, 230 | "loop5": { 231 | "holders": [], 232 | "host": "", 233 | "links": { 234 | "ids": [], 235 | "labels": [], 236 | "masters": [], 237 | "uuids": [] 238 | }, 239 | "model": null, 240 | "partitions": {}, 241 | "removable": "0", 242 | "rotational": "1", 243 | "sas_address": null, 244 | "sas_device_handle": null, 245 | "scheduler_mode": "", 246 | "sectors": "0", 247 | "sectorsize": "512", 248 | "size": "0.00 Bytes", 249 | "support_discard": "0", 250 | "vendor": null, 251 | "virtual": 1 252 | }, 253 | "loop6": { 254 | "holders": [], 255 | "host": "", 256 | "links": { 257 | "ids": [], 258 | "labels": [], 259 | "masters": [], 260 | "uuids": [] 261 | }, 262 | "model": null, 263 | "partitions": {}, 264 | "removable": "0", 265 | "rotational": "1", 266 | "sas_address": null, 267 | "sas_device_handle": null, 268 | "scheduler_mode": "", 269 | "sectors": "0", 270 | "sectorsize": "512", 271 | "size": "0.00 Bytes", 272 | "support_discard": "0", 273 | "vendor": null, 274 | "virtual": 1 275 | }, 276 | "loop7": { 277 | "holders": [], 278 | "host": "", 279 | "links": { 280 | "ids": [], 281 | "labels": [], 282 | "masters": [], 283 | "uuids": [] 284 | }, 285 | "model": null, 286 | "partitions": {}, 287 | "removable": "0", 288 | "rotational": "1", 289 | "sas_address": null, 290 | "sas_device_handle": null, 291 | "scheduler_mode": "", 292 | "sectors": "0", 293 | "sectorsize": "512", 294 | "size": "0.00 Bytes", 295 | "support_discard": "0", 296 | "vendor": null, 297 | "virtual": 1 298 | }, 299 | "mmcblk0": { 300 | "holders": [], 301 | "host": "", 302 | "links": { 303 | "ids": [ 304 | "mmc-SD32G_0xa4301a4c" 305 | ], 306 | "labels": [], 307 | "masters": [], 308 | "uuids": [] 309 | }, 310 | "model": null, 311 | "partitions": { 312 | "mmcblk0p1": { 313 | "holders": [], 314 | "links": { 315 | "ids": [ 316 | "mmc-SD32G_0xa4301a4c-part1" 317 | ], 318 | "labels": [ 319 | "RECOVERY" 320 | ], 321 | "masters": [], 322 | "uuids": [ 323 | "0403-0201" 324 | ] 325 | }, 326 | "sectors": "2280871", 327 | "sectorsize": 512, 328 | "size": "1.09 GB", 329 | "start": "8192", 330 | "uuid": "0403-0201" 331 | }, 332 | "mmcblk0p2": { 333 | "holders": [], 334 | "links": { 335 | "ids": [ 336 | "mmc-SD32G_0xa4301a4c-part2" 337 | ], 338 | "labels": [], 339 | "masters": [], 340 | "uuids": [] 341 | }, 342 | "sectors": "2", 343 | "sectorsize": 512, 344 | "size": "1.00 KB", 345 | "start": "2289063", 346 | "uuid": null 347 | }, 348 | "mmcblk0p5": { 349 | "holders": [], 350 | "links": { 351 | "ids": [ 352 | "mmc-SD32G_0xa4301a4c-part5" 353 | ], 354 | "labels": [ 355 | "SETTINGS" 356 | ], 357 | "masters": [], 358 | "uuids": [ 359 | "d524f27a-ae08-4ea5-80da-2249eb2aaf7c" 360 | ] 361 | }, 362 | "sectors": "65534", 363 | "sectorsize": 512, 364 | "size": "32.00 MB", 365 | "start": "2293760", 366 | "uuid": "d524f27a-ae08-4ea5-80da-2249eb2aaf7c" 367 | }, 368 | "mmcblk0p6": { 369 | "holders": [], 370 | "links": { 371 | "ids": [ 372 | "mmc-SD32G_0xa4301a4c-part6" 373 | ], 374 | "labels": [ 375 | "boot" 376 | ], 377 | "masters": [], 378 | "uuids": [ 379 | "9E86-3165" 380 | ] 381 | }, 382 | "sectors": "135168", 383 | "sectorsize": 512, 384 | "size": "66.00 MB", 385 | "start": "2359296", 386 | "uuid": "9E86-3165" 387 | }, 388 | "mmcblk0p7": { 389 | "holders": [], 390 | "links": { 391 | "ids": [ 392 | "mmc-SD32G_0xa4301a4c-part7" 393 | ], 394 | "labels": [ 395 | "root0" 396 | ], 397 | "masters": [], 398 | "uuids": [ 399 | "239c7028-85a7-4024-bc0a-1e79566cc737" 400 | ] 401 | }, 402 | "sectors": "58916864", 403 | "sectorsize": 512, 404 | "size": "28.09 GB", 405 | "start": "2498560", 406 | "uuid": "239c7028-85a7-4024-bc0a-1e79566cc737" 407 | } 408 | }, 409 | "removable": "0", 410 | "rotational": "0", 411 | "sas_address": null, 412 | "sas_device_handle": null, 413 | "scheduler_mode": "deadline", 414 | "sectors": "61415424", 415 | "sectorsize": "512", 416 | "size": "29.29 GB", 417 | "support_discard": "0", 418 | "vendor": null, 419 | "virtual": 1 420 | }, 421 | "ram0": { 422 | "holders": [], 423 | "host": "", 424 | "links": { 425 | "ids": [], 426 | "labels": [], 427 | "masters": [], 428 | "uuids": [] 429 | }, 430 | "model": null, 431 | "partitions": {}, 432 | "removable": "0", 433 | "rotational": "1", 434 | "sas_address": null, 435 | "sas_device_handle": null, 436 | "scheduler_mode": "", 437 | "sectors": "8192", 438 | "sectorsize": "512", 439 | "size": "4.00 MB", 440 | "support_discard": "4096", 441 | "vendor": null, 442 | "virtual": 1 443 | }, 444 | "ram1": { 445 | "holders": [], 446 | "host": "", 447 | "links": { 448 | "ids": [], 449 | "labels": [], 450 | "masters": [], 451 | "uuids": [] 452 | }, 453 | "model": null, 454 | "partitions": {}, 455 | "removable": "0", 456 | "rotational": "1", 457 | "sas_address": null, 458 | "sas_device_handle": null, 459 | "scheduler_mode": "", 460 | "sectors": "8192", 461 | "sectorsize": "512", 462 | "size": "4.00 MB", 463 | "support_discard": "4096", 464 | "vendor": null, 465 | "virtual": 1 466 | }, 467 | "ram10": { 468 | "holders": [], 469 | "host": "", 470 | "links": { 471 | "ids": [], 472 | "labels": [], 473 | "masters": [], 474 | "uuids": [] 475 | }, 476 | "model": null, 477 | "partitions": {}, 478 | "removable": "0", 479 | "rotational": "1", 480 | "sas_address": null, 481 | "sas_device_handle": null, 482 | "scheduler_mode": "", 483 | "sectors": "8192", 484 | "sectorsize": "512", 485 | "size": "4.00 MB", 486 | "support_discard": "4096", 487 | "vendor": null, 488 | "virtual": 1 489 | }, 490 | "ram11": { 491 | "holders": [], 492 | "host": "", 493 | "links": { 494 | "ids": [], 495 | "labels": [], 496 | "masters": [], 497 | "uuids": [] 498 | }, 499 | "model": null, 500 | "partitions": {}, 501 | "removable": "0", 502 | "rotational": "1", 503 | "sas_address": null, 504 | "sas_device_handle": null, 505 | "scheduler_mode": "", 506 | "sectors": "8192", 507 | "sectorsize": "512", 508 | "size": "4.00 MB", 509 | "support_discard": "4096", 510 | "vendor": null, 511 | "virtual": 1 512 | }, 513 | "ram12": { 514 | "holders": [], 515 | "host": "", 516 | "links": { 517 | "ids": [], 518 | "labels": [], 519 | "masters": [], 520 | "uuids": [] 521 | }, 522 | "model": null, 523 | "partitions": {}, 524 | "removable": "0", 525 | "rotational": "1", 526 | "sas_address": null, 527 | "sas_device_handle": null, 528 | "scheduler_mode": "", 529 | "sectors": "8192", 530 | "sectorsize": "512", 531 | "size": "4.00 MB", 532 | "support_discard": "4096", 533 | "vendor": null, 534 | "virtual": 1 535 | }, 536 | "ram13": { 537 | "holders": [], 538 | "host": "", 539 | "links": { 540 | "ids": [], 541 | "labels": [], 542 | "masters": [], 543 | "uuids": [] 544 | }, 545 | "model": null, 546 | "partitions": {}, 547 | "removable": "0", 548 | "rotational": "1", 549 | "sas_address": null, 550 | "sas_device_handle": null, 551 | "scheduler_mode": "", 552 | "sectors": "8192", 553 | "sectorsize": "512", 554 | "size": "4.00 MB", 555 | "support_discard": "4096", 556 | "vendor": null, 557 | "virtual": 1 558 | }, 559 | "ram14": { 560 | "holders": [], 561 | "host": "", 562 | "links": { 563 | "ids": [], 564 | "labels": [], 565 | "masters": [], 566 | "uuids": [] 567 | }, 568 | "model": null, 569 | "partitions": {}, 570 | "removable": "0", 571 | "rotational": "1", 572 | "sas_address": null, 573 | "sas_device_handle": null, 574 | "scheduler_mode": "", 575 | "sectors": "8192", 576 | "sectorsize": "512", 577 | "size": "4.00 MB", 578 | "support_discard": "4096", 579 | "vendor": null, 580 | "virtual": 1 581 | }, 582 | "ram15": { 583 | "holders": [], 584 | "host": "", 585 | "links": { 586 | "ids": [], 587 | "labels": [], 588 | "masters": [], 589 | "uuids": [] 590 | }, 591 | "model": null, 592 | "partitions": {}, 593 | "removable": "0", 594 | "rotational": "1", 595 | "sas_address": null, 596 | "sas_device_handle": null, 597 | "scheduler_mode": "", 598 | "sectors": "8192", 599 | "sectorsize": "512", 600 | "size": "4.00 MB", 601 | "support_discard": "4096", 602 | "vendor": null, 603 | "virtual": 1 604 | }, 605 | "ram2": { 606 | "holders": [], 607 | "host": "", 608 | "links": { 609 | "ids": [], 610 | "labels": [], 611 | "masters": [], 612 | "uuids": [] 613 | }, 614 | "model": null, 615 | "partitions": {}, 616 | "removable": "0", 617 | "rotational": "1", 618 | "sas_address": null, 619 | "sas_device_handle": null, 620 | "scheduler_mode": "", 621 | "sectors": "8192", 622 | "sectorsize": "512", 623 | "size": "4.00 MB", 624 | "support_discard": "4096", 625 | "vendor": null, 626 | "virtual": 1 627 | }, 628 | "ram3": { 629 | "holders": [], 630 | "host": "", 631 | "links": { 632 | "ids": [], 633 | "labels": [], 634 | "masters": [], 635 | "uuids": [] 636 | }, 637 | "model": null, 638 | "partitions": {}, 639 | "removable": "0", 640 | "rotational": "1", 641 | "sas_address": null, 642 | "sas_device_handle": null, 643 | "scheduler_mode": "", 644 | "sectors": "8192", 645 | "sectorsize": "512", 646 | "size": "4.00 MB", 647 | "support_discard": "4096", 648 | "vendor": null, 649 | "virtual": 1 650 | }, 651 | "ram4": { 652 | "holders": [], 653 | "host": "", 654 | "links": { 655 | "ids": [], 656 | "labels": [], 657 | "masters": [], 658 | "uuids": [] 659 | }, 660 | "model": null, 661 | "partitions": {}, 662 | "removable": "0", 663 | "rotational": "1", 664 | "sas_address": null, 665 | "sas_device_handle": null, 666 | "scheduler_mode": "", 667 | "sectors": "8192", 668 | "sectorsize": "512", 669 | "size": "4.00 MB", 670 | "support_discard": "4096", 671 | "vendor": null, 672 | "virtual": 1 673 | }, 674 | "ram5": { 675 | "holders": [], 676 | "host": "", 677 | "links": { 678 | "ids": [], 679 | "labels": [], 680 | "masters": [], 681 | "uuids": [] 682 | }, 683 | "model": null, 684 | "partitions": {}, 685 | "removable": "0", 686 | "rotational": "1", 687 | "sas_address": null, 688 | "sas_device_handle": null, 689 | "scheduler_mode": "", 690 | "sectors": "8192", 691 | "sectorsize": "512", 692 | "size": "4.00 MB", 693 | "support_discard": "4096", 694 | "vendor": null, 695 | "virtual": 1 696 | }, 697 | "ram6": { 698 | "holders": [], 699 | "host": "", 700 | "links": { 701 | "ids": [], 702 | "labels": [], 703 | "masters": [], 704 | "uuids": [] 705 | }, 706 | "model": null, 707 | "partitions": {}, 708 | "removable": "0", 709 | "rotational": "1", 710 | "sas_address": null, 711 | "sas_device_handle": null, 712 | "scheduler_mode": "", 713 | "sectors": "8192", 714 | "sectorsize": "512", 715 | "size": "4.00 MB", 716 | "support_discard": "4096", 717 | "vendor": null, 718 | "virtual": 1 719 | }, 720 | "ram7": { 721 | "holders": [], 722 | "host": "", 723 | "links": { 724 | "ids": [], 725 | "labels": [], 726 | "masters": [], 727 | "uuids": [] 728 | }, 729 | "model": null, 730 | "partitions": {}, 731 | "removable": "0", 732 | "rotational": "1", 733 | "sas_address": null, 734 | "sas_device_handle": null, 735 | "scheduler_mode": "", 736 | "sectors": "8192", 737 | "sectorsize": "512", 738 | "size": "4.00 MB", 739 | "support_discard": "4096", 740 | "vendor": null, 741 | "virtual": 1 742 | }, 743 | "ram8": { 744 | "holders": [], 745 | "host": "", 746 | "links": { 747 | "ids": [], 748 | "labels": [], 749 | "masters": [], 750 | "uuids": [] 751 | }, 752 | "model": null, 753 | "partitions": {}, 754 | "removable": "0", 755 | "rotational": "1", 756 | "sas_address": null, 757 | "sas_device_handle": null, 758 | "scheduler_mode": "", 759 | "sectors": "8192", 760 | "sectorsize": "512", 761 | "size": "4.00 MB", 762 | "support_discard": "4096", 763 | "vendor": null, 764 | "virtual": 1 765 | }, 766 | "ram9": { 767 | "holders": [], 768 | "host": "", 769 | "links": { 770 | "ids": [], 771 | "labels": [], 772 | "masters": [], 773 | "uuids": [] 774 | }, 775 | "model": null, 776 | "partitions": {}, 777 | "removable": "0", 778 | "rotational": "1", 779 | "sas_address": null, 780 | "sas_device_handle": null, 781 | "scheduler_mode": "", 782 | "sectors": "8192", 783 | "sectorsize": "512", 784 | "size": "4.00 MB", 785 | "support_discard": "4096", 786 | "vendor": null, 787 | "virtual": 1 788 | } 789 | }, 790 | "ansible_distribution": "Debian", 791 | "ansible_distribution_file_parsed": true, 792 | "ansible_distribution_file_path": "/etc/os-release", 793 | "ansible_distribution_file_variety": "Debian", 794 | "ansible_distribution_major_version": "9", 795 | "ansible_distribution_release": "stretch", 796 | "ansible_distribution_version": "9", 797 | "ansible_dns": { 798 | "nameservers": [ 799 | "8.8.8.8", 800 | "8.8.4.4" 801 | ] 802 | }, 803 | "ansible_domain": "local", 804 | "ansible_effective_group_id": 100, 805 | "ansible_effective_user_id": 1024, 806 | "ansible_env": { 807 | "HOME": "/home/glock", 808 | "LANG": "C", 809 | "LC_ALL": "C", 810 | "LC_NUMERIC": "C", 811 | "LOGNAME": "glock", 812 | "MAIL": "/var/mail/glock", 813 | "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/games", 814 | "PWD": "/home/glock", 815 | "SHELL": "/bin/bash", 816 | "SHLVL": "1", 817 | "SSH_CLIENT": "fe80::18:6085:f023:b910%wlan0 57418 22", 818 | "SSH_CONNECTION": "fe80::18:6085:f023:b910%wlan0 57418 fe80::f40f:e3a9:b243:5db7%wlan0 22", 819 | "SSH_TTY": "/dev/pts/2", 820 | "TERM": "xterm", 821 | "USER": "glock", 822 | "XDG_RUNTIME_DIR": "/run/user/1024", 823 | "XDG_SESSION_ID": "c241", 824 | "_": "/bin/sh" 825 | }, 826 | "ansible_eth0": { 827 | "active": false, 828 | "device": "eth0", 829 | "macaddress": "b8:27:eb:6c:82:02", 830 | "module": "smsc95xx", 831 | "mtu": 1500, 832 | "pciid": "1-1.1:1.0", 833 | "promisc": false, 834 | "speed": 10, 835 | "type": "ether" 836 | }, 837 | "ansible_fibre_channel_wwn": [], 838 | "ansible_fips": false, 839 | "ansible_form_factor": "NA", 840 | "ansible_fqdn": "clovermine.local", 841 | "ansible_hostname": "clovermine", 842 | "ansible_hostnqn": "", 843 | "ansible_interfaces": [ 844 | "lo", 845 | "wlan0", 846 | "eth0" 847 | ], 848 | "ansible_is_chroot": false, 849 | "ansible_iscsi_iqn": "", 850 | "ansible_kernel": "4.9.35-v7+", 851 | "ansible_kernel_version": "#1014 SMP Fri Jun 30 14:47:43 BST 2017", 852 | "ansible_lo": { 853 | "active": true, 854 | "device": "lo", 855 | "ipv4": { 856 | "address": "127.0.0.1", 857 | "broadcast": "host", 858 | "netmask": "255.0.0.0", 859 | "network": "127.0.0.0" 860 | }, 861 | "ipv6": [ 862 | { 863 | "address": "::1", 864 | "prefix": "128", 865 | "scope": "host" 866 | } 867 | ], 868 | "mtu": 65536, 869 | "promisc": false, 870 | "type": "loopback" 871 | }, 872 | "ansible_local": {}, 873 | "ansible_lsb": { 874 | "codename": "stretch", 875 | "description": "Raspbian GNU/Linux 9.13 (stretch)", 876 | "id": "Raspbian", 877 | "major_release": "9", 878 | "release": "9.13" 879 | }, 880 | "ansible_machine": "armv7l", 881 | "ansible_machine_id": "2e7311d7868244978f314762db251c8e", 882 | "ansible_memfree_mb": 249, 883 | "ansible_memory_mb": { 884 | "nocache": { 885 | "free": 649, 886 | "used": 210 887 | }, 888 | "real": { 889 | "free": 249, 890 | "total": 859, 891 | "used": 610 892 | }, 893 | "swap": { 894 | "cached": 0, 895 | "free": 89, 896 | "total": 99, 897 | "used": 10 898 | } 899 | }, 900 | "ansible_memtotal_mb": 859, 901 | "ansible_mounts": [ 902 | { 903 | "block_available": 22473, 904 | "block_size": 2048, 905 | "block_total": 33717, 906 | "block_used": 11244, 907 | "device": "/dev/mmcblk0p6", 908 | "fstype": "vfat", 909 | "inode_available": 0, 910 | "inode_total": 0, 911 | "inode_used": 0, 912 | "mount": "/boot", 913 | "options": "rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro", 914 | "size_available": 46024704, 915 | "size_total": 69052416, 916 | "uuid": "9E86-3165" 917 | }, 918 | { 919 | "block_available": 5053333, 920 | "block_size": 4096, 921 | "block_total": 7216157, 922 | "block_used": 2162824, 923 | "device": "/dev/root", 924 | "fstype": "ext4", 925 | "inode_available": 1655466, 926 | "inode_total": 1843200, 927 | "inode_used": 187734, 928 | "mount": "/", 929 | "options": "rw,noatime,data=ordered", 930 | "size_available": 20698451968, 931 | "size_total": 29557379072, 932 | "uuid": "N/A" 933 | } 934 | ], 935 | "ansible_nodename": "clovermine", 936 | "ansible_os_family": "Debian", 937 | "ansible_pkg_mgr": "apt", 938 | "ansible_proc_cmdline": { 939 | "8250.nr_uarts": "1", 940 | "bcm2708_fb.fbheight": "480", 941 | "bcm2708_fb.fbswap": "1", 942 | "bcm2708_fb.fbwidth": "640", 943 | "console": [ 944 | "tty1", 945 | "ttyS0,115200" 946 | ], 947 | "dwc_otg.lpm_enable": "0", 948 | "elevator": "deadline", 949 | "fsck.repair": "yes", 950 | "root": "/dev/mmcblk0p7", 951 | "rootfstype": "ext4", 952 | "rootwait": true, 953 | "vc_mem.mem_base": "0x3dc00000", 954 | "vc_mem.mem_size": "0x3f000000" 955 | }, 956 | "ansible_processor": [ 957 | "0", 958 | "ARMv7 Processor rev 4 (v7l)", 959 | "1", 960 | "ARMv7 Processor rev 4 (v7l)", 961 | "2", 962 | "ARMv7 Processor rev 4 (v7l)", 963 | "3", 964 | "ARMv7 Processor rev 4 (v7l)" 965 | ], 966 | "ansible_processor_cores": 1, 967 | "ansible_processor_count": 4, 968 | "ansible_processor_threads_per_core": 1, 969 | "ansible_processor_vcpus": 4, 970 | "ansible_product_name": "NA", 971 | "ansible_product_serial": "NA", 972 | "ansible_product_uuid": "NA", 973 | "ansible_product_version": "NA", 974 | "ansible_python": { 975 | "executable": "/usr/bin/python", 976 | "has_sslcontext": true, 977 | "type": "CPython", 978 | "version": { 979 | "major": 2, 980 | "micro": 13, 981 | "minor": 7, 982 | "releaselevel": "final", 983 | "serial": 0 984 | }, 985 | "version_info": [ 986 | 2, 987 | 7, 988 | 13, 989 | "final", 990 | 0 991 | ] 992 | }, 993 | "ansible_python_version": "2.7.13", 994 | "ansible_real_group_id": 100, 995 | "ansible_real_user_id": 1024, 996 | "ansible_selinux": { 997 | "status": "disabled" 998 | }, 999 | "ansible_selinux_python_present": true, 1000 | "ansible_service_mgr": "systemd", 1001 | "ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBAJfkcN76AW7smYrJWIahxIZvr1dXAdvCkpH0k1VOvtH4FngoFt1FHAaIognmJMW60BV0f/vBuvDMo4Vbcw/h0TrRwQNmZ1TLEE6mXHjLZ6FF8gqZ16hcjf/UMoy+vitDxilXIevBvmm+BdH9gH+RPPlN+ftfYqBNdIGfjHaLER9ZAAAAFQDiUihS+dclz5gRvVhCzbdagmfbjwAAAIBlb/iqpzkxXrWONY3PawJUdDbaD72WXKTaJ/1JMk/wjNnofZN5q4+5hFe90LSdNUXu3CTy8dUmuluO0Jn+QvN+Db1tl6QzXiTHjzhhwsLn5QI95HtdQrEKXP9MTckxk69XxLKwV0rZxXkTiHiCkdMMMkdKN6oBGKxHNKXqpWxhrgAAAIAxB6Or+VM5QtlQ2ymtpNKt7MiHfDaEXHkVWNsUhlk8/W+ER+7KQe7dc9bLZEo2EVKWZgQQ4XEY1gtO74EUgm7G4+K4xTGx2QdHWahTtfPekmdMZHE+/MT0JenFCctBsPN26B2EKV1jUjiJj+EMEpHQK5iq/+2LoYolEN+sHk/VaA==", 1002 | "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJ84asYC18I1fAyZNp1FrNPnuAkHFJ9nOadj/vlyVFVNg0Seg/XPJC+F05HO5pGIHLaFYthYOY4O5DablKSLsYs=", 1003 | "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIPxcLuysA3Ay1TazYmBMrFkOa2nqUy3Hu9FXPwFKzBCI", 1004 | "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCw7cTXnGR9tqGAbftz/+ldETO+kQ0EJbETWj0AFqPHyRrq6l+0V8XgYcKURgWfkEKDdGp2jaG3/1Ten+qzEpT3Wm7uEnF6A6QiTG/xfE/a4LSwSEK7RL9wthDEDY+5lCTYCdQc9durqIP4WkOXGFC8MDCSgGZRiTzz6HkyeXgwniRWe7xQSEyo5qncT+ekcG+PkKGcfWDMAN81Di9PKX+Yyvgrit+/j91gLTA1CqfzSUe0MFSEixID6vO2DjQdVVnkzGufNDJpI1NJYSuHGcrMHMNc0bjUGXoKYU5egG/AnxYMM+y+5mUrq5//wsOftIlN3aIdZ/S8czM/Mnrw3Qa3", 1005 | "ansible_swapfree_mb": 89, 1006 | "ansible_swaptotal_mb": 99, 1007 | "ansible_system": "Linux", 1008 | "ansible_system_capabilities": [ 1009 | "" 1010 | ], 1011 | "ansible_system_capabilities_enforced": "True", 1012 | "ansible_system_vendor": "NA", 1013 | "ansible_uptime_seconds": 16333215, 1014 | "ansible_user_dir": "/home/glock", 1015 | "ansible_user_gecos": "Glenn K. Lockwood", 1016 | "ansible_user_gid": 100, 1017 | "ansible_user_id": "glock", 1018 | "ansible_user_shell": "/bin/bash", 1019 | "ansible_user_uid": 1024, 1020 | "ansible_userspace_bits": "32", 1021 | "ansible_virtualization_role": "NA", 1022 | "ansible_virtualization_type": "NA", 1023 | "ansible_wlan0": { 1024 | "active": true, 1025 | "device": "wlan0", 1026 | "ipv4": { 1027 | "address": "192.168.1.154", 1028 | "broadcast": "192.168.1.255", 1029 | "netmask": "255.255.255.0", 1030 | "network": "192.168.1.0" 1031 | }, 1032 | "ipv6": [ 1033 | { 1034 | "address": "fe80::f40f:e3a9:b243:5db7", 1035 | "prefix": "64", 1036 | "scope": "link" 1037 | } 1038 | ], 1039 | "macaddress": "b8:27:eb:39:d7:57", 1040 | "module": "brcmfmac", 1041 | "mtu": 1500, 1042 | "pciid": "mmc1:0001:1", 1043 | "promisc": false, 1044 | "type": "ether" 1045 | }, 1046 | "discovered_interpreter_python": "/usr/bin/python", 1047 | "gather_subset": [ 1048 | "all" 1049 | ], 1050 | "module_setup": true 1051 | }, 1052 | "changed": false 1053 | } 1054 | -------------------------------------------------------------------------------- /docs/facts_rpi4: -------------------------------------------------------------------------------- 1 | localhost | SUCCESS => { 2 | "ansible_facts": { 3 | "ansible_all_ipv4_addresses": [ 4 | "192.168.1.155" 5 | ], 6 | "ansible_all_ipv6_addresses": [ 7 | "fe80::9f95:e18d:8283:8942" 8 | ], 9 | "ansible_apparmor": { 10 | "status": "disabled" 11 | }, 12 | "ansible_architecture": "armv7l", 13 | "ansible_bios_date": "NA", 14 | "ansible_bios_version": "NA", 15 | "ansible_cmdline": { 16 | "8250.nr_uarts": "1", 17 | "cma": "256M", 18 | "coherent_pool": "1M", 19 | "console": "tty1", 20 | "elevator": "deadline", 21 | "fsck.repair": "yes", 22 | "root": "/dev/mmcblk0p7", 23 | "rootfstype": "ext4", 24 | "rootwait": true, 25 | "smsc95xx.macaddr": "DC:A6:32:8C:8A:53", 26 | "snd_bcm2835.enable_compat_alsa": "0", 27 | "snd_bcm2835.enable_hdmi": "1", 28 | "snd_bcm2835.enable_headphones": "1", 29 | "vc_mem.mem_base": "0x3ec00000", 30 | "vc_mem.mem_size": "0x40000000", 31 | "video": "HDMI-A-1:3840x2160M@30" 32 | }, 33 | "ansible_date_time": { 34 | "date": "2020-07-26", 35 | "day": "26", 36 | "epoch": "1595812457", 37 | "hour": "18", 38 | "iso8601": "2020-07-27T01:14:17Z", 39 | "iso8601_basic": "20200726T181417180348", 40 | "iso8601_basic_short": "20200726T181417", 41 | "iso8601_micro": "2020-07-27T01:14:17.180646Z", 42 | "minute": "14", 43 | "month": "07", 44 | "second": "17", 45 | "time": "18:14:17", 46 | "tz": "PDT", 47 | "tz_offset": "-0700", 48 | "weekday": "Sunday", 49 | "weekday_number": "0", 50 | "weeknumber": "29", 51 | "year": "2020" 52 | }, 53 | "ansible_default_ipv4": { 54 | "address": "192.168.1.155", 55 | "alias": "wlan0", 56 | "broadcast": "192.168.1.255", 57 | "gateway": "192.168.1.1", 58 | "interface": "wlan0", 59 | "macaddress": "dc:a6:32:8c:8a:54", 60 | "mtu": 1500, 61 | "netmask": "255.255.255.0", 62 | "network": "192.168.1.0", 63 | "type": "ether" 64 | }, 65 | "ansible_default_ipv6": {}, 66 | "ansible_device_links": { 67 | "ids": { 68 | "mmcblk0": [ 69 | "mmc-SL32G_0x13ee3781" 70 | ], 71 | "mmcblk0p1": [ 72 | "mmc-SL32G_0x13ee3781-part1" 73 | ], 74 | "mmcblk0p2": [ 75 | "mmc-SL32G_0x13ee3781-part2" 76 | ], 77 | "mmcblk0p5": [ 78 | "mmc-SL32G_0x13ee3781-part5" 79 | ], 80 | "mmcblk0p6": [ 81 | "mmc-SL32G_0x13ee3781-part6" 82 | ], 83 | "mmcblk0p7": [ 84 | "mmc-SL32G_0x13ee3781-part7" 85 | ], 86 | "sda": [ 87 | "usb-Generic_Card-Reader_20100120100004-0:0" 88 | ] 89 | }, 90 | "labels": { 91 | "mmcblk0p1": [ 92 | "RECOVERY" 93 | ], 94 | "mmcblk0p5": [ 95 | "SETTINGS" 96 | ], 97 | "mmcblk0p6": [ 98 | "boot" 99 | ], 100 | "mmcblk0p7": [ 101 | "root" 102 | ] 103 | }, 104 | "masters": {}, 105 | "uuids": { 106 | "mmcblk0p1": [ 107 | "6633-3633" 108 | ], 109 | "mmcblk0p5": [ 110 | "ac254cdb-163e-4a1c-b9d7-cf34ec8751af" 111 | ], 112 | "mmcblk0p6": [ 113 | "75C7-43FE" 114 | ], 115 | "mmcblk0p7": [ 116 | "ab4714ec-1e29-4d1f-a3a4-c46723992862" 117 | ] 118 | } 119 | }, 120 | "ansible_devices": { 121 | "loop0": { 122 | "holders": [], 123 | "host": "", 124 | "links": { 125 | "ids": [], 126 | "labels": [], 127 | "masters": [], 128 | "uuids": [] 129 | }, 130 | "model": null, 131 | "partitions": {}, 132 | "removable": "0", 133 | "rotational": "1", 134 | "sas_address": null, 135 | "sas_device_handle": null, 136 | "scheduler_mode": "mq-deadline", 137 | "sectors": "0", 138 | "sectorsize": "512", 139 | "size": "0.00 Bytes", 140 | "support_discard": "0", 141 | "vendor": null, 142 | "virtual": 1 143 | }, 144 | "loop1": { 145 | "holders": [], 146 | "host": "", 147 | "links": { 148 | "ids": [], 149 | "labels": [], 150 | "masters": [], 151 | "uuids": [] 152 | }, 153 | "model": null, 154 | "partitions": {}, 155 | "removable": "0", 156 | "rotational": "1", 157 | "sas_address": null, 158 | "sas_device_handle": null, 159 | "scheduler_mode": "mq-deadline", 160 | "sectors": "0", 161 | "sectorsize": "512", 162 | "size": "0.00 Bytes", 163 | "support_discard": "0", 164 | "vendor": null, 165 | "virtual": 1 166 | }, 167 | "loop2": { 168 | "holders": [], 169 | "host": "", 170 | "links": { 171 | "ids": [], 172 | "labels": [], 173 | "masters": [], 174 | "uuids": [] 175 | }, 176 | "model": null, 177 | "partitions": {}, 178 | "removable": "0", 179 | "rotational": "1", 180 | "sas_address": null, 181 | "sas_device_handle": null, 182 | "scheduler_mode": "mq-deadline", 183 | "sectors": "0", 184 | "sectorsize": "512", 185 | "size": "0.00 Bytes", 186 | "support_discard": "0", 187 | "vendor": null, 188 | "virtual": 1 189 | }, 190 | "loop3": { 191 | "holders": [], 192 | "host": "", 193 | "links": { 194 | "ids": [], 195 | "labels": [], 196 | "masters": [], 197 | "uuids": [] 198 | }, 199 | "model": null, 200 | "partitions": {}, 201 | "removable": "0", 202 | "rotational": "1", 203 | "sas_address": null, 204 | "sas_device_handle": null, 205 | "scheduler_mode": "mq-deadline", 206 | "sectors": "0", 207 | "sectorsize": "512", 208 | "size": "0.00 Bytes", 209 | "support_discard": "0", 210 | "vendor": null, 211 | "virtual": 1 212 | }, 213 | "loop4": { 214 | "holders": [], 215 | "host": "", 216 | "links": { 217 | "ids": [], 218 | "labels": [], 219 | "masters": [], 220 | "uuids": [] 221 | }, 222 | "model": null, 223 | "partitions": {}, 224 | "removable": "0", 225 | "rotational": "1", 226 | "sas_address": null, 227 | "sas_device_handle": null, 228 | "scheduler_mode": "mq-deadline", 229 | "sectors": "0", 230 | "sectorsize": "512", 231 | "size": "0.00 Bytes", 232 | "support_discard": "0", 233 | "vendor": null, 234 | "virtual": 1 235 | }, 236 | "loop5": { 237 | "holders": [], 238 | "host": "", 239 | "links": { 240 | "ids": [], 241 | "labels": [], 242 | "masters": [], 243 | "uuids": [] 244 | }, 245 | "model": null, 246 | "partitions": {}, 247 | "removable": "0", 248 | "rotational": "1", 249 | "sas_address": null, 250 | "sas_device_handle": null, 251 | "scheduler_mode": "mq-deadline", 252 | "sectors": "0", 253 | "sectorsize": "512", 254 | "size": "0.00 Bytes", 255 | "support_discard": "0", 256 | "vendor": null, 257 | "virtual": 1 258 | }, 259 | "loop6": { 260 | "holders": [], 261 | "host": "", 262 | "links": { 263 | "ids": [], 264 | "labels": [], 265 | "masters": [], 266 | "uuids": [] 267 | }, 268 | "model": null, 269 | "partitions": {}, 270 | "removable": "0", 271 | "rotational": "1", 272 | "sas_address": null, 273 | "sas_device_handle": null, 274 | "scheduler_mode": "mq-deadline", 275 | "sectors": "0", 276 | "sectorsize": "512", 277 | "size": "0.00 Bytes", 278 | "support_discard": "0", 279 | "vendor": null, 280 | "virtual": 1 281 | }, 282 | "loop7": { 283 | "holders": [], 284 | "host": "", 285 | "links": { 286 | "ids": [], 287 | "labels": [], 288 | "masters": [], 289 | "uuids": [] 290 | }, 291 | "model": null, 292 | "partitions": {}, 293 | "removable": "0", 294 | "rotational": "1", 295 | "sas_address": null, 296 | "sas_device_handle": null, 297 | "scheduler_mode": "mq-deadline", 298 | "sectors": "0", 299 | "sectorsize": "512", 300 | "size": "0.00 Bytes", 301 | "support_discard": "0", 302 | "vendor": null, 303 | "virtual": 1 304 | }, 305 | "mmcblk0": { 306 | "holders": [], 307 | "host": "", 308 | "links": { 309 | "ids": [ 310 | "mmc-SL32G_0x13ee3781" 311 | ], 312 | "labels": [], 313 | "masters": [], 314 | "uuids": [] 315 | }, 316 | "model": null, 317 | "partitions": { 318 | "mmcblk0p1": { 319 | "holders": [], 320 | "links": { 321 | "ids": [ 322 | "mmc-SL32G_0x13ee3781-part1" 323 | ], 324 | "labels": [ 325 | "RECOVERY" 326 | ], 327 | "masters": [], 328 | "uuids": [ 329 | "6633-3633" 330 | ] 331 | }, 332 | "sectors": "4968371", 333 | "sectorsize": 512, 334 | "size": "2.37 GB", 335 | "start": "8192", 336 | "uuid": "6633-3633" 337 | }, 338 | "mmcblk0p2": { 339 | "holders": [], 340 | "links": { 341 | "ids": [ 342 | "mmc-SL32G_0x13ee3781-part2" 343 | ], 344 | "labels": [], 345 | "masters": [], 346 | "uuids": [] 347 | }, 348 | "sectors": "2", 349 | "sectorsize": 512, 350 | "size": "1.00 KB", 351 | "start": "4976563", 352 | "uuid": null 353 | }, 354 | "mmcblk0p5": { 355 | "holders": [], 356 | "links": { 357 | "ids": [ 358 | "mmc-SL32G_0x13ee3781-part5" 359 | ], 360 | "labels": [ 361 | "SETTINGS" 362 | ], 363 | "masters": [], 364 | "uuids": [ 365 | "ac254cdb-163e-4a1c-b9d7-cf34ec8751af" 366 | ] 367 | }, 368 | "sectors": "65534", 369 | "sectorsize": 512, 370 | "size": "32.00 MB", 371 | "start": "4980736", 372 | "uuid": "ac254cdb-163e-4a1c-b9d7-cf34ec8751af" 373 | }, 374 | "mmcblk0p6": { 375 | "holders": [], 376 | "links": { 377 | "ids": [ 378 | "mmc-SL32G_0x13ee3781-part6" 379 | ], 380 | "labels": [ 381 | "boot" 382 | ], 383 | "masters": [], 384 | "uuids": [ 385 | "75C7-43FE" 386 | ] 387 | }, 388 | "sectors": "524286", 389 | "sectorsize": 512, 390 | "size": "256.00 MB", 391 | "start": "5046272", 392 | "uuid": "75C7-43FE" 393 | }, 394 | "mmcblk0p7": { 395 | "holders": [], 396 | "links": { 397 | "ids": [ 398 | "mmc-SL32G_0x13ee3781-part7" 399 | ], 400 | "labels": [ 401 | "root" 402 | ], 403 | "masters": [], 404 | "uuids": [ 405 | "ab4714ec-1e29-4d1f-a3a4-c46723992862" 406 | ] 407 | }, 408 | "sectors": "56763392", 409 | "sectorsize": 512, 410 | "size": "27.07 GB", 411 | "start": "5570560", 412 | "uuid": "ab4714ec-1e29-4d1f-a3a4-c46723992862" 413 | } 414 | }, 415 | "removable": "0", 416 | "rotational": "0", 417 | "sas_address": null, 418 | "sas_device_handle": null, 419 | "scheduler_mode": "mq-deadline", 420 | "sectors": "62333952", 421 | "sectorsize": "512", 422 | "size": "29.72 GB", 423 | "support_discard": "4194304", 424 | "vendor": null, 425 | "virtual": 1 426 | }, 427 | "ram0": { 428 | "holders": [], 429 | "host": "", 430 | "links": { 431 | "ids": [], 432 | "labels": [], 433 | "masters": [], 434 | "uuids": [] 435 | }, 436 | "model": null, 437 | "partitions": {}, 438 | "removable": "0", 439 | "rotational": "0", 440 | "sas_address": null, 441 | "sas_device_handle": null, 442 | "scheduler_mode": "", 443 | "sectors": "8192", 444 | "sectorsize": "512", 445 | "size": "4.00 MB", 446 | "support_discard": "0", 447 | "vendor": null, 448 | "virtual": 1 449 | }, 450 | "ram1": { 451 | "holders": [], 452 | "host": "", 453 | "links": { 454 | "ids": [], 455 | "labels": [], 456 | "masters": [], 457 | "uuids": [] 458 | }, 459 | "model": null, 460 | "partitions": {}, 461 | "removable": "0", 462 | "rotational": "0", 463 | "sas_address": null, 464 | "sas_device_handle": null, 465 | "scheduler_mode": "", 466 | "sectors": "8192", 467 | "sectorsize": "512", 468 | "size": "4.00 MB", 469 | "support_discard": "0", 470 | "vendor": null, 471 | "virtual": 1 472 | }, 473 | "ram10": { 474 | "holders": [], 475 | "host": "", 476 | "links": { 477 | "ids": [], 478 | "labels": [], 479 | "masters": [], 480 | "uuids": [] 481 | }, 482 | "model": null, 483 | "partitions": {}, 484 | "removable": "0", 485 | "rotational": "0", 486 | "sas_address": null, 487 | "sas_device_handle": null, 488 | "scheduler_mode": "", 489 | "sectors": "8192", 490 | "sectorsize": "512", 491 | "size": "4.00 MB", 492 | "support_discard": "0", 493 | "vendor": null, 494 | "virtual": 1 495 | }, 496 | "ram11": { 497 | "holders": [], 498 | "host": "", 499 | "links": { 500 | "ids": [], 501 | "labels": [], 502 | "masters": [], 503 | "uuids": [] 504 | }, 505 | "model": null, 506 | "partitions": {}, 507 | "removable": "0", 508 | "rotational": "0", 509 | "sas_address": null, 510 | "sas_device_handle": null, 511 | "scheduler_mode": "", 512 | "sectors": "8192", 513 | "sectorsize": "512", 514 | "size": "4.00 MB", 515 | "support_discard": "0", 516 | "vendor": null, 517 | "virtual": 1 518 | }, 519 | "ram12": { 520 | "holders": [], 521 | "host": "", 522 | "links": { 523 | "ids": [], 524 | "labels": [], 525 | "masters": [], 526 | "uuids": [] 527 | }, 528 | "model": null, 529 | "partitions": {}, 530 | "removable": "0", 531 | "rotational": "0", 532 | "sas_address": null, 533 | "sas_device_handle": null, 534 | "scheduler_mode": "", 535 | "sectors": "8192", 536 | "sectorsize": "512", 537 | "size": "4.00 MB", 538 | "support_discard": "0", 539 | "vendor": null, 540 | "virtual": 1 541 | }, 542 | "ram13": { 543 | "holders": [], 544 | "host": "", 545 | "links": { 546 | "ids": [], 547 | "labels": [], 548 | "masters": [], 549 | "uuids": [] 550 | }, 551 | "model": null, 552 | "partitions": {}, 553 | "removable": "0", 554 | "rotational": "0", 555 | "sas_address": null, 556 | "sas_device_handle": null, 557 | "scheduler_mode": "", 558 | "sectors": "8192", 559 | "sectorsize": "512", 560 | "size": "4.00 MB", 561 | "support_discard": "0", 562 | "vendor": null, 563 | "virtual": 1 564 | }, 565 | "ram14": { 566 | "holders": [], 567 | "host": "", 568 | "links": { 569 | "ids": [], 570 | "labels": [], 571 | "masters": [], 572 | "uuids": [] 573 | }, 574 | "model": null, 575 | "partitions": {}, 576 | "removable": "0", 577 | "rotational": "0", 578 | "sas_address": null, 579 | "sas_device_handle": null, 580 | "scheduler_mode": "", 581 | "sectors": "8192", 582 | "sectorsize": "512", 583 | "size": "4.00 MB", 584 | "support_discard": "0", 585 | "vendor": null, 586 | "virtual": 1 587 | }, 588 | "ram15": { 589 | "holders": [], 590 | "host": "", 591 | "links": { 592 | "ids": [], 593 | "labels": [], 594 | "masters": [], 595 | "uuids": [] 596 | }, 597 | "model": null, 598 | "partitions": {}, 599 | "removable": "0", 600 | "rotational": "0", 601 | "sas_address": null, 602 | "sas_device_handle": null, 603 | "scheduler_mode": "", 604 | "sectors": "8192", 605 | "sectorsize": "512", 606 | "size": "4.00 MB", 607 | "support_discard": "0", 608 | "vendor": null, 609 | "virtual": 1 610 | }, 611 | "ram2": { 612 | "holders": [], 613 | "host": "", 614 | "links": { 615 | "ids": [], 616 | "labels": [], 617 | "masters": [], 618 | "uuids": [] 619 | }, 620 | "model": null, 621 | "partitions": {}, 622 | "removable": "0", 623 | "rotational": "0", 624 | "sas_address": null, 625 | "sas_device_handle": null, 626 | "scheduler_mode": "", 627 | "sectors": "8192", 628 | "sectorsize": "512", 629 | "size": "4.00 MB", 630 | "support_discard": "0", 631 | "vendor": null, 632 | "virtual": 1 633 | }, 634 | "ram3": { 635 | "holders": [], 636 | "host": "", 637 | "links": { 638 | "ids": [], 639 | "labels": [], 640 | "masters": [], 641 | "uuids": [] 642 | }, 643 | "model": null, 644 | "partitions": {}, 645 | "removable": "0", 646 | "rotational": "0", 647 | "sas_address": null, 648 | "sas_device_handle": null, 649 | "scheduler_mode": "", 650 | "sectors": "8192", 651 | "sectorsize": "512", 652 | "size": "4.00 MB", 653 | "support_discard": "0", 654 | "vendor": null, 655 | "virtual": 1 656 | }, 657 | "ram4": { 658 | "holders": [], 659 | "host": "", 660 | "links": { 661 | "ids": [], 662 | "labels": [], 663 | "masters": [], 664 | "uuids": [] 665 | }, 666 | "model": null, 667 | "partitions": {}, 668 | "removable": "0", 669 | "rotational": "0", 670 | "sas_address": null, 671 | "sas_device_handle": null, 672 | "scheduler_mode": "", 673 | "sectors": "8192", 674 | "sectorsize": "512", 675 | "size": "4.00 MB", 676 | "support_discard": "0", 677 | "vendor": null, 678 | "virtual": 1 679 | }, 680 | "ram5": { 681 | "holders": [], 682 | "host": "", 683 | "links": { 684 | "ids": [], 685 | "labels": [], 686 | "masters": [], 687 | "uuids": [] 688 | }, 689 | "model": null, 690 | "partitions": {}, 691 | "removable": "0", 692 | "rotational": "0", 693 | "sas_address": null, 694 | "sas_device_handle": null, 695 | "scheduler_mode": "", 696 | "sectors": "8192", 697 | "sectorsize": "512", 698 | "size": "4.00 MB", 699 | "support_discard": "0", 700 | "vendor": null, 701 | "virtual": 1 702 | }, 703 | "ram6": { 704 | "holders": [], 705 | "host": "", 706 | "links": { 707 | "ids": [], 708 | "labels": [], 709 | "masters": [], 710 | "uuids": [] 711 | }, 712 | "model": null, 713 | "partitions": {}, 714 | "removable": "0", 715 | "rotational": "0", 716 | "sas_address": null, 717 | "sas_device_handle": null, 718 | "scheduler_mode": "", 719 | "sectors": "8192", 720 | "sectorsize": "512", 721 | "size": "4.00 MB", 722 | "support_discard": "0", 723 | "vendor": null, 724 | "virtual": 1 725 | }, 726 | "ram7": { 727 | "holders": [], 728 | "host": "", 729 | "links": { 730 | "ids": [], 731 | "labels": [], 732 | "masters": [], 733 | "uuids": [] 734 | }, 735 | "model": null, 736 | "partitions": {}, 737 | "removable": "0", 738 | "rotational": "0", 739 | "sas_address": null, 740 | "sas_device_handle": null, 741 | "scheduler_mode": "", 742 | "sectors": "8192", 743 | "sectorsize": "512", 744 | "size": "4.00 MB", 745 | "support_discard": "0", 746 | "vendor": null, 747 | "virtual": 1 748 | }, 749 | "ram8": { 750 | "holders": [], 751 | "host": "", 752 | "links": { 753 | "ids": [], 754 | "labels": [], 755 | "masters": [], 756 | "uuids": [] 757 | }, 758 | "model": null, 759 | "partitions": {}, 760 | "removable": "0", 761 | "rotational": "0", 762 | "sas_address": null, 763 | "sas_device_handle": null, 764 | "scheduler_mode": "", 765 | "sectors": "8192", 766 | "sectorsize": "512", 767 | "size": "4.00 MB", 768 | "support_discard": "0", 769 | "vendor": null, 770 | "virtual": 1 771 | }, 772 | "ram9": { 773 | "holders": [], 774 | "host": "", 775 | "links": { 776 | "ids": [], 777 | "labels": [], 778 | "masters": [], 779 | "uuids": [] 780 | }, 781 | "model": null, 782 | "partitions": {}, 783 | "removable": "0", 784 | "rotational": "0", 785 | "sas_address": null, 786 | "sas_device_handle": null, 787 | "scheduler_mode": "", 788 | "sectors": "8192", 789 | "sectorsize": "512", 790 | "size": "4.00 MB", 791 | "support_discard": "0", 792 | "vendor": null, 793 | "virtual": 1 794 | }, 795 | "sda": { 796 | "holders": [], 797 | "host": "USB controller: VIA Technologies, Inc. VL805 USB 3.0 Host Controller (rev 01)", 798 | "links": { 799 | "ids": [ 800 | "usb-Generic_Card-Reader_20100120100004-0:0" 801 | ], 802 | "labels": [], 803 | "masters": [], 804 | "uuids": [] 805 | }, 806 | "model": "Card-Reader", 807 | "partitions": {}, 808 | "removable": "1", 809 | "rotational": "1", 810 | "sas_address": null, 811 | "sas_device_handle": null, 812 | "scheduler_mode": "mq-deadline", 813 | "sectors": "0", 814 | "sectorsize": "512", 815 | "size": "0.00 Bytes", 816 | "support_discard": "0", 817 | "vendor": "Generic", 818 | "virtual": 1 819 | } 820 | }, 821 | "ansible_distribution": "Debian", 822 | "ansible_distribution_file_parsed": true, 823 | "ansible_distribution_file_path": "/etc/os-release", 824 | "ansible_distribution_file_variety": "Debian", 825 | "ansible_distribution_major_version": "10", 826 | "ansible_distribution_release": "buster", 827 | "ansible_distribution_version": "10", 828 | "ansible_dns": { 829 | "nameservers": [ 830 | "8.8.8.8", 831 | "8.8.4.4" 832 | ] 833 | }, 834 | "ansible_domain": "local", 835 | "ansible_effective_group_id": 100, 836 | "ansible_effective_user_id": 1024, 837 | "ansible_env": { 838 | "DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/1024/bus", 839 | "GCC_COLORS": "error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01", 840 | "HOME": "/home/glock", 841 | "LANG": "C", 842 | "LANGUAGE": "en_US.UTF-8", 843 | "LC_ALL": "C", 844 | "LC_NUMERIC": "C", 845 | "LOGNAME": "glock", 846 | "LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:", 847 | "MAIL": "/var/mail/glock", 848 | "NO_AT_BRIDGE": "1", 849 | "OLDPWD": "/home/glock/src/git/rpi-ansible/roles", 850 | "PATH": "/home/glock/src/git/rpi-ansible/ansible_env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games", 851 | "PS1": "(ansible_env) \\[\\e]0;\\u@\\h: \\w\\a\\]${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ ", 852 | "PWD": "/home/glock/src/git/rpi-ansible", 853 | "SHELL": "/bin/bash", 854 | "SHLVL": "1", 855 | "SSH_CLIENT": "fe80::18:6085:f023:b910%wlan0 53136 22", 856 | "SSH_CONNECTION": "fe80::18:6085:f023:b910%wlan0 53136 fe80::9f95:e18d:8283:8942%wlan0 22", 857 | "SSH_TTY": "/dev/pts/1", 858 | "TERM": "xterm", 859 | "TEXTDOMAIN": "Linux-PAM", 860 | "USER": "glock", 861 | "VIRTUAL_ENV": "/home/glock/src/git/rpi-ansible/ansible_env", 862 | "VISUAL": "vim", 863 | "XDG_RUNTIME_DIR": "/run/user/1024", 864 | "XDG_SESSION_CLASS": "user", 865 | "XDG_SESSION_ID": "c11", 866 | "XDG_SESSION_TYPE": "tty", 867 | "_": "/home/glock/src/git/rpi-ansible/ansible_env/bin/ansible" 868 | }, 869 | "ansible_eth0": { 870 | "active": false, 871 | "device": "eth0", 872 | "features": { 873 | "esp_hw_offload": "off [fixed]", 874 | "esp_tx_csum_hw_offload": "off [fixed]", 875 | "fcoe_mtu": "off [fixed]", 876 | "generic_receive_offload": "on", 877 | "generic_segmentation_offload": "off [requested on]", 878 | "highdma": "off [fixed]", 879 | "hw_tc_offload": "off [fixed]", 880 | "l2_fwd_offload": "off [fixed]", 881 | "large_receive_offload": "off [fixed]", 882 | "loopback": "off [fixed]", 883 | "netns_local": "off [fixed]", 884 | "ntuple_filters": "off [fixed]", 885 | "receive_hashing": "off [fixed]", 886 | "rx_all": "off [fixed]", 887 | "rx_checksumming": "off", 888 | "rx_fcs": "off [fixed]", 889 | "rx_gro_hw": "off [fixed]", 890 | "rx_udp_tunnel_port_offload": "off [fixed]", 891 | "rx_vlan_filter": "off [fixed]", 892 | "rx_vlan_offload": "off [fixed]", 893 | "rx_vlan_stag_filter": "off [fixed]", 894 | "rx_vlan_stag_hw_parse": "off [fixed]", 895 | "scatter_gather": "off", 896 | "tcp_segmentation_offload": "off", 897 | "tls_hw_record": "off [fixed]", 898 | "tls_hw_rx_offload": "off [fixed]", 899 | "tls_hw_tx_offload": "off [fixed]", 900 | "tx_checksum_fcoe_crc": "off [fixed]", 901 | "tx_checksum_ip_generic": "off [fixed]", 902 | "tx_checksum_ipv4": "off", 903 | "tx_checksum_ipv6": "off", 904 | "tx_checksum_sctp": "off [fixed]", 905 | "tx_checksumming": "off", 906 | "tx_esp_segmentation": "off [fixed]", 907 | "tx_fcoe_segmentation": "off [fixed]", 908 | "tx_gre_csum_segmentation": "off [fixed]", 909 | "tx_gre_segmentation": "off [fixed]", 910 | "tx_gso_partial": "off [fixed]", 911 | "tx_gso_robust": "off [fixed]", 912 | "tx_ipxip4_segmentation": "off [fixed]", 913 | "tx_ipxip6_segmentation": "off [fixed]", 914 | "tx_lockless": "off [fixed]", 915 | "tx_nocache_copy": "off", 916 | "tx_scatter_gather": "off", 917 | "tx_scatter_gather_fraglist": "off [fixed]", 918 | "tx_sctp_segmentation": "off [fixed]", 919 | "tx_tcp6_segmentation": "off [fixed]", 920 | "tx_tcp_ecn_segmentation": "off [fixed]", 921 | "tx_tcp_mangleid_segmentation": "off [fixed]", 922 | "tx_tcp_segmentation": "off [fixed]", 923 | "tx_udp_segmentation": "off [fixed]", 924 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 925 | "tx_udp_tnl_segmentation": "off [fixed]", 926 | "tx_vlan_offload": "off [fixed]", 927 | "tx_vlan_stag_hw_insert": "off [fixed]", 928 | "udp_fragmentation_offload": "off", 929 | "vlan_challenged": "off [fixed]" 930 | }, 931 | "hw_timestamp_filters": [], 932 | "macaddress": "dc:a6:32:8c:8a:53", 933 | "mtu": 1500, 934 | "pciid": "fd580000.genet", 935 | "promisc": false, 936 | "speed": 10, 937 | "timestamping": [ 938 | "rx_software", 939 | "software" 940 | ], 941 | "type": "ether" 942 | }, 943 | "ansible_fibre_channel_wwn": [], 944 | "ansible_fips": false, 945 | "ansible_form_factor": "NA", 946 | "ansible_fqdn": "cloverdale.local", 947 | "ansible_hostname": "cloverdale", 948 | "ansible_hostnqn": "", 949 | "ansible_interfaces": [ 950 | "lo", 951 | "eth0", 952 | "wlan0" 953 | ], 954 | "ansible_is_chroot": false, 955 | "ansible_iscsi_iqn": "", 956 | "ansible_kernel": "4.19.118-v7l+", 957 | "ansible_kernel_version": "#1311 SMP Mon Apr 27 14:26:42 BST 2020", 958 | "ansible_lo": { 959 | "active": true, 960 | "device": "lo", 961 | "features": { 962 | "esp_hw_offload": "off [fixed]", 963 | "esp_tx_csum_hw_offload": "off [fixed]", 964 | "fcoe_mtu": "off [fixed]", 965 | "generic_receive_offload": "on", 966 | "generic_segmentation_offload": "on", 967 | "highdma": "on [fixed]", 968 | "hw_tc_offload": "off [fixed]", 969 | "l2_fwd_offload": "off [fixed]", 970 | "large_receive_offload": "off [fixed]", 971 | "loopback": "on [fixed]", 972 | "netns_local": "on [fixed]", 973 | "ntuple_filters": "off [fixed]", 974 | "receive_hashing": "off [fixed]", 975 | "rx_all": "off [fixed]", 976 | "rx_checksumming": "on [fixed]", 977 | "rx_fcs": "off [fixed]", 978 | "rx_gro_hw": "off [fixed]", 979 | "rx_udp_tunnel_port_offload": "off [fixed]", 980 | "rx_vlan_filter": "off [fixed]", 981 | "rx_vlan_offload": "off [fixed]", 982 | "rx_vlan_stag_filter": "off [fixed]", 983 | "rx_vlan_stag_hw_parse": "off [fixed]", 984 | "scatter_gather": "on", 985 | "tcp_segmentation_offload": "on", 986 | "tls_hw_record": "off [fixed]", 987 | "tls_hw_rx_offload": "off [fixed]", 988 | "tls_hw_tx_offload": "off [fixed]", 989 | "tx_checksum_fcoe_crc": "off [fixed]", 990 | "tx_checksum_ip_generic": "on [fixed]", 991 | "tx_checksum_ipv4": "off [fixed]", 992 | "tx_checksum_ipv6": "off [fixed]", 993 | "tx_checksum_sctp": "on [fixed]", 994 | "tx_checksumming": "on", 995 | "tx_esp_segmentation": "off [fixed]", 996 | "tx_fcoe_segmentation": "off [fixed]", 997 | "tx_gre_csum_segmentation": "off [fixed]", 998 | "tx_gre_segmentation": "off [fixed]", 999 | "tx_gso_partial": "off [fixed]", 1000 | "tx_gso_robust": "off [fixed]", 1001 | "tx_ipxip4_segmentation": "off [fixed]", 1002 | "tx_ipxip6_segmentation": "off [fixed]", 1003 | "tx_lockless": "on [fixed]", 1004 | "tx_nocache_copy": "off [fixed]", 1005 | "tx_scatter_gather": "on [fixed]", 1006 | "tx_scatter_gather_fraglist": "on [fixed]", 1007 | "tx_sctp_segmentation": "on", 1008 | "tx_tcp6_segmentation": "on", 1009 | "tx_tcp_ecn_segmentation": "on", 1010 | "tx_tcp_mangleid_segmentation": "on", 1011 | "tx_tcp_segmentation": "on", 1012 | "tx_udp_segmentation": "off [fixed]", 1013 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 1014 | "tx_udp_tnl_segmentation": "off [fixed]", 1015 | "tx_vlan_offload": "off [fixed]", 1016 | "tx_vlan_stag_hw_insert": "off [fixed]", 1017 | "udp_fragmentation_offload": "off", 1018 | "vlan_challenged": "on [fixed]" 1019 | }, 1020 | "hw_timestamp_filters": [], 1021 | "ipv4": { 1022 | "address": "127.0.0.1", 1023 | "broadcast": "host", 1024 | "netmask": "255.0.0.0", 1025 | "network": "127.0.0.0" 1026 | }, 1027 | "ipv6": [ 1028 | { 1029 | "address": "::1", 1030 | "prefix": "128", 1031 | "scope": "host" 1032 | } 1033 | ], 1034 | "mtu": 65536, 1035 | "promisc": false, 1036 | "timestamping": [ 1037 | "tx_software", 1038 | "rx_software", 1039 | "software" 1040 | ], 1041 | "type": "loopback" 1042 | }, 1043 | "ansible_local": {}, 1044 | "ansible_lsb": { 1045 | "codename": "buster", 1046 | "description": "Raspbian GNU/Linux 10 (buster)", 1047 | "id": "Raspbian", 1048 | "major_release": "10", 1049 | "release": "10" 1050 | }, 1051 | "ansible_machine": "armv7l", 1052 | "ansible_machine_id": "9c699991f6ef4f7b8ddaf34327de239c", 1053 | "ansible_memfree_mb": 2743, 1054 | "ansible_memory_mb": { 1055 | "nocache": { 1056 | "free": 3318, 1057 | "used": 588 1058 | }, 1059 | "real": { 1060 | "free": 2743, 1061 | "total": 3906, 1062 | "used": 1163 1063 | }, 1064 | "swap": { 1065 | "cached": 0, 1066 | "free": 99, 1067 | "total": 99, 1068 | "used": 0 1069 | } 1070 | }, 1071 | "ansible_memtotal_mb": 3906, 1072 | "ansible_mounts": [ 1073 | { 1074 | "block_available": 5015671, 1075 | "block_size": 4096, 1076 | "block_total": 6951302, 1077 | "block_used": 1935631, 1078 | "device": "/dev/root", 1079 | "fstype": "ext4", 1080 | "inode_available": 1617072, 1081 | "inode_total": 1774192, 1082 | "inode_used": 157120, 1083 | "mount": "/", 1084 | "options": "rw,noatime", 1085 | "size_available": 20544188416, 1086 | "size_total": 28472532992, 1087 | "uuid": "N/A" 1088 | }, 1089 | { 1090 | "block_available": 411725, 1091 | "block_size": 512, 1092 | "block_total": 516188, 1093 | "block_used": 104463, 1094 | "device": "/dev/mmcblk0p6", 1095 | "fstype": "vfat", 1096 | "inode_available": 0, 1097 | "inode_total": 0, 1098 | "inode_used": 0, 1099 | "mount": "/boot", 1100 | "options": "rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro", 1101 | "size_available": 210803200, 1102 | "size_total": 264288256, 1103 | "uuid": "75C7-43FE" 1104 | } 1105 | ], 1106 | "ansible_nodename": "cloverdale", 1107 | "ansible_os_family": "Debian", 1108 | "ansible_pkg_mgr": "apt", 1109 | "ansible_proc_cmdline": { 1110 | "8250.nr_uarts": "1", 1111 | "cma": [ 1112 | "64M", 1113 | "256M" 1114 | ], 1115 | "coherent_pool": "1M", 1116 | "console": [ 1117 | "ttyS0,115200", 1118 | "tty1" 1119 | ], 1120 | "elevator": "deadline", 1121 | "fsck.repair": "yes", 1122 | "root": "/dev/mmcblk0p7", 1123 | "rootfstype": "ext4", 1124 | "rootwait": true, 1125 | "smsc95xx.macaddr": "DC:A6:32:8C:8A:53", 1126 | "snd_bcm2835.enable_compat_alsa": "0", 1127 | "snd_bcm2835.enable_hdmi": "1", 1128 | "snd_bcm2835.enable_headphones": "1", 1129 | "vc_mem.mem_base": "0x3ec00000", 1130 | "vc_mem.mem_size": "0x40000000", 1131 | "video": "HDMI-A-1:3840x2160M@30" 1132 | }, 1133 | "ansible_processor": [ 1134 | "0", 1135 | "ARMv7 Processor rev 3 (v7l)", 1136 | "1", 1137 | "ARMv7 Processor rev 3 (v7l)", 1138 | "2", 1139 | "ARMv7 Processor rev 3 (v7l)", 1140 | "3", 1141 | "ARMv7 Processor rev 3 (v7l)" 1142 | ], 1143 | "ansible_processor_cores": 1, 1144 | "ansible_processor_count": 4, 1145 | "ansible_processor_threads_per_core": 1, 1146 | "ansible_processor_vcpus": 4, 1147 | "ansible_product_name": "NA", 1148 | "ansible_product_serial": "NA", 1149 | "ansible_product_uuid": "NA", 1150 | "ansible_product_version": "NA", 1151 | "ansible_python": { 1152 | "executable": "/home/glock/src/git/rpi-ansible/ansible_env/bin/python3", 1153 | "has_sslcontext": true, 1154 | "type": "cpython", 1155 | "version": { 1156 | "major": 3, 1157 | "micro": 3, 1158 | "minor": 7, 1159 | "releaselevel": "final", 1160 | "serial": 0 1161 | }, 1162 | "version_info": [ 1163 | 3, 1164 | 7, 1165 | 3, 1166 | "final", 1167 | 0 1168 | ] 1169 | }, 1170 | "ansible_python_version": "3.7.3", 1171 | "ansible_real_group_id": 100, 1172 | "ansible_real_user_id": 1024, 1173 | "ansible_selinux": { 1174 | "status": "Missing selinux Python library" 1175 | }, 1176 | "ansible_selinux_python_present": false, 1177 | "ansible_service_mgr": "systemd", 1178 | "ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBAOF31L3S2gzXQ/R3hGyI2CHfCz5mpD0Sqak7FtvvF8i+gylu5pExbgYGECBYenJ7AvSzhE2HfyBuh+T8URDChSh9oZ3KEtQai+4kwngBpSl+gmSPraZK8DGjF5HzL9UEtAEDsrEjhu1PgaYAg5FA8SX52trMhq/63cdGcnkUFktBAAAAFQDzB9WiZ6HncvGQMNFA84oPGNJTCQAAAIALOW7dE8lk7WeDUHYvLvUXHjLXlDhKZrjsMqxV21nAnEBZMvf9EuAL4auYuDm3s6MPsZuD6kC0o9mt+w2zFgFSF4gpkBFmzq147l6biSSyzwsnO20XPBruyblOY+Mtmv1PGqmP6ZkwefQyyqewb4Md008tQHs4UJk8j6CF6/4qNwAAAIA70sL/Bwdn3K8myl5C4yqkG3PHs+28Yj6irBtXdTbeXeCpoHEe/hg2KQWGfWwHevT6KG75cFt4g/IZIvI+dX8yga8gXWS+3HpNCkTL5w16XjJEde63nKhJiJikt2dcDFOipio021sD455/C0Lj/MUAbTxcv5xWk7daa/ll9+rE7g==", 1179 | "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBElb+KFE1OT72DmiwJe7WEe6JupEWECXlBhWgIObqnxj3omAcIMo56rMFjn391urIQPun+8fMWaQ/4PdFnab8Xk=", 1180 | "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIMWwAce8wCFy5fwLVUPp3l2af5io4vYU54IGjb1WhXqh", 1181 | "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDELxaxC5LRC/yzwqwTgdHzBv5ALCAHxdX1RUade3XpNeBcN1BJSMitkSFg+mC3GwSIB+u8R2UNLB+RsmF6vIsrO9NOVlCU1A2qlfqyzzH516rUHEmSwz2lgJimJEHA2RyXurWYCsGI77R2x2M985VihR6vK5IoiZxz5SOuSZ2CCQOAKttQSVwTkIhlhjNEjXkfgdN4jZniNrZ6vLDTGRO/LpxOFIM+4Ip0yY8SION/WGhyaD8xqLHsbTgoOL9cV4GMHvYGW3Cri0o+cAIIXsrdyuj8ZPoiJOg9s+Ups8i7wn+vFfIOwAPLm9xIuXvWN3Tt9XyjelJ6PnR/En7T983D", 1182 | "ansible_swapfree_mb": 99, 1183 | "ansible_swaptotal_mb": 99, 1184 | "ansible_system": "Linux", 1185 | "ansible_system_capabilities": [ 1186 | "" 1187 | ], 1188 | "ansible_system_capabilities_enforced": "True", 1189 | "ansible_system_vendor": "NA", 1190 | "ansible_uptime_seconds": 103246, 1191 | "ansible_user_dir": "/home/glock", 1192 | "ansible_user_gecos": "Glenn K. Lockwood", 1193 | "ansible_user_gid": 100, 1194 | "ansible_user_id": "glock", 1195 | "ansible_user_shell": "/bin/bash", 1196 | "ansible_user_uid": 1024, 1197 | "ansible_userspace_bits": "32", 1198 | "ansible_virtualization_role": "NA", 1199 | "ansible_virtualization_type": "NA", 1200 | "ansible_wlan0": { 1201 | "active": true, 1202 | "device": "wlan0", 1203 | "features": { 1204 | "esp_hw_offload": "off [fixed]", 1205 | "esp_tx_csum_hw_offload": "off [fixed]", 1206 | "fcoe_mtu": "off [fixed]", 1207 | "generic_receive_offload": "on", 1208 | "generic_segmentation_offload": "off [requested on]", 1209 | "highdma": "off [fixed]", 1210 | "hw_tc_offload": "off [fixed]", 1211 | "l2_fwd_offload": "off [fixed]", 1212 | "large_receive_offload": "off [fixed]", 1213 | "loopback": "off [fixed]", 1214 | "netns_local": "on [fixed]", 1215 | "ntuple_filters": "off [fixed]", 1216 | "receive_hashing": "off [fixed]", 1217 | "rx_all": "off [fixed]", 1218 | "rx_checksumming": "off [fixed]", 1219 | "rx_fcs": "off [fixed]", 1220 | "rx_gro_hw": "off [fixed]", 1221 | "rx_udp_tunnel_port_offload": "off [fixed]", 1222 | "rx_vlan_filter": "off [fixed]", 1223 | "rx_vlan_offload": "off [fixed]", 1224 | "rx_vlan_stag_filter": "off [fixed]", 1225 | "rx_vlan_stag_hw_parse": "off [fixed]", 1226 | "scatter_gather": "off", 1227 | "tcp_segmentation_offload": "off", 1228 | "tls_hw_record": "off [fixed]", 1229 | "tls_hw_rx_offload": "off [fixed]", 1230 | "tls_hw_tx_offload": "off [fixed]", 1231 | "tx_checksum_fcoe_crc": "off [fixed]", 1232 | "tx_checksum_ip_generic": "off [fixed]", 1233 | "tx_checksum_ipv4": "off [fixed]", 1234 | "tx_checksum_ipv6": "off [fixed]", 1235 | "tx_checksum_sctp": "off [fixed]", 1236 | "tx_checksumming": "off", 1237 | "tx_esp_segmentation": "off [fixed]", 1238 | "tx_fcoe_segmentation": "off [fixed]", 1239 | "tx_gre_csum_segmentation": "off [fixed]", 1240 | "tx_gre_segmentation": "off [fixed]", 1241 | "tx_gso_partial": "off [fixed]", 1242 | "tx_gso_robust": "off [fixed]", 1243 | "tx_ipxip4_segmentation": "off [fixed]", 1244 | "tx_ipxip6_segmentation": "off [fixed]", 1245 | "tx_lockless": "off [fixed]", 1246 | "tx_nocache_copy": "off", 1247 | "tx_scatter_gather": "off [fixed]", 1248 | "tx_scatter_gather_fraglist": "off [fixed]", 1249 | "tx_sctp_segmentation": "off [fixed]", 1250 | "tx_tcp6_segmentation": "off [fixed]", 1251 | "tx_tcp_ecn_segmentation": "off [fixed]", 1252 | "tx_tcp_mangleid_segmentation": "off [fixed]", 1253 | "tx_tcp_segmentation": "off [fixed]", 1254 | "tx_udp_segmentation": "off [fixed]", 1255 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 1256 | "tx_udp_tnl_segmentation": "off [fixed]", 1257 | "tx_vlan_offload": "off [fixed]", 1258 | "tx_vlan_stag_hw_insert": "off [fixed]", 1259 | "udp_fragmentation_offload": "off", 1260 | "vlan_challenged": "off [fixed]" 1261 | }, 1262 | "hw_timestamp_filters": [], 1263 | "ipv4": { 1264 | "address": "192.168.1.155", 1265 | "broadcast": "192.168.1.255", 1266 | "netmask": "255.255.255.0", 1267 | "network": "192.168.1.0" 1268 | }, 1269 | "ipv6": [ 1270 | { 1271 | "address": "fe80::9f95:e18d:8283:8942", 1272 | "prefix": "64", 1273 | "scope": "link" 1274 | } 1275 | ], 1276 | "macaddress": "dc:a6:32:8c:8a:54", 1277 | "module": "brcmfmac", 1278 | "mtu": 1500, 1279 | "pciid": "mmc1:0001:1", 1280 | "promisc": false, 1281 | "timestamping": [ 1282 | "rx_software", 1283 | "software" 1284 | ], 1285 | "type": "ether" 1286 | }, 1287 | "gather_subset": [ 1288 | "all" 1289 | ], 1290 | "module_setup": true 1291 | }, 1292 | "changed": false 1293 | } 1294 | -------------------------------------------------------------------------------- /host_vars/blackhall.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | systemd_default_target: multi-user 5 | cpufreq_governor: ondemand 6 | target_hostname: blackhall 7 | target_domain: local 8 | host_software: 9 | - python3-venv 10 | -------------------------------------------------------------------------------- /host_vars/cloverdale.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | target_hostname: "cloverdale" 5 | target_domain: "local" 6 | xkblayout: "us" 7 | enable_gui: False 8 | enable_autologin: False 9 | enable_bootwait: False 10 | enable_bootsplash: False 11 | enable_camera: False 12 | enable_vnc: False 13 | enable_spi: False 14 | enable_i2c: False 15 | enable_serial: True 16 | enable_serial_hw: True 17 | enable_onewire: False 18 | enable_rgpio: False 19 | systemd_default_target: multi-user 20 | host_software: 21 | - autoconf 22 | - libpcre3-dev # for tt++ 23 | - libncurses-dev # for irssi 24 | - libperl-dev # for irssi 25 | - libglib2.0-dev # for irssi 26 | - libyaml-dev # for the mud 27 | - python3-virtualenv # for pelican 28 | - python3-pandas # for pelican 29 | - python3-yaml # for pelican 30 | - python3-tabulate # for pelican 31 | - python3-markdown # for pelican 32 | - python3-bs4 # for pelican 33 | -------------------------------------------------------------------------------- /host_vars/cloverleaf.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | target_hostname: "cloverleaf" 5 | target_domain: "local" 6 | xkblayout: "us" 7 | enable_gui: False 8 | enable_autologin: False 9 | enable_bootwait: True 10 | enable_bootsplash: False 11 | enable_camera: False 12 | enable_vnc: False 13 | enable_spi: False 14 | enable_i2c: False 15 | enable_serial: True 16 | enable_serial_hw: True 17 | enable_onewire: False 18 | enable_rgpio: False 19 | host_software: 20 | - w3m 21 | - irssi 22 | -------------------------------------------------------------------------------- /host_vars/clovermill.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | target_hostname: "clovermill" 5 | target_domain: "local" 6 | xkblayout: "us" 7 | wifi_country: "US" 8 | enable_gui: False 9 | enable_autologin: False 10 | enable_bootwait: False 11 | enable_bootsplash: False 12 | enable_camera: True 13 | enable_vnc: False 14 | enable_spi: False 15 | enable_i2c: False 16 | enable_serial: False 17 | enable_serial_hw: False 18 | enable_onewire: False 19 | enable_rgpio: False 20 | darshan_dev: False 21 | -------------------------------------------------------------------------------- /host_vars/clovermine.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | target_hostname: "clovermine" 5 | target_domain: "local" 6 | xkblayout: "us" 7 | wifi_country: "US" 8 | enable_gui: True 9 | enable_autologin: False 10 | enable_bootwait: False 11 | enable_bootsplash: False 12 | enable_camera: False 13 | enable_vnc: False 14 | enable_spi: False 15 | enable_i2c: False 16 | enable_serial: True 17 | enable_serial_hw: True 18 | enable_onewire: False 19 | enable_rgpio: False 20 | darshan_dev: True 21 | host_software: 22 | - libncurses-dev # for irssi 23 | - libperl-dev # for irssi 24 | - libglib2.0-dev # for irssi 25 | -------------------------------------------------------------------------------- /host_vars/greystone.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | systemd_default_target: multi-user 5 | cpufreq_governor: conservative 6 | target_hostname: greystone 7 | target_domain: local 8 | autofs: # remember to enable mount access from the filer side too 9 | - src: "synology.local:/volume1/glock/1024" 10 | dest: "/synology" 11 | opts: "-retry=0,tcp,soft,rw,vers=3" 12 | host_software: 13 | - python3-venv 14 | -------------------------------------------------------------------------------- /host_vars/jetson.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | swapsize_gb: 0 # set to 0 to disable play 5 | systemd_default_target: multi-user 6 | autofs: # remember to enable mount access from the filer side too 7 | - src: "synology.local:/volume1/glock" 8 | dest: "/synology" 9 | opts: "-retry=0,tcp,soft,rw,vers=3" 10 | host_software: 11 | - python3-venv 12 | - python3-dev # needed for many python packages built from source 13 | - python3-wheel # for simplifying pip install 14 | # for installing docker-compose from pypi 15 | # - libffi-dev # for pip install docker-compose 16 | # - libssl-dev # for pip install docker-compose 17 | # - gfortran 18 | # - gfortran-doc 19 | -------------------------------------------------------------------------------- /host_vars/whitehaven.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timezone: "America/Los_Angeles" 3 | locale: "en_US.UTF-8" 4 | systemd_default_target: multi-user 5 | cpufreq_governor: ondemand 6 | target_hostname: whitehaven 7 | target_domain: local 8 | host_software: 9 | - python3-venv 10 | -------------------------------------------------------------------------------- /hosts: -------------------------------------------------------------------------------- 1 | jetson ansible_host=jetson.local 2 | 3 | [beaglebone] 4 | blackhall ansible_host=blackhall.local 5 | whitehaven ansible_host=whitehaven.local 6 | greystone ansible_host=greystone 7 | 8 | [raspberrypi] 9 | cloverdale ansible_host=cloverdale.local 10 | cloverleaf ansible_host=cloverleaf.local 11 | clovermine ansible_host=clovermine.local 12 | clovermill ansible_host=clovermill.local 13 | -------------------------------------------------------------------------------- /jetson.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: jetson 3 | roles: 4 | - common 5 | - jetson 6 | -------------------------------------------------------------------------------- /local.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Raspberry Pi self configuration 3 | hosts: localhost 4 | user: root 5 | connection: local 6 | vars: 7 | macaddrs: 8 | # mac address of eth0 -> hostname; used to identify self when run against localhost 9 | dc:a6:32:8c:8a:53: "cloverdale" 10 | b8:27:eb:6c:82:02: "clovermine" 11 | b8:27:eb:ff:35:c7: "cloverleaf" 12 | b8:27:eb:83:4a:28: "clovermill" 13 | roles: 14 | - common 15 | - rpi 16 | -------------------------------------------------------------------------------- /lock-default-user.yml: -------------------------------------------------------------------------------- 1 | # Disables the default user in supported embedded Linux OS images. Only run 2 | # after you've created an alternative privileged user! 3 | --- 4 | - hosts: all 5 | tasks: 6 | - name: get user list 7 | getent: 8 | database: passwd 9 | - name: lock default user 10 | user: 11 | name: "{{ item }}" 12 | password_lock: true 13 | with_items: 14 | - pi 15 | - debian 16 | when: "item in getent_passwd" 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | ansible>=2.8 2 | -------------------------------------------------------------------------------- /roles/beaglebone/files/etc/default/bb-boot: -------------------------------------------------------------------------------- 1 | # Default stored in /opt/scripts/boot/default/bb-boot 2 | # 3 | # See /opt/scripts/boot/am335x_evm.sh to understand valid options here 4 | # 5 | USB_NETWORK_DISABLED=yes 6 | USB_IMAGE_FILE_DISABLED=yes 7 | USB_CONFIGURATION=disable 8 | DNS_NAMESERVER=8.8.8.8 9 | -------------------------------------------------------------------------------- /roles/beaglebone/tasks/beaglebone-facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: check for board identifier eeprom 3 | stat: 4 | path: "/sys/class/i2c-dev/i2c-0/device/0-0050/eeprom" 5 | register: boardid_eeprom 6 | tags: 7 | - beaglebone 8 | - motd 9 | 10 | - name: set board identifier to eeprom 11 | set_fact: 12 | beaglebone_eeprom: "/sys/class/i2c-dev/i2c-0/device/0-0050/eeprom" 13 | when: boardid_eeprom.stat.exists 14 | tags: 15 | - beaglebone 16 | - motd 17 | 18 | - name: set board identifier to linear boot partition 19 | set_fact: 20 | beaglebone_eeprom: "/dev/mmcblk1boot1" 21 | when: not boardid_eeprom.stat.exists 22 | tags: 23 | - beaglebone 24 | - motd 25 | 26 | - name: get BeagleBone board type 27 | command: "dd if={{ beaglebone_eeprom }} ibs=1 skip=4 count=8 status=none" 28 | register: beaglebone_board # BNLT, BLNK, PBGL, BBONE-AI, etc 29 | changed_when: False 30 | check_mode: no 31 | tags: 32 | - beaglebone 33 | - motd 34 | 35 | - name: get BeagleBone board revision 36 | command: "dd if={{ beaglebone_eeprom }} ibs=1 skip=12 count=4 status=none" 37 | register: beaglebone_rev # 00C0, 00A1 38 | changed_when: False 39 | check_mode: no 40 | tags: 41 | - beaglebone 42 | - motd 43 | 44 | - name: set BeagleBone facts 45 | set_fact: 46 | beaglebone_board: "{{ beaglebone_board.stdout }}" 47 | beaglebone_rev : "{{ beaglebone_rev.stdout }}" 48 | check_mode: no 49 | tags: 50 | - beaglebone 51 | - motd 52 | -------------------------------------------------------------------------------- /roles/beaglebone/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - include: beaglebone-facts.yml 3 | 4 | - name: gather package state info 5 | package_facts: 6 | manager: auto 7 | tags: [ "sw" ] 8 | 9 | - name: disable HDMI virtual cape 10 | lineinfile: 11 | dest: /boot/uEnv.txt 12 | regexp: '^[#\s]*disable_uboot_overlay_video=[01]' 13 | line: 'disable_uboot_overlay_video=1' 14 | notify: 15 | - reboot 16 | 17 | - name: disable USB networking 18 | copy: 19 | src: '{{ item }}' 20 | dest: '/{{ item }}' 21 | owner: root 22 | group: root 23 | mode: 0644 24 | loop: 25 | - etc/default/bb-boot 26 | when: "'bb-usb-gadgets' in ansible_facts.packages" 27 | 28 | # wireless access point will still be running after this play. you can just 29 | # re-run /usr/bin/bb-wl18xx-wlan0 to pick up this new configuration and 30 | # disable the access point, but this playbook also uninstalls 31 | # /usr/bin/bb-wl18xx-wlan0 and requires a reboot. 32 | - name: disable wireless access point on boot 33 | lineinfile: 34 | dest: "/etc/default/bb-wl18xx" 35 | regexp: "^TETHER_ENABLED=" 36 | line: "TETHER_ENABLED=no" 37 | state: present 38 | notify: 39 | - reboot 40 | 41 | 42 | # See https://www.glennklockwood.com/sysadmin-howtos/beaglebone.html for more 43 | # info on what these services do (and why you may need them) 44 | - name: disable cloud9 45 | systemd: 46 | name: "{{ item }}" 47 | enabled: no 48 | state: stopped 49 | loop: 50 | - cloud9.socket 51 | when: "'c9-core-installer' in ansible_facts.packages" 52 | 53 | - name: disable nodered 54 | systemd: 55 | name: "{{ item }}" 56 | enabled: no 57 | state: stopped 58 | loop: 59 | - nodered.service 60 | - nodered.socket 61 | when: "'bb-node-red-installer' in ansible_facts.packages" 62 | 63 | - name: disable bonescript 64 | systemd: 65 | name: "{{ item }}" 66 | enabled: no 67 | state: stopped 68 | loop: 69 | - bonescript.service 70 | - bonescript.socket 71 | - bonescript-autorun.service 72 | when: "'bonescript' in ansible_facts.packages" 73 | 74 | - name: disable other demo BeagleBone services 75 | systemd: 76 | name: "{{ item }}" 77 | enabled: no 78 | state: stopped 79 | loop: 80 | - nginx.service 81 | - generic-board-startup.service 82 | 83 | - name: get rid of pre-login banners 84 | file: 85 | path: "{{ item }}" 86 | state: "absent" 87 | loop: 88 | - "/etc/issue" 89 | - "/etc/issue.net" 90 | 91 | # Set the MOTD 92 | - name: load BeagleBone hardware list 93 | include_vars: 94 | file: vars/beaglebone-models.yml 95 | tags: 96 | - motd 97 | 98 | - name: install motd 99 | template: 100 | src: etc/motd 101 | dest: /etc/motd 102 | owner: root 103 | group: root 104 | mode: "0644" 105 | tags: 106 | - motd 107 | 108 | # Other tasks 109 | - include: users.yml 110 | - include: software.yml 111 | -------------------------------------------------------------------------------- /roles/beaglebone/tasks/software.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: remove holds on BeagleBone demo software 3 | dpkg_selections: 4 | name: c9-core-installer 5 | selection: purge 6 | when: "'c9-core-installer' in ansible_facts.packages" 7 | 8 | - name: remove BeagleBone demo software 9 | apt: 10 | name: "{{ packages }}" 11 | state: absent 12 | autoremove: yes 13 | purge: yes 14 | vars: 15 | packages: 16 | - c9-core-installer 17 | - bb-node-red-installer 18 | - doc-beaglebone-getting-started 19 | - bb-usb-gadgets 20 | - bonescript 21 | - bone101 22 | - nodejs 23 | - npm 24 | tags: 25 | - sw 26 | 27 | - name: remove unpackaged BeagleBone demo software 28 | file: 29 | path: "{{ item }}" 30 | state: absent 31 | loop: 32 | - "/var/lib/cloud9" 33 | - "/opt/cloud9" 34 | - "/var/cache/doc-beaglebone-getting-started" 35 | - "/usr/local/lib/node_modules" 36 | tags: [ "sw" ] 37 | -------------------------------------------------------------------------------- /roles/beaglebone/tasks/users.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: import user configs 3 | include_vars: 4 | file: vars/users.yml 5 | tags: [ 'users' ] 6 | 7 | - name: create users 8 | user: 9 | name: "{{ item.name }}" 10 | comment: "{{ item.comment }}" 11 | group: "{{ item.group }}" 12 | groups: "{{ item.groups }}" 13 | uid: "{{ item.uid }}" 14 | state: present 15 | shell: /bin/bash 16 | with_items: "{{ create_users }}" 17 | tags: [ 'users' ] 18 | 19 | - name: install ssh pubkeys for new users 20 | authorized_key: 21 | user: "{{ item.name }}" 22 | key: "{{ item.pubkey }}" 23 | state: present 24 | with_items: "{{ create_users }}" 25 | tags: [ 'users' ] 26 | 27 | - name: lock root login 28 | user: 29 | name: root 30 | password_lock: true 31 | tags: [ 'users' ] 32 | -------------------------------------------------------------------------------- /roles/beaglebone/templates/etc/motd: -------------------------------------------------------------------------------- 1 | #jinja2: keep_trailing_newline:True 2 | -------------------------------------------------------------------------------- 3 | {{ ansible_hostname }} 4 | {% if ansible_processor_count > 1 %} 5 | {% set cores_plural = 'cores' %} 6 | {% else %} 7 | {% set cores_plural = 'core' %} 8 | {% endif %} 9 | 10 | {% if beaglebone_board in beaglebone_models %} 11 | {{ beaglebone_models[beaglebone_board].model }} Rev {{ beaglebone_rev | regex_replace('^0*|0*$', '') }} 12 | - {{ beaglebone_models[beaglebone_board].soc}} 13 | - {{ ansible_processor_count }}x {{ beaglebone_models[beaglebone_board].cpu_freq }} {{ beaglebone_models[beaglebone_board].cpu }} {{ cores_plural }} 14 | - {{ beaglebone_models[beaglebone_board].mem }} RAM 15 | {% if beaglebone_models[beaglebone_board].get("accelerators") is string %} 16 | - {{ beaglebone_models[beaglebone_board].get("accelerators") }} 17 | {% else %} 18 | {% for accel in beaglebone_models[beaglebone_board].get("accelerators") %} 19 | - {{ accel }} 20 | {% endfor %} 21 | {% endif %} 22 | {% else %} 23 | BeagleBone {{ beaglebone_board }} 24 | {{ ansible_processor_count }} {% if ansible_processor_count > 1 %}cores{% else %}core{% endif %}, {{ ansible_memtotal_mb }} MB RAM 25 | {% endif %} 26 | 27 | {{ ansible_lsb.description }} 28 | -------------------------------------------------------------------------------- 29 | -------------------------------------------------------------------------------- /roles/beaglebone/vars/beaglebone-models.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Taken from https://github.com/beagleboard/u-boot/blob/55ac96a8461d06edfa89cda37459753397de268a/board/ti/am335x/board.h 3 | beaglebone_models: 4 | A335BONE: 5 | model: "BeagleBone" 6 | soc: "Texas Instruments AM3359" 7 | cpu: "ARM Cortex-A8" 8 | cores: 1 9 | cpu_freq: "800 MHz" 10 | mem: "256 MB DDR2-400" 11 | accelerators: "2x 200 MHz PRU real-time units" 12 | A335BNLT: 13 | model: "BeagleBone Black" 14 | soc: "Texas Instruments AM3358" 15 | cpu: "ARM Cortex-A8" 16 | cores: 1 17 | cpu_freq: "1 GHz" 18 | mem: "512 MB DDR3L-800" 19 | emmc: "4 GB" 20 | accelerators: "2x 200 MHz PRU real-time units" 21 | A335PBGL: 22 | model: "PocketBeagle" 23 | soc: "Texas Instruments AM3358" 24 | cpu: "ARM Cortex-A8" 25 | cores: 1 26 | cpu_freq: "1 GHz" 27 | mem: "512 MB DDR3" 28 | accelerators: "2x 200 MHz PRU real-time units" 29 | A335X_SK: 30 | A33515BB: 31 | A335_ICE: 32 | BBRDX15_: 33 | model: "BeagleBoard-X15" 34 | soc: "Texas Instruments AM5728" 35 | cpu: "ARM Cortex-A15" 36 | cores: 2 37 | cpu_freq: "1.5 GHz" 38 | mem: "2048 MB DDR3" 39 | emmc: "16 GB" 40 | accelerators: 41 | - "2x 213 MHz ARM Cortex-M4 cores" 42 | - "2x 700 MHz C66x digital signal processors" 43 | - "4x 200 MHz PRU real-time units" 44 | AM572PM_: 45 | AM574IDK: 46 | AM572IDK: 47 | AM571IDK: 48 | BBONE-AI: 49 | model: "BeagleBone AI" 50 | soc: "Texas Instruments AM5729" 51 | cpu: "ARM Cortex-A15" 52 | cores: 2 53 | cpu_freq: "1.5 GHz" 54 | mem: "1024 MB DDR3L-1066" 55 | emmc: "16 GB" 56 | accelerators: 57 | - "4x 213 MHz ARM Cortex-M4 cores" 58 | - "4x 650 MHz EVE deep learning accelerators" 59 | - "2x 750 MHz C66x digital signal processors" 60 | - "4x 200 MHz PRU real-time units" 61 | -------------------------------------------------------------------------------- /roles/beaglebone/vars/users.yml: -------------------------------------------------------------------------------- 1 | $ANSIBLE_VAULT;1.1;AES256 2 | 61343931363733326564343963346535613366613666356436633436373563623633383934313934 3 | 3162313362323437313161633961653237613062396363390a646231383638653162316361663566 4 | 63363835346466383765353832373666313662623436633436646239353662623833383766623363 5 | 3337323136396462370a346330366437623833366461636166613565646132656231343563613761 6 | 64393638636665343336313738353761316336356261366337393461356362663862346464343565 7 | 37343331383963396638363830666261643765636165613365663561353066323134346639343732 8 | 32646634623834326663326166333332333662323165383138363131653763323931663462313366 9 | 61323364633764303664303230316465663736646361376464666638333834313061373531366138 10 | 64623235313737616261623461663762316264353461373532623038313462646230363430386139 11 | 39303632376638663833643438336630613330653730306465393534613961663734376637356334 12 | 61373866313264656232356330366135663832353731343866356565333361383066303938396137 13 | 36636564613637623262623161303838333634373537343732653230376333666463383336393566 14 | 39373537643536303339346639346266373834376630363531393834303533623035356266316234 15 | 39336366313234613666396666633538636635666331343939633838343163663563333237323164 16 | 34613161663032613531316333393431386265646462653466363864386234663566323833623638 17 | 66376232363764643933353036643734373232656539343933643438336237613930333735303335 18 | 39613563303262656136323336643239613235303736343239306666316438373263333938373535 19 | 37323566333931656136396334326338613638666164376639656432636639623837323731613761 20 | 30396662323539623839663932303331613434323839616661653264393764326565646330323130 21 | 62306163373463356431646237376437376132316638383365373138643831623931653034363866 22 | 63653737643566343065373930666164333734613964373935366265326439346261653761393761 23 | 62653033326366663365626134626264303139323035663237353163343834346431366262663735 24 | 36383436333666386134396465363434373361626533316230646265316132343365336136643266 25 | 39656430353266626533633434643438303432323762303634653563376664663030326666656363 26 | 63643761363132356337386533663536656233613538386434636432626131313231656436663837 27 | 39316565636266646436633563333737323738373966373933346638346362643761386166303665 28 | 39396138616330306637376330643538386233383532356636326161303165393966313934623130 29 | 37356537633436636338643131383537373138373432653334633065633736373831363238396364 30 | 36376334396338626236613964313163363462613863646235633439393465353232313836663465 31 | 32303761386230323331643361343931376233623539613161343065333463643065666362653730 32 | 39343032323736346466363238666564396131393363323966653137643230356363663166323066 33 | 61626531316139396535616134333163396336616666306133623134363637386439333161306635 34 | 61386366336639316631663639646664306561623133623334316434656239613961353762343539 35 | 61303330396633666334646465633366323538323861663766303563656335363837323439393835 36 | 36623863333361316437343331313237306534396437323133383437633561646230316361626132 37 | 32363262376266373134373065613466613462326265363131643561656635626138613966353963 38 | 31643437666539643865646134646234666464393263623530623762343036366663636164316333 39 | 63343530626665376537306431626531663861386531343234653138323063633262333435333530 40 | 35653330363834636466643837646262386330393934666463646334393665373337636661323735 41 | 66623337353038656461623833383537336230663239643530383136633531313865626635393338 42 | 63663832306163633232333738623739623363353162663663363432343137343638393433343737 43 | 36313937613833393765646561333734623866356161353863633766356163663861353430633036 44 | 61393331623933313933663639653233363662313237333366633661306632343735346530396634 45 | 66616461656666333630343539343938636465623361613131306638353737313236663036393565 46 | 32373962643362303133653533333465663736396331346235643739376432353864643430353632 47 | 6564373965323732626337366531393961373133383530666565 48 | -------------------------------------------------------------------------------- /roles/common/files/etc/auto.master: -------------------------------------------------------------------------------- 1 | # 2 | # This file is controlled by ansible - do not modify directly! 3 | # 4 | /- /etc/auto.nfs 5 | -------------------------------------------------------------------------------- /roles/common/files/set_locale.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # raspi-config is licensed under the terms of the MIT license reproduced below. 4 | # 5 | # ##################################################### 6 | # 7 | # Copyright (c) 2012 Alex Bradbury 8 | # 9 | # Permission is hereby granted, free of charge, to any person 10 | # obtaining a copy of this software and associated documentation 11 | # files (the "Software"), to deal in the Software without 12 | # restriction, including without limitation the rights to use, 13 | # copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | # copies of the Software, and to permit persons to whom the 15 | # Software is furnished to do so, subject to the following 16 | # conditions: 17 | # 18 | # The above copyright notice and this permission notice shall be 19 | # included in all copies or substantial portions of the Software. 20 | # 21 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | # OTHER DEALINGS IN THE SOFTWARE. 29 | # 30 | 31 | local LOCALE="$1" 32 | if ! LOCALE_LINE="$(grep "^$LOCALE " /usr/share/i18n/SUPPORTED)"; then 33 | return 1 34 | fi 35 | local ENCODING="$(echo $LOCALE_LINE | cut -f2 -d " ")" 36 | echo "$LOCALE $ENCODING" > /etc/locale.gen 37 | sed -i "s/^\s*LANG=\S*/LANG=$LOCALE/" /etc/default/locale 38 | dpkg-reconfigure -f noninteractive locales 39 | -------------------------------------------------------------------------------- /roles/common/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: reboot 3 | debug: 4 | msg: "reboot required for {{ ansible_hostname }}" 5 | #reboot: 6 | 7 | - name: "reload autofs" 8 | service: 9 | name: autofs 10 | state: reloaded 11 | -------------------------------------------------------------------------------- /roles/common/linux-facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: get timezone via timedatectl 3 | shell: "timedatectl | grep 'Time zone' | cut -d':' -f2 | cut -d'(' -f1 | sed -Ee 's/(^ *| *$)//g'" 4 | register: linux_tz 5 | changed_when: False 6 | check_mode: no 7 | 8 | - name: get locale 9 | shell: "locale | grep '^LANG=' | cut -d= -f2" 10 | register: linux_locale 11 | changed_when: False 12 | check_mode: no 13 | 14 | - name: get x keyboard layout 15 | shell: "localectl | awk '/X11 Layout/ {print $3}'" 16 | register: linux_xkblayout 17 | changed_when: False 18 | check_mode: no 19 | 20 | - name: set linux-config facts 21 | set_fact: 22 | linux_tz: "{{ linux_tz.stdout }}" 23 | linux_locale: "{{ linux_locale.stdout }}" 24 | linux_xkblayout: "{{ linux_xkblayout.stdout }}" 25 | check_mode: no 26 | -------------------------------------------------------------------------------- /roles/common/tasks/autofs.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install autofs 3 | apt: 4 | name: autofs 5 | state: present 6 | update_cache: yes 7 | when: "autofs | default(false)" 8 | tags: 9 | - autofs 10 | - sw 11 | 12 | - name: install autofs master 13 | copy: 14 | src: 'etc/auto.master' 15 | dest: '/etc/auto.master' 16 | owner: root 17 | group: root 18 | mode: 0644 19 | when: "autofs | default(false)" 20 | notify: 21 | - "reload autofs" 22 | tags: 23 | - autofs 24 | 25 | - name: install autofs map file 26 | template: 27 | src: 'etc/auto.nfs' 28 | dest: '/etc/auto.nfs' 29 | owner: root 30 | group: root 31 | mode: 0644 32 | when: "autofs | default(false)" 33 | notify: 34 | - "reload autofs" 35 | tags: 36 | - autofs 37 | 38 | - name: create mount point 39 | file: 40 | path: "{{ item['dest'] }}" 41 | state: directory 42 | loop: "{{ autofs }}" 43 | when: "autofs | default(false)" 44 | tags: 45 | - autofs 46 | 47 | - name: ensure autofs is enabled 48 | service: 49 | name: autofs 50 | state: started 51 | when: "autofs | default(false)" 52 | tags: 53 | - autofs 54 | -------------------------------------------------------------------------------- /roles/common/tasks/cpufreq.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install cpufrequtils 3 | apt: 4 | name: cpufrequtils 5 | state: present 6 | update_cache: yes 7 | when: "cpufreq_governor | default(false)" 8 | tags: [ "cpufreq" ] 9 | 10 | - name: enable cpufreq service 11 | systemd: 12 | name: cpufrequtils 13 | enabled: yes 14 | state: started 15 | when: "cpufreq_governor | default(false)" 16 | tags: [ "cpufreq" ] 17 | 18 | - name: install cpufrequtils config 19 | template: 20 | src: etc/default/cpufrequtils 21 | dest: /etc/default/cpufrequtils 22 | owner: root 23 | group: root 24 | mode: 0755 25 | register: cpufreqconfig 26 | when: "cpufreq_governor | default(false)" 27 | tags: [ "cpufreq" ] 28 | 29 | - name: restart cpufrequtils service 30 | systemd: 31 | name: cpufrequtils 32 | state: restarted 33 | when: "cpufreq_governor | default(false) and cpufreqconfig.changed" 34 | tags: [ "cpufreq" ] 35 | -------------------------------------------------------------------------------- /roles/common/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - include: linux-facts.yml 3 | 4 | - name: "set hostname" 5 | hostname: 6 | name: "{{ target_hostname }}.{{ target_domain }}" 7 | when: "target_hostname | default(false) and target_domain | default(false)" 8 | notify: 9 | - reboot 10 | 11 | - name: "template out /etc/hosts" 12 | template: 13 | src: etc/hosts 14 | dest: /etc/hosts 15 | owner: root 16 | group: root 17 | mode: 0755 18 | when: "target_hostname | default(false) and target_domain | default(false)" 19 | 20 | - name: "set timezone" 21 | command: "timedatectl set-timezone {{ timezone }}" 22 | when: "timezone | default(false) and linux_tz != timezone" 23 | 24 | - name: "set locale" 25 | script: 26 | cmd: "set_locale.sh {{ locale }}" 27 | when: "locale|default(false) and linux_locale != locale" 28 | 29 | - name: "systemd: get default target" 30 | command: "systemctl get-default" 31 | register: current_systemd_default_target 32 | when: "systemd_default_target | default(false)" 33 | changed_when: False 34 | check_mode: no 35 | 36 | - name: "systemd: set default target" 37 | command: "systemctl set-default {{ systemd_default_target }}" 38 | when: "systemd_default_target | default(false) and systemd_default_target != current_systemd_default_target.stdout.split('.')[0]" 39 | 40 | - include: software.yml 41 | - include: sshd.yml 42 | - include: cpufreq.yml 43 | - include: autofs.yml 44 | -------------------------------------------------------------------------------- /roles/common/tasks/software.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Install software required for all environments 3 | - name: install basic software environment 4 | apt: 5 | name: "{{ packages }}" 6 | state: present 7 | update_cache: yes 8 | vars: 9 | packages: 10 | - vim 11 | - screen 12 | - git 13 | - ufw 14 | tags: 15 | - sw 16 | 17 | - name: install additional host-specific software 18 | apt: 19 | name: "{{ host_software | default([]) }}" 20 | state: present 21 | update_cache: yes 22 | tags: 23 | - sw 24 | -------------------------------------------------------------------------------- /roles/common/tasks/sshd.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # 3 | # Set ssh host keys 4 | # 5 | - name: check which SSH host keys are available 6 | local_action: "stat path=\"{{ role_path }}/files/{{ item }}.{{ inventory_hostname }}\"" 7 | loop: "{{ ssh_host_key_files }}" 8 | register: result 9 | become: false 10 | tags: 11 | - sshd 12 | 13 | # at this point, each element of result.results looks like 14 | # { 15 | # "ansible_loop_var": "item", 16 | # "changed": false, 17 | # "failed": false, 18 | # "invocation": { 19 | # "module_args": { 20 | # "checksum_algorithm": "sha1", 21 | # "follow": false, 22 | # "get_attributes": true, 23 | # "get_checksum": true, 24 | # "get_md5": false, 25 | # "get_mime": true, 26 | # "path": "/home/glock/src/git/rpi-ansible/roles/common/files/etc/ssh/ssh_host_rsa_key.jetson" 27 | # } 28 | # }, 29 | # "item": "etc/ssh/ssh_host_rsa_key", 30 | # "stat": { 31 | # "exists": false 32 | # } 33 | # }, 34 | 35 | - name: set SSH host keys 36 | copy: 37 | src: "{{ item.invocation.module_args.path}}" 38 | dest: "/{{ item.item }}" 39 | owner: root 40 | group: root 41 | mode: '0600' 42 | loop: "{{ result.results }}" 43 | when: item.stat.exists 44 | register: result 45 | tags: 46 | - sshd 47 | 48 | # at this point, each element of result.results looks like 49 | # { 50 | # "ansible_loop_var": "item", 51 | # "changed": false, 52 | # "checksum": "a6a3094160f7a27a98b6ab7b5ef34877485b77ef", 53 | # "dest": "/etc/ssh/ssh_host_rsa_key", 54 | # "diff": { 55 | # "after": { 56 | # "path": "/etc/ssh/ssh_host_rsa_key" 57 | # }, 58 | # "before": { 59 | # "path": "/etc/ssh/ssh_host_rsa_key" 60 | # } 61 | # }, 62 | # "failed": false, 63 | # "gid": 0, 64 | # "group": "root", 65 | # "invocation": { 66 | # "module_args": { 67 | # "_diff_peek": null, 68 | # "_original_basename": "ssh_host_rsa_key.cloverdale", 69 | # "access_time": null, 70 | # "access_time_format": "%Y%m%d%H%M.%S", 71 | # "attributes": null, 72 | # "backup": null, 73 | # "content": null, 74 | # "delimiter": null, 75 | # "dest": "/etc/ssh/ssh_host_rsa_key", 76 | # "directory_mode": null, 77 | # "follow": true, 78 | # "force": false, 79 | # "group": "root", 80 | # "mode": "0600", 81 | # "modification_time": null, 82 | # "modification_time_format": "%Y%m%d%H%M.%S", 83 | # "owner": "root", 84 | # "path": "/etc/ssh/ssh_host_rsa_key", 85 | # "recurse": false, 86 | # "regexp": null, 87 | # "remote_src": null, 88 | # "selevel": null, 89 | # "serole": null, 90 | # "setype": null, 91 | # "seuser": null, 92 | # "src": null, 93 | # "state": "file", 94 | # "unsafe_writes": null 95 | # } 96 | # }, 97 | 98 | - name: remove old SSH host public keys 99 | file: 100 | path: "/{{ item.invocation.module_args.dest }}.pub" 101 | state: absent 102 | loop: "{{ result.results }}" 103 | when: item.changed 104 | register: result 105 | tags: 106 | - sshd 107 | 108 | - name: regenerate SSH host public keys 109 | shell: 110 | cmd: "ssh-keygen -y -f {{ item.invocation.module_args.path.split('.')[0] }} > /{{ item.invocation.module_args.path }}" 111 | creates: "/{{ item.invocation.module_args.path }}" 112 | loop: "{{ result.results }}" 113 | when: item.changed 114 | tags: 115 | - sshd 116 | -------------------------------------------------------------------------------- /roles/common/templates/etc/auto.nfs: -------------------------------------------------------------------------------- 1 | # 2 | # This file is controlled by ansible - do not modify directly! 3 | # 4 | {% for mount in autofs %} 5 | {{ mount["dest"] }} {{ mount["opts"] }} {{ mount["src"] }} 6 | {% endfor %} 7 | -------------------------------------------------------------------------------- /roles/common/templates/etc/default/cpufrequtils: -------------------------------------------------------------------------------- 1 | ENABLE="true" 2 | GOVERNOR="{{ cpufreq_governor }}" 3 | -------------------------------------------------------------------------------- /roles/common/templates/etc/hosts: -------------------------------------------------------------------------------- 1 | 127.0.0.1 localhost 2 | ::1 localhost ip6-localhost ip6-loopback 3 | ff02::1 ip6-allnodes 4 | ff02::2 ip6-allrouters 5 | 6 | {{ ansible_default_ipv4.address }} {{ target_hostname }}.{{ target_domain }} {{ target_hostname }} 7 | -------------------------------------------------------------------------------- /roles/common/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ssh_host_key_files: 3 | - etc/ssh/ssh_host_rsa_key 4 | - etc/ssh/ssh_host_dsa_key 5 | - etc/ssh/ssh_host_ecdsa_key 6 | - etc/ssh/ssh_host_ed25519_key 7 | -------------------------------------------------------------------------------- /roles/jetson/files/etc/docker/daemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimes": { 3 | "nvidia": { 4 | "path": "nvidia-container-runtime", 5 | "runtimeArgs": [] 6 | } 7 | }, 8 | "default-runtime": "nvidia" 9 | } 10 | -------------------------------------------------------------------------------- /roles/jetson/files/etc/profile.d/cuda.sh: -------------------------------------------------------------------------------- 1 | # Check for bash 2 | if [ -n "${BASH_VERSION-}" ]; then 3 | if [[ $PATH != */usr/local/cuda/bin* ]]; then 4 | export PATH=/usr/local/cuda/bin${PATH:+:${PATH}} 5 | fi 6 | if [[ $LD_LIBRARY_PATH != */usr/local/cuda/lib64* ]]; then 7 | export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 8 | fi 9 | fi 10 | -------------------------------------------------------------------------------- /roles/jetson/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: "restart docker" 3 | service: 4 | name: docker 5 | state: restarted 6 | -------------------------------------------------------------------------------- /roles/jetson/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: "add cuda to default path" 3 | copy: 4 | src: etc/profile.d/cuda.sh 5 | dest: /etc/profile.d/cuda.sh 6 | mode: 0644 7 | owner: root 8 | group: root 9 | 10 | - name: "docker: install nvidia runtime as default" 11 | copy: 12 | src: etc/docker/daemon.json 13 | dest: /etc/docker/daemon.json 14 | mode: 0644 15 | owner: root 16 | group: root 17 | notify: 18 | - "restart docker" 19 | 20 | # this should be already created on JetPack 21 | - name: "create docker group" 22 | group: 23 | name: docker 24 | state: present 25 | register: users 26 | 27 | - name: "get list of existing users" 28 | getent: 29 | database: passwd 30 | tags: 31 | - users 32 | 33 | - name: "add user 1000 to docker group" 34 | user: 35 | name: "{{ item.0 }}" 36 | groups: 37 | - docker 38 | append: True 39 | loop: "{{ getent_passwd.items() | list }}" 40 | when: item[1][1] | int == 1000 41 | tags: 42 | - users 43 | 44 | - include: swap.yml 45 | - include: software.yml 46 | -------------------------------------------------------------------------------- /roles/jetson/tasks/software.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # 3 | # Software that all hosts with this role will need 4 | # 5 | - name: install software for Jetson Nano 6 | apt: 7 | name: "{{ packages }}" 8 | state: present 9 | update_cache: yes 10 | vars: 11 | packages: 12 | - docker-compose 13 | tags: 14 | - sw 15 | 16 | - name: remove ubuntu-desktop 17 | apt: 18 | name: "ubuntu-desktop" 19 | state: absent 20 | autoremove: yes 21 | autoclean: yes 22 | -------------------------------------------------------------------------------- /roles/jetson/tasks/swap.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # 3 | # Add swapfile per Jetson Nano DLI setup instructions. Not recommended on a 4 | # 32 GB (or smaller) SD card. 5 | # 6 | - name: "create swap - disable nvzramconfig" 7 | systemd: 8 | name: nvzramconfig 9 | enabled: no 10 | when: swapsize_gb > 0 11 | tags: 12 | - swap 13 | 14 | - name: "check if swap file exists" 15 | stat: 16 | path: "/mnt/{{ swapsize_gb }}GB.swap" 17 | register: st 18 | when: swapsize_gb > 0 19 | tags: 20 | - swap 21 | 22 | - name: "create swap file if not exists" 23 | command: "fallocate -l {{ swapsize_gb }}G /mnt/{{ swapsize_gb }}GB.swap" 24 | when: swapsize_gb > 0 and st.stat.islnk is not defined 25 | tags: 26 | - swap 27 | 28 | - name: "verify permission on swap file" 29 | file: 30 | path: "/mnt/{{ swapsize_gb }}GB.swap" 31 | owner: root 32 | group: root 33 | mode: 0600 34 | when: swapsize_gb > 0 35 | tags: 36 | - swap 37 | 38 | - name: "register swap file" 39 | command: "mkswap /mnt/{{ swapsize_gb }}GB.swap" 40 | when: swapsize_gb > 0 and st.stat.islnk is not defined 41 | tags: 42 | - swap 43 | 44 | - name: "verify swap will mount" 45 | mount: 46 | src: "/mnt/{{ swapsize_gb }}GB.swap" 47 | opts: defaults 48 | state: present 49 | fstype: swap 50 | path: swap 51 | when: swapsize_gb > 0 52 | tags: 53 | - swap 54 | 55 | - name: "mount swap" 56 | command: "swapon /mnt/{{ swapsize_gb }}GB.swap" 57 | when: swapsize_gb > 0 and st.stat.islnk is not defined 58 | tags: 59 | - swap 60 | 61 | 62 | -------------------------------------------------------------------------------- /roles/rpi/files/etc/timezone: -------------------------------------------------------------------------------- 1 | America/Los_Angeles 2 | -------------------------------------------------------------------------------- /roles/rpi/tasks/darshan-dev.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install prerequisite software for Darshan development 3 | apt: 4 | name: 5 | - mpich 6 | - zlib1g-dev 7 | - autoconf 8 | state: present 9 | update_cache: yes 10 | tags: 11 | - sw 12 | -------------------------------------------------------------------------------- /roles/rpi/tasks/loadconfig.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Self identify and load config - this allows the playbook to run on either 3 | # localhost or a remote host 4 | - name: store MAC address for eth0 5 | set_fact: 6 | my_macaddr: "{{ hostvars[inventory_hostname].ansible_eth0.macaddress }}" 7 | when: "inventory_hostname == 'localhost' and 'ansible_eth0' in hostvars[inventory_hostname]" 8 | tags: 9 | - raspi 10 | - sw 11 | - sshd 12 | - motd 13 | 14 | # Raspberry Pi Zero W has no eth0, so fall back to wlan0 15 | - name: store MAC address for wlan0 16 | set_fact: 17 | my_macaddr: "{{ hostvars[inventory_hostname].ansible_wlan0.macaddress }}" 18 | when: "inventory_hostname == 'localhost' and my_macaddr is not defined" 19 | tags: 20 | - raspi 21 | - sw 22 | - sshd 23 | - motd 24 | 25 | # for model A, we cannot proceed because there is no mac address 26 | 27 | - name: load raspberry pi configuration (local mode) 28 | include_vars: 29 | file: "../../../host_vars/{{ macaddrs[my_macaddr] }}.yml" 30 | when: inventory_hostname_short == 'localhost' 31 | tags: 32 | - raspi 33 | - sw 34 | - sshd 35 | - motd 36 | 37 | - name: assert that configuration is loaded 38 | assert: 39 | that: 40 | - "target_hostname | default(false)" 41 | 42 | - debug: 43 | msg: "loaded configuration for {{ target_hostname }}" 44 | -------------------------------------------------------------------------------- /roles/rpi/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - include: loadconfig.yml 3 | 4 | # Gather facts specific to the Raspberry Pi platform 5 | - include: raspi-facts.yml 6 | 7 | - name: get rid of default 127.0.1.1 binding 8 | lineinfile: 9 | dest=/etc/hosts 10 | regexp="^127.0.1.1" 11 | state=absent 12 | 13 | # Set X keyboard layout 14 | - name: set X11 keyboard layout 15 | command: "raspi-config nonint do_configure_keyboard {{ xkblayout }}" 16 | when: "xkblayout|default(false) and linux_xkblayout != xkblayout" 17 | 18 | # Set wifi country 19 | - name: set wifi country 20 | command: "raspiconfig nonint do_wifi_country {{ wifi_country }}" 21 | when: "wifi_country|default(false) and wifi_country != raspi_wifi_country" 22 | 23 | # Enable sshd 24 | - name: disable ssh login for user pi 25 | lineinfile: 26 | dest=/etc/ssh/sshd_config 27 | line="DenyUsers pi" 28 | state=present 29 | tags: 30 | - raspi 31 | 32 | - name: enable SSH via raspi-config 33 | shell: "raspi-config nonint do_ssh 0" 34 | when: not raspi_ssh_enabled 35 | tags: 36 | - raspi 37 | 38 | # Other tasks 39 | - include: software.yml 40 | - include: users.yml 41 | - include: raspi-config.yml 42 | - include: darshan-dev.yml 43 | when: "darshan_dev|default(false)" 44 | 45 | # Install motd 46 | # May be easier to pull from /sys/firmware/devicetree/base/model 47 | - name: load Raspberry Pi hardware history 48 | include_vars: 49 | file: vars/raspi-models.yml 50 | tags: 51 | - motd 52 | 53 | - name: install motd 54 | template: 55 | src: etc/motd 56 | dest: /etc/motd 57 | owner: root 58 | group: root 59 | mode: "0644" 60 | tags: 61 | - motd 62 | 63 | - include: ufw.yml 64 | -------------------------------------------------------------------------------- /roles/rpi/tasks/raspi-config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # Handle boot and autologin settings 4 | - name: enable cli only 5 | command: "raspi-config nonint do_boot_behaviour B1" 6 | when: not enable_gui and not enable_autologin and (raspi_gui_enabled or raspi_autologin_enabled) 7 | tags: 8 | - raspi 9 | 10 | - name: enable cli with autologin 11 | command: "raspi-config nonint do_boot_behaviour B2" 12 | when: not enable_gui and enable_autologin and (raspi_gui_enabled or not raspi_autologin_enabled) 13 | tags: 14 | - raspi 15 | 16 | - name: enable desktop gui 17 | command: "raspi-config nonint do_boot_behaviour B3" 18 | when: enable_gui and not enable_autologin and (not raspi_gui_enabled or raspi_autologin_enabled) 19 | tags: 20 | - raspi 21 | 22 | - name: enable desktop gui with autologin 23 | command: "raspi-config nonint do_boot_behaviour B4" 24 | when: enable_gui and enable_autologin and (not raspi_gui_enabled or raspi_autologin_enabled) 25 | tags: 26 | - raspi 27 | 28 | - name: set bootwait option 29 | command: "raspi-config nonint do_boot_wait {{ 0 if enable_bootwait else 1 }}" 30 | when: "enable_bootwait | default(false) and enable_bootwait != raspi_bootwait_enabled" 31 | tags: 32 | - raspi 33 | 34 | - name: set boot splash option 35 | command: "raspi-config nonint do_boot_splash {{ 0 if enable_bootsplash else 1 }}" 36 | when: "enable_bootsplash | default(false) and enable_bootsplash != raspi_bootsplash_enabled" 37 | tags: 38 | - raspi 39 | 40 | - name: enable/disable camera 41 | command: "raspi-config nonint do_camera {{ 0 if enable_camera else 1 }}" 42 | when: "enable_camera | default(false) and enable_camera != raspi_camera_enabled" 43 | tags: 44 | - raspi 45 | 46 | - name: enable/disable VNC server 47 | command: "raspi-config nonint do_vnc {{ 0 if enable_vnc else 1 }}" 48 | when: "enable_vnc | default(false) and enable_vnc != raspi_vnc_enabled" 49 | tags: 50 | - raspi 51 | 52 | - name: enable/disable SPI 53 | command: "raspi-config nonint do_spi {{ 0 if enable_spi else 1 }}" 54 | when: "enable_spi | default(false) and enable_spi != raspi_spi_enabled" 55 | tags: 56 | - raspi 57 | 58 | - name: enable/disable I2C 59 | command: "raspi-config nonint do_i2c {{ 0 if enable_i2c else 1 }}" 60 | when: "enable_i2c | default(false) and enable_i2c != raspi_i2c_enabled" 61 | tags: 62 | - raspi 63 | 64 | - name: enable/disable serial 65 | command: "raspi-config nonint do_serial {{ 0 if enable_serial else 1 }}" 66 | when: "enable_serial | default(false) and enable_serial != raspi_serial_enabled" 67 | tags: 68 | - raspi 69 | 70 | - name: enable/disable hardware serial 71 | command: "raspi-config nonint do_serial_hw {{ 0 if enable_serial_hw else 1 }}" 72 | when: "enable_serial_hw | default(false) and enable_serial_hw != raspi_serial_hw_enabled" 73 | tags: 74 | - raspi 75 | 76 | - name: enable/disable onewire 77 | command: "raspi-config nonint do_onewire {{ 0 if enable_onewire else 1 }}" 78 | when: "enable_onewire | default(false) and enable_onewire != raspi_onewire_enabled" 79 | tags: 80 | - raspi 81 | 82 | - name: enable/disable remote GPIO 83 | command: "raspi-config nonint do_rgpio {{ 0 if enable_rgpio else 1 }}" 84 | when: "enable_rgpio | default(false) and enable_rgpio != raspi_rgpio_enabled" 85 | tags: 86 | - raspi 87 | 88 | - name: enable/disable HDMI overscan 89 | command: "raspi-config nonint do_overscan {{ 0 if enable_overscan else 1 }}" 90 | when: "enable_overscan | default(false) and enable_overscan != raspi_overscan_enabled" 91 | tags: 92 | - raspi 93 | 94 | - name: expand file system 95 | command: "raspi-config nonint do_expand_rootfs" 96 | when: raspi_fs_expandable 97 | tags: 98 | - raspi 99 | -------------------------------------------------------------------------------- /roles/rpi/tasks/raspi-facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: get Raspberry Pi model type 3 | shell: "raspi-config nonint get_pi_type" 4 | register: raspi_type 5 | changed_when: False 6 | check_mode: no 7 | tags: 8 | - raspi 9 | 10 | - name: get hostname via raspi-config 11 | shell: "raspi-config nonint get_hostname" 12 | register: current_hostname 13 | changed_when: False 14 | check_mode: no 15 | tags: 16 | - raspi 17 | 18 | - name: get boot-to-gui setting 19 | shell: "raspi-config nonint get_boot_cli" # 0 == "boot to cli"; 1 == "boot to gui" 20 | register: raspi_boot_gui 21 | changed_when: False 22 | check_mode: no 23 | tags: 24 | - raspi 25 | 26 | - name: get autologin setting 27 | shell: "raspi-config nonint get_autologin" # 0 == "enable autologin"; 1 == "disable autologin" 28 | register: raspi_noautologin 29 | changed_when: False 30 | check_mode: no 31 | tags: 32 | - raspi 33 | 34 | - name: get wait-for-network-on-boot setting 35 | shell: "raspi-config nonint get_boot_wait" # 0 == "wait"; 1 == "don't wait" 36 | register: raspi_boot_nowait 37 | changed_when: False 38 | check_mode: no 39 | tags: 40 | - raspi 41 | 42 | - name: get splash screen setting 43 | shell: "raspi-config nonint get_boot_splash" # 0 == "wait"; 1 == "don't wait" 44 | register: raspi_boot_splash 45 | changed_when: False 46 | check_mode: no 47 | tags: 48 | - raspi 49 | 50 | - name: get wifi country 51 | shell: "raspi-config nonint get_wifi_country || echo unknown" 52 | register: raspi_wifi_country 53 | changed_when: False 54 | check_mode: no 55 | tags: 56 | - raspi 57 | 58 | - name: get camera status 59 | shell: "raspi-config nonint get_camera" # 0 == "camera enabled"; 1 == "camera disabled" 60 | register: raspi_camera_disabled 61 | changed_when: False 62 | check_mode: no 63 | tags: 64 | - raspi 65 | 66 | - name: get ssh enabled status 67 | shell: "raspi-config nonint get_ssh" 68 | register: raspi_ssh_disabled 69 | changed_when: False 70 | check_mode: no 71 | tags: 72 | - raspi 73 | 74 | - name: get VNC enabled status 75 | shell: "raspi-config nonint get_vnc" 76 | register: raspi_vnc_disabled 77 | changed_when: False 78 | check_mode: no 79 | tags: 80 | - raspi 81 | 82 | - name: get SPI enabled status 83 | shell: "raspi-config nonint get_spi" 84 | register: raspi_spi_disabled 85 | changed_when: False 86 | check_mode: no 87 | tags: 88 | - raspi 89 | 90 | - name: get I2C enabled status 91 | shell: "raspi-config nonint get_i2c" 92 | register: raspi_i2c_disabled 93 | changed_when: False 94 | check_mode: no 95 | tags: 96 | - raspi 97 | 98 | - name: get serial enabled status 99 | shell: "raspi-config nonint get_serial" 100 | register: raspi_serial_disabled 101 | changed_when: False 102 | check_mode: no 103 | tags: 104 | - raspi 105 | 106 | - name: get hardware serial enabled status 107 | shell: "raspi-config nonint get_serial_hw" 108 | register: raspi_serial_hw_disabled 109 | changed_when: False 110 | check_mode: no 111 | tags: 112 | - raspi 113 | 114 | - name: get onewire enabled status 115 | shell: "raspi-config nonint get_onewire" 116 | register: raspi_onewire_disabled 117 | changed_when: False 118 | check_mode: no 119 | tags: 120 | - raspi 121 | 122 | - name: get remote gpio enabled status 123 | shell: "raspi-config nonint get_rgpio" 124 | register: raspi_rgpio_disabled 125 | changed_when: False 126 | check_mode: no 127 | tags: 128 | - raspi 129 | 130 | - name: get overclock state 131 | shell: "raspi-config nonint get_config_var arm_freq /boot/config.txt" 132 | register: raspi_overclock 133 | changed_when: False 134 | check_mode: no 135 | tags: 136 | - raspi 137 | 138 | - name: get fs expandability 139 | shell: "raspi-config nonint get_can_expand" 140 | register: raspi_fs_unexpandable 141 | changed_when: False 142 | check_mode: no 143 | tags: 144 | - raspi 145 | 146 | - name: get overscan setting 147 | shell: "raspi-config nonint get_overscan" 148 | register: raspi_overscan_enabled 149 | changed_when: False 150 | check_mode: no 151 | tags: 152 | - raspi 153 | 154 | - name: get GPU memory split 155 | shell: "raspi-config nonint get_config_var gpu_mem /boot/config.txt" 156 | register: raspi_gpu_mem 157 | changed_when: False 158 | check_mode: no 159 | tags: 160 | - raspi 161 | 162 | - name: get GPU memory split 256 163 | shell: "raspi-config nonint get_config_var gpu_mem_256 /boot/config.txt" 164 | register: raspi_gpu_mem_256 165 | changed_when: False 166 | check_mode: no 167 | tags: 168 | - raspi 169 | 170 | - name: get GPU memory split 512 171 | shell: "raspi-config nonint get_config_var gpu_mem_512 /boot/config.txt" 172 | register: raspi_gpu_mem_512 173 | changed_when: False 174 | check_mode: no 175 | tags: 176 | - raspi 177 | 178 | - name: get GPU memory split 1024 179 | shell: "raspi-config nonint get_config_var gpu_mem_1024 /boot/config.txt" 180 | register: raspi_gpu_mem_1024 181 | changed_when: False 182 | check_mode: no 183 | tags: 184 | - raspi 185 | 186 | - name: determine last allocated disk sector 187 | shell: "parted /dev/mmcblk0 -ms unit s p | tail -n1 | awk -F':' '{ print $3 + 0 }'" 188 | register: raspi_last_alloced_sector 189 | changed_when: False 190 | check_mode: no 191 | tags: 192 | - raspi 193 | 194 | - name: get Raspberry Pi revision info 195 | command: awk '/^Revision/ {print $3}' /proc/cpuinfo 196 | register: raspi_rev_check 197 | changed_when: False 198 | check_mode: no 199 | tags: 200 | - raspi 201 | - motd 202 | 203 | - name: set raspi-config facts (all) 204 | set_fact: 205 | raspi_type: "{{ raspi_type.stdout }}" 206 | current_hostname: "{{ current_hostname.stdout }}" 207 | raspi_wifi_country: "{{ raspi_wifi_country.stdout }}" 208 | raspi_gui_enabled: "{{ raspi_boot_gui.stdout != '0' }}" 209 | raspi_autologin_enabled: "{{ raspi_noautologin.stdout == '0' }}" 210 | raspi_bootwait_enabled: "{{ raspi_boot_nowait.stdout == '0' }}" 211 | raspi_bootsplash_enabled: "{{ raspi_boot_splash.stdout == '0' }}" 212 | raspi_camera_enabled: "{{ raspi_camera_disabled.stdout == '0' }}" 213 | raspi_ssh_enabled: "{{ raspi_ssh_disabled.stdout == '0' }}" 214 | raspi_vnc_enabled: "{{ raspi_vnc_disabled.stdout == '0' and 'find' not in raspi_vnc_disabled.stderr and 'found' not in raspi_vnc_disabled.stderr }}" 215 | raspi_spi_enabled: "{{ raspi_spi_disabled.stdout == '0' }}" 216 | raspi_i2c_enabled: "{{ raspi_i2c_disabled.stdout == '0' }}" 217 | raspi_serial_enabled: "{{ raspi_serial_disabled.stdout == '0' }}" 218 | raspi_serial_hw_enabled: "{{ raspi_serial_hw_disabled.stdout == '0' }}" 219 | raspi_onewire_enabled: "{{ raspi_onewire_disabled.stdout == '0' }}" 220 | raspi_rgpio_enabled: "{{ raspi_rgpio_disabled.stdout == '0' }}" 221 | raspi_overclock: "{{ raspi_overclock.stdout }}" 222 | raspi_fs_expandable: "{{ raspi_fs_unexpandable.stdout == '0' and (raspi_last_alloced_sector.stdout|int + 1) < ansible_devices.mmcblk0.sectors|int }}" 223 | raspi_overscan_enabled: "{{ raspi_overscan_enabled.stdout }}" 224 | raspi_gpu_mem: "{{ raspi_gpu_mem.stdout }}" 225 | raspi_gpu_mem_256: "{{ raspi_gpu_mem_256.stdout }}" 226 | raspi_gpu_mem_512: "{{ raspi_gpu_mem_512.stdout }}" 227 | raspi_gpu_mem_1024: "{{ raspi_gpu_mem_1024.stdout }}" 228 | check_mode: no 229 | tags: 230 | - raspi 231 | 232 | - name: set raspi-config facts (for motd) 233 | set_fact: 234 | raspi_rev: "{{ raspi_rev_check.stdout }}" 235 | check_mode: no 236 | tags: 237 | - raspi 238 | - motd 239 | -------------------------------------------------------------------------------- /roles/rpi/tasks/software.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Install required software 3 | - name: install software for Raspberry Pi 4 | apt: 5 | name: "{{ packages }}" 6 | state: present 7 | update_cache: yes 8 | vars: 9 | packages: 10 | - python-pip 11 | tags: 12 | - sw 13 | 14 | # Uninstall Raspbian bloat 15 | - name: remove raspbian bloat 16 | apt: 17 | name: "{{ packages }}" 18 | state: absent 19 | vars: 20 | packages: 21 | - wolfram-engine 22 | - libreoffice* 23 | - scratch 24 | - minecraft-pi 25 | - python-minecraftpi 26 | - python3-minecraftpi 27 | - sonic-pi 28 | - dillo 29 | - gpicview 30 | - penguinspuzzle 31 | tags: 32 | - sw 33 | -------------------------------------------------------------------------------- /roles/rpi/tasks/ufw.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # 3 | # Configure firewall 4 | # 5 | - name: allow SSH through UFW 6 | ufw: 7 | rule: allow 8 | port: ssh 9 | proto: tcp 10 | log: yes 11 | tags: 12 | - ufw 13 | 14 | - name: allow mDNS through UFW 15 | ufw: 16 | rule: allow 17 | to_ip: 224.0.0.251 18 | proto: igmp 19 | log: no 20 | tags: 21 | - ufw 22 | 23 | - name: drop multicast without logging 24 | ufw: 25 | rule: deny 26 | to_ip: 224.0.0.1 27 | log: no 28 | tags: 29 | - ufw 30 | 31 | - name: set default incoming UFW policy to deny 32 | ufw: 33 | direction: incoming 34 | policy: deny 35 | tags: 36 | - ufw 37 | 38 | - name: set default outgoing UFW policy to allow 39 | ufw: 40 | direction: outgoing 41 | policy: allow 42 | tags: 43 | - ufw 44 | 45 | - name: enable UFW 46 | ufw: 47 | state: "enabled" 48 | logging: "on" 49 | tags: 50 | - ufw 51 | -------------------------------------------------------------------------------- /roles/rpi/tasks/users.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ### Switch to non-default user as soon as possible if possible 3 | #- name: does primary login user exist? 4 | # local_action: "command ssh -q -o ConnectTimeout=3 -l {{ create_users[0].name }} {{ inventory_hostname }} /bin/true" 5 | # register: user_exists 6 | # ignore_errors: true 7 | # changed_when: false 8 | # 9 | #- name: switch remote_user if possible 10 | # remote_user: "{{ user_exists | success | ternary(omit, create_users[0].name) }}" 11 | # command: "/bin/true" 12 | # changed_when: false 13 | 14 | - name: import user configs 15 | include_vars: 16 | file: vars/users.yml 17 | tags: 18 | - users 19 | 20 | ### Create user accounts 21 | - name: create users 22 | user: name="{{ item.name }}" 23 | comment="{{ item.comment }}" 24 | group="{{ item.group }}" 25 | groups="{{ item.groups }}" 26 | uid="{{ item.uid }}" 27 | state=present 28 | shell=/bin/bash 29 | with_items: "{{ create_users }}" 30 | tags: [ 'users' ] 31 | 32 | - name: install ssh pubkeys for new users 33 | authorized_key: user="{{ item.name }}" 34 | key="{{ item.pubkey }}" 35 | state=present 36 | with_items: "{{ create_users }}" 37 | tags: [ 'users' ] 38 | 39 | ### disable the 'pi' user's ability to login in with password 40 | ### if you enable this, you may lock yourself out--you must make sure another 41 | ### user has been added with both sudo privileges and a password by which 42 | ### sudo can be authenticated 43 | #- name: disable 'pi' user 44 | # user: name="pi" 45 | # password="*" 46 | # state=present 47 | # tags: [ 'users' ] 48 | -------------------------------------------------------------------------------- /roles/rpi/templates/etc/motd: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- 2 | {% if target_hostname == "some_specific_hostname" %} 3 | {% else %} 4 | .~~. .~~. 5 | '. \ ' ' / .' 6 | .~ .~~~..~. 7 | : .~.'~'.~. : {{ target_hostname }} 8 | ~ ( ) ( ) ~ Raspberry Pi {% if raspi_rev in raspi_models %}{{ raspi_models[raspi_rev].model }}{% else %}Revision {{ raspi_rev }}{% endif %} 9 | ( : '~'.~.'~' : ) {{ ansible_processor_count }} core{% if ansible_processor_count > 1 %}s{% endif %}, {% if raspi_rev in raspi_models %}{{ raspi_models[raspi_rev].mem }}{% else %}{{ ansible_memtotal_mb }} MB{% endif %} RAM 10 | ~ .~ ( ) ~. ~ {{ ansible_lsb.description }} 11 | ( : '~' : ) 12 | '~ .~~~. ~' 13 | '~' 14 | {% endif %} 15 | -------------------------------------------------------------------------------- 16 | -------------------------------------------------------------------------------- /roles/rpi/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | -------------------------------------------------------------------------------- /roles/rpi/vars/raspi-models.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Taken from https://elinux.org/RPi_HardwareHistory 3 | # Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) 4 | raspi_models: 5 | Beta: 6 | release: "Q1 2012" 7 | model: "B (Beta)" 8 | pcb_rev: "?" 9 | mem: "256 MB" 10 | notes: "Beta Board" 11 | 0002: 12 | release: "Q1 2012" 13 | model: "B" 14 | pcb_rev: "1.0" 15 | mem: "256 MB" 16 | 0003: 17 | release: "Q3 2012" 18 | model: "B (ECN0001)" 19 | pcb_rev: "1.0" 20 | mem: "256 MB" 21 | notes: "Fuses mod and D14 removed" 22 | 0004: 23 | release: "Q3 2012" 24 | model: "B" 25 | pcb_rev: "2.0" 26 | mem: "256 MB" 27 | 0005: 28 | release: "Q4 2012" 29 | model: "B" 30 | pcb_rev: "2.0" 31 | mem: "256 MB" 32 | notes: "(Mfg by Qisda)" 33 | 0006: 34 | release: "Q4 2012" 35 | model: "B" 36 | pcb_rev: "2.0" 37 | mem: "256 MB" 38 | notes: "(Mfg by Egoman)" 39 | 0007: 40 | release: "Q1 2013" 41 | model: "A" 42 | pcb_rev: "2.0" 43 | mem: "256 MB" 44 | notes: "(Mfg by Egoman)" 45 | 0008: 46 | release: "Q1 2013" 47 | model: "A" 48 | pcb_rev: "2.0" 49 | mem: "256 MB" 50 | notes: "(Mfg by Sony)" 51 | 0009: 52 | release: "Q1 2013" 53 | model: "A" 54 | pcb_rev: "2.0" 55 | mem: "256 MB" 56 | notes: "(Mfg by Qisda)" 57 | 000d: 58 | release: "Q4 2012" 59 | model: "B" 60 | pcb_rev: "2.0" 61 | mem: "512 MB" 62 | notes: "(Mfg by Egoman)" 63 | 000e: 64 | release: "Q4 2012" 65 | model: "B" 66 | pcb_rev: "2.0" 67 | mem: "512 MB" 68 | notes: "(Mfg by Sony)" 69 | 000f: 70 | release: "Q4 2012" 71 | model: "B" 72 | pcb_rev: "2.0" 73 | mem: "512 MB" 74 | notes: "(Mfg by Qisda)" 75 | 0010: 76 | release: "Q3 2014" 77 | model: "B+" 78 | pcb_rev: "1.0" 79 | mem: "512 MB" 80 | notes: "(Mfg by Sony)" 81 | 0011: 82 | release: "Q2 2014" 83 | model: "Compute Module 1" 84 | pcb_rev: "1.0" 85 | mem: "512 MB" 86 | notes: "(Mfg by Sony)" 87 | 0012: 88 | release: "Q4 2014" 89 | model: "A+" 90 | pcb_rev: "1.1" 91 | mem: "256 MB" 92 | notes: "(Mfg by Sony)" 93 | 0013: 94 | release: "Q1 2015" 95 | model: "B+" 96 | pcb_rev: "1.2" 97 | mem: "512 MB" 98 | notes: "(Mfg by Embest)" 99 | 0014: 100 | release: "Q2 2014" 101 | model: "Compute Module 1" 102 | pcb_rev: "1.0" 103 | mem: "512 MB" 104 | notes: "(Mfg by Embest)" 105 | 0015: 106 | release: "?" 107 | model: "A+" 108 | pcb_rev: "1.1" 109 | mem: "256 MB / 512 MB" 110 | notes: "(Mfg by Embest)" 111 | a01040: 112 | release: "Unknown" 113 | model: "2 Model B" 114 | pcb_rev: "1.0" 115 | mem: "1 GB" 116 | notes: "(Mfg by Sony)" 117 | a01041: 118 | release: "Q1 2015" 119 | model: "2 Model B" 120 | pcb_rev: "1.1" 121 | mem: "1 GB" 122 | notes: "(Mfg by Sony)" 123 | a21041: 124 | release: "Q1 2015" 125 | model: "2 Model B" 126 | pcb_rev: "1.1" 127 | mem: "1 GB" 128 | notes: "(Mfg by Embest)" 129 | a22042: 130 | release: "Q3 2016" 131 | model: "2 Model B (with BCM2837)" 132 | pcb_rev: "1.2" 133 | mem: "1 GB" 134 | notes: "(Mfg by Embest)" 135 | 900021: 136 | release: "Q3 2016" 137 | model: "A+" 138 | pcb_rev: "1.1" 139 | mem: "512 MB" 140 | notes: "(Mfg by Sony)" 141 | 900032: 142 | release: "Q2 2016?" 143 | model: "B+" 144 | pcb_rev: "1.2" 145 | mem: "512 MB" 146 | notes: "(Mfg by Sony)" 147 | 900092: 148 | release: "Q4 2015" 149 | model: "Zero" 150 | pcb_rev: "1.2" 151 | mem: "512 MB" 152 | notes: "(Mfg by Sony)" 153 | 900093: 154 | release: "Q2 2016" 155 | model: "Zero" 156 | pcb_rev: "1.3" 157 | mem: "512 MB" 158 | notes: "(Mfg by Sony)" 159 | 920093: 160 | release: "Q4 2016?" 161 | model: "Zero" 162 | pcb_rev: "1.3" 163 | mem: "512 MB" 164 | notes: "(Mfg by Embest)" 165 | 9000c1: 166 | release: "Q1 2017" 167 | model: "Zero W" 168 | pcb_rev: "1.1" 169 | mem: "512 MB" 170 | notes: "(Mfg by Sony)" 171 | a02082: 172 | release: "Q1 2016" 173 | model: "3 Model B" 174 | pcb_rev: "1.2" 175 | mem: "1 GB" 176 | notes: "(Mfg by Sony)" 177 | a020a0: 178 | release: "Q1 2017" 179 | model: "Compute Module 3 (and CM3 Lite)" 180 | pcb_rev: "1.0" 181 | mem: "1 GB" 182 | notes: "(Mfg by Sony)" 183 | a22082: 184 | release: "Q1 2016" 185 | model: "3 Model B" 186 | pcb_rev: "1.2" 187 | mem: "1 GB" 188 | notes: "(Mfg by Embest)" 189 | a32082: 190 | release: "Q4 2016" 191 | model: "3 Model B" 192 | pcb_rev: "1.2" 193 | mem: "1 GB" 194 | notes: "(Mfg by Sony Japan)" 195 | a020d3: 196 | release: "Q1 2018" 197 | model: "3 Model B+" 198 | pcb_rev: "1.3" 199 | mem: "1 GB" 200 | notes: "(Mfg by Sony)" 201 | 9020e0: 202 | release: "Q4 2018" 203 | model: "3 Model A+" 204 | pcb_rev: "1.0" 205 | mem: "512 MB" 206 | notes: "(Mfg by Sony)" 207 | a02100: 208 | release: "Q1 2019" 209 | model: "Compute Module 3+" 210 | pcb_rev: "1.0" 211 | mem: "1 GB" 212 | notes: "(Mfg by Sony)" 213 | a03111: 214 | release: "Q2 2019" 215 | model: "4 Model B" 216 | pcb_rev: "1.1" 217 | mem: "1 GB" 218 | notes: "(Mfg by Sony)" 219 | b03111: 220 | release: "Q2 2019" 221 | model: "4 Model B" 222 | pcb_rev: "1.1" 223 | mem: "2 GB" 224 | notes: "(Mfg by Sony)" 225 | c03111: 226 | release: "Q2 2019" 227 | model: "4 Model B" 228 | pcb_rev: "1.1" 229 | mem: "4 GB" 230 | notes: "(Mfg by Sony)" 231 | c03112: 232 | model: "4 Model B" 233 | pcb_rev: "1.2" 234 | mem: "4 GB" 235 | notes: "(Mfg by Sony)" 236 | c03114: 237 | model: "4 Model B" 238 | pcb_rev: "1.4" 239 | mem: "8 GB" 240 | notes: "(Mfg by Sony)" 241 | -------------------------------------------------------------------------------- /roles/rpi/vars/users.yml: -------------------------------------------------------------------------------- 1 | $ANSIBLE_VAULT;1.1;AES256 2 | 61323338303366613463316430373366303531633166386439353331393038636237316233643037 3 | 3361643863323739633032663666363138383361316666630a613437386264396433326264653635 4 | 61346563633666663438393564623461623066636664363230626562653338613532386463346636 5 | 3766643262643766340a653933646661363436633561626431376663363138636533396661363038 6 | 33653964326366653936353538616239653061306438306130383863393161303064323466303761 7 | 65366431313766373062323534323962386363613061663365343361323162376232356637636230 8 | 64643566643662643863386631303765643163386464626565323966656439613333303733356433 9 | 32393530393335666430396133623432393734643635386166373434323538303033313431326162 10 | 64303434346564626666366638636333363865613763323264666462336565393235336131313662 11 | 61323263316231313238383435383830663566633965366232666332643536633933623136626433 12 | 31316166326331353934646438303437373235636636666163363832613936393434353534643532 13 | 65616164646465313239323439613436653536306664383265353334613436393730353364386538 14 | 37373563663162633537666339303039636562346635393666303233646664383835316434643334 15 | 36373062633665366631316163353963353065326530656439666133666630303937333562333566 16 | 63636431663266653030373533336631613264386464343131306563363531303634366565666338 17 | 30353537633765303963363462613161373837353837633265663537393838613861376166616230 18 | 34306637666266356332373265336566656337316165306537613330333963313037326238366234 19 | 36353838663135303261633834636230663039323136376635373836613364376662383366306262 20 | 63656432353236366336626538363161646365316631363833646562643330386332663835656538 21 | 62363164313135653537633565643063393437643130646637643061313464623735633737653836 22 | 33333539343236306438366265343964303166313333386338653066626133373566336532326630 23 | 64343265363565363834353136353164656263373331333032623531666131626234346332353036 24 | 66633434303439303135343137353065396136616532396131633666663738316433393562333631 25 | 36353866376335376132323933666163373936363233613931653266376133633863366662383136 26 | 36346265376162353636376538316465636332383333303439353361633764613266383135643335 27 | 32623961633837363237613338666332616462333431666433613831653835346332393135383036 28 | 61316261316630326263363631636362386234306565626633343739363338636236306633396231 29 | 34623361343731326137336531303435373037643130626635306435353433383863626237636539 30 | 61613039383630393630636635383730376138383331616265653765373633613032626436363538 31 | 34396232323531633166373161343934396336323633663639353333393036356565353762313434 32 | 32323038633262313434663139616133323762383932323164626633323733666530626239663739 33 | 38386563313565353935636136343237313961653163636463306132636362616165386263626264 34 | 31653137633164386130326132386663643535626135383866313733336637333735393862623839 35 | 66616138636138326465353164623865633161343436353935343930353764623830376564616136 36 | 34616135643735353439366464646565316663316533633335393930653034323830386239353536 37 | 34646437393138663939383766656335613063666134346433383931383938663234383962393839 38 | 64653430383034633761363339353137393531333762623936653132356362396336636463383335 39 | 63323964353033636335636631356163663031303463653761366331376634313432376132303835 40 | 30343064316636393466633365313235333634653164366432346466363764396334363131613034 41 | 37666438376530633464343962636439366630643965323135646365333231323833306235323634 42 | 38353739393530373939666130303738343265343736333732366535353764313335 43 | -------------------------------------------------------------------------------- /roles/rpi/vars/users.yml.example: -------------------------------------------------------------------------------- 1 | # Example of users.yml which you may want to encrypt using ansible-vault. 2 | # 3 | # Users that must be present on the system 4 | # 5 | create_users: 6 | - name: glock 7 | comment: "Glenn K. Lockwood" 8 | uid: 1024 9 | group: users 10 | # don't include the group from 'group:' above in the 'groups:' below; this 11 | # breaks idempotency for some reason 12 | groups: "adm,dialout,sudo,audio,video,plugdev,games,input,netdev,spi,i2c,gpio" 13 | pubkey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjx1Fevx4XODj8pJy/qRZDwQCRwNl0tJ3gWlDy1dB/AtdapVh5XYDUI99R+JqqzGgME9Bif6p1K6bqClLQh7MeY57L9IyjtqBF2t6/vNeKdOYDYQcBwL1p7vbGNTfKxYF2G4Lw+tRVGr3c+sCvA6r5UUAIhXNXTs7fLZanO6JGwITlJFcxDXPmITEhoXu4yTFqA0j1yp/K7I7dvmlhG/Yq+8P6zTJww1Zpy3aMaJ9gB4KR9jclW67wQZ3kVkFcyJtHXRI/LTzfAitB9W1X0svXysy88DiZsBGm1UmrUuFD3JPRn0SRRYchW5RdZ7MDPYWUDWweZIeuWvWRKzMkB5VJ" 14 | -------------------------------------------------------------------------------- /rpi.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: raspberrypi 3 | roles: 4 | - common 5 | - rpi 6 | --------------------------------------------------------------------------------