Compare commits
	
		
			308 Commits
		
	
	
		
			e1b412bfff
			...
			debian13
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						d51f8fefaa
	
				 | 
					
					
						|||
| 
						
						
							
						
						9ff6e19135
	
				 | 
					
					
						|||
| 
						
						
							
						
						4680999680
	
				 | 
					
					
						|||
| 
						
						
							
						
						602734acce
	
				 | 
					
					
						|||
| 
						
						
							
						
						0db7911b70
	
				 | 
					
					
						|||
| 
						
						
							
						
						ee4c62e5f9
	
				 | 
					
					
						|||
| 
						
						
							
						
						a315db8a7c
	
				 | 
					
					
						|||
| 
						
						
							
						
						5f00892df3
	
				 | 
					
					
						|||
| 
						
						
							
						
						9357265d27
	
				 | 
					
					
						|||
| 
						
						
							
						
						dd62266340
	
				 | 
					
					
						|||
| 
						
						
							
						
						a1bec20824
	
				 | 
					
					
						|||
| 
						
						
							
						
						8e91c44529
	
				 | 
					
					
						|||
| 
						
						
							
						
						02d4135c79
	
				 | 
					
					
						|||
| 
						
						
							
						
						37e148d009
	
				 | 
					
					
						|||
| 
						
						
							
						
						73dbbd23b6
	
				 | 
					
					
						|||
| 
						
						
							
						
						b84283aa38
	
				 | 
					
					
						|||
| 
						
						
							
						
						1695fdf8d1
	
				 | 
					
					
						|||
| 
						
						
							
						
						9f1f7b1c69
	
				 | 
					
					
						|||
| 
						
						
							
						
						7d725f2084
	
				 | 
					
					
						|||
| 
						
						
							
						
						4c39b0d48c
	
				 | 
					
					
						|||
| 
						
						
							
						
						f4023d0b20
	
				 | 
					
					
						|||
| 
						
						
							
						
						6aaface4a2
	
				 | 
					
					
						|||
| 
						
						
							
						
						333e1cbeb9
	
				 | 
					
					
						|||
| 
						
						
							
						
						0c62f4bdf0
	
				 | 
					
					
						|||
| 
						
						
							
						
						26f22c0447
	
				 | 
					
					
						|||
| 
						
						
							
						
						05881e2585
	
				 | 
					
					
						|||
| 
						
						
							
						
						d4d326c2f7
	
				 | 
					
					
						|||
| 
						
						
							
						
						1d4a6f208b
	
				 | 
					
					
						|||
| 
						
						
							
						
						8b22076d4a
	
				 | 
					
					
						|||
| 
						
						
							
						
						38176cb34c
	
				 | 
					
					
						|||
| 
						
						
							
						
						da737b71f7
	
				 | 
					
					
						|||
| 
						
						
							
						
						c28189a1a5
	
				 | 
					
					
						|||
| 
						
						
							
						
						b600141e89
	
				 | 
					
					
						|||
| 
						
						
							
						
						4be98d1a33
	
				 | 
					
					
						|||
| 
						
						
							
						
						2bb018a40c
	
				 | 
					
					
						|||
| 
						
						
							
						
						89a1e11b7a
	
				 | 
					
					
						|||
| 
						
						
							
						
						0c0cad9084
	
				 | 
					
					
						|||
| 
						
						
							
						
						9dce701a19
	
				 | 
					
					
						|||
| 
						
						
							
						
						3e9ee44d5b
	
				 | 
					
					
						|||
| 
						
						
							
						
						599b5e5e83
	
				 | 
					
					
						|||
| 
						
						
							
						
						bc700ea532
	
				 | 
					
					
						|||
| 
						
						
							
						
						8016701b57
	
				 | 
					
					
						|||
| 
						
						
							
						
						00558c7dea
	
				 | 
					
					
						|||
| 
						
						
							
						
						c927186837
	
				 | 
					
					
						|||
| 
						
						
							
						
						690774c862
	
				 | 
					
					
						|||
| 
						
						
							
						
						cc021bd14a
	
				 | 
					
					
						|||
| 
						
						
							
						
						73fd06fe3a
	
				 | 
					
					
						|||
| 
						
						
							
						
						88cb3a370e
	
				 | 
					
					
						|||
| 
						
						
							
						
						027a43ddbe
	
				 | 
					
					
						|||
| 
						
						
							
						
						bb30c3be20
	
				 | 
					
					
						|||
| 
						
						
							
						
						d8d9790d21
	
				 | 
					
					
						|||
| 
						
						
							
						
						9a500ebc0d
	
				 | 
					
					
						|||
| 
						
						
							
						
						4bae942585
	
				 | 
					
					
						|||
| 
						
						
							
						
						99866c0c90
	
				 | 
					
					
						|||
| 
						
						
							
						
						0afb8a4493
	
				 | 
					
					
						|||
| 
						
						
							
						
						506695da31
	
				 | 
					
					
						|||
| 
						
						
							
						
						f67ed7762c
	
				 | 
					
					
						|||
| 
						
						
							
						
						014f4d9502
	
				 | 
					
					
						|||
| 
						
						
							
						
						22c16e1ed3
	
				 | 
					
					
						|||
| 
						
						
							
						
						5aa6a33e51
	
				 | 
					
					
						|||
| 
						
						
							
						
						7f9b06af9c
	
				 | 
					
					
						|||
| 
						
						
							
						
						84db337fea
	
				 | 
					
					
						|||
| 
						
						
							
						
						7b23f5f94f
	
				 | 
					
					
						|||
| 
						
						
							
						
						9830338be3
	
				 | 
					
					
						|||
| 
						
						
							
						
						e3eed26765
	
				 | 
					
					
						|||
| 
						
						
							
						
						8b31c7e148
	
				 | 
					
					
						|||
| 
						
						
							
						
						3ff8043aaf
	
				 | 
					
					
						|||
| 
						
						
							
						
						cb79f7ef70
	
				 | 
					
					
						|||
| 
						
						
							
						
						bb14f05d2a
	
				 | 
					
					
						|||
| 
						
						
							
						
						5b1530fa91
	
				 | 
					
					
						|||
| 
						
						
							
						
						5312dc6bd5
	
				 | 
					
					
						|||
| 
						
						
							
						
						d6e060d3af
	
				 | 
					
					
						|||
| 
						
						
							
						
						b873af004a
	
				 | 
					
					
						|||
| 
						
						
							
						
						7ea3ab46f8
	
				 | 
					
					
						|||
| 
						
						
							
						
						0561bd5b52
	
				 | 
					
					
						|||
| 
						
						
							
						
						d62572f02c
	
				 | 
					
					
						|||
| 
						
						
							
						
						2ffe5e87d9
	
				 | 
					
					
						|||
| 
						
						
							
						
						38d4f1a303
	
				 | 
					
					
						|||
| 
						
						
							
						
						ed8cb88038
	
				 | 
					
					
						|||
| 
						
						
							
						
						c31e447861
	
				 | 
					
					
						|||
| 
						
						
							
						
						545684467c
	
				 | 
					
					
						|||
| 
						
						
							
						
						24ae5eaab1
	
				 | 
					
					
						|||
| 
						
						
							
						
						dac23f1427
	
				 | 
					
					
						|||
| 
						
						
							
						
						41fbc73dd1
	
				 | 
					
					
						|||
| 
						
						
							
						
						fee794bcf0
	
				 | 
					
					
						|||
| 
						
						
							
						
						8bce1d8b1b
	
				 | 
					
					
						|||
| 
						
						
							
						
						6dc2ea36b6
	
				 | 
					
					
						|||
| 
						
						
							
						
						af71a9b5f8
	
				 | 
					
					
						|||
| 
						
						
							
						
						4dd57803e2
	
				 | 
					
					
						|||
| 
						
						
							
						
						18d4245fc0
	
				 | 
					
					
						|||
| 
						
						
							
						
						1bddf3cccd
	
				 | 
					
					
						|||
| 
						
						
							
						
						20dbe61fe1
	
				 | 
					
					
						|||
| 
						
						
							
						
						899e87321b
	
				 | 
					
					
						|||
| 
						
						
							
						
						06416a3b64
	
				 | 
					
					
						|||
| 
						
						
							
						
						7a9a24ef5d
	
				 | 
					
					
						|||
| 
						
						
							
						
						067adcd9f5
	
				 | 
					
					
						|||
| 
						
						
							
						
						84d210cfab
	
				 | 
					
					
						|||
| 
						
						
							
						
						17736a4f14
	
				 | 
					
					
						|||
| 
						
						
							
						
						b9e91c4a3d
	
				 | 
					
					
						|||
| 
						
						
							
						
						51c95e5d4c
	
				 | 
					
					
						|||
| 
						
						
							
						
						8dbec29d2a
	
				 | 
					
					
						|||
| 
						
						
							
						
						d3bf3dab04
	
				 | 
					
					
						|||
| 
						
						
							
						
						8f50b7756b
	
				 | 
					
					
						|||
| 
						
						
							
						
						e86ccc9979
	
				 | 
					
					
						|||
| 
						
						
							
						
						cea8529f49
	
				 | 
					
					
						|||
| 
						
						
							
						
						d77718edae
	
				 | 
					
					
						|||
| 
						
						
							
						
						14d57fc477
	
				 | 
					
					
						|||
| 
						
						
							
						
						5c39f1abd8
	
				 | 
					
					
						|||
| 
						
						
							
						
						6794eb0432
	
				 | 
					
					
						|||
| 
						
						
							
						
						11614e3725
	
				 | 
					
					
						|||
| 
						
						
							
						
						b106f9d9e5
	
				 | 
					
					
						|||
| 
						
						
							
						
						3c8250e6ac
	
				 | 
					
					
						|||
| 
						
						
							
						
						d280859b0d
	
				 | 
					
					
						|||
| 
						
						
							
						
						bca1629d2f
	
				 | 
					
					
						|||
| 
						
						
							
						
						4fa82faf18
	
				 | 
					
					
						|||
| 
						
						
							
						
						b8f0b4b1fb
	
				 | 
					
					
						|||
| 
						
						
							
						
						68e5d05bbb
	
				 | 
					
					
						|||
| 
						
						
							
						
						446d402778
	
				 | 
					
					
						|||
| 
						
						
							
						
						67379fc2e4
	
				 | 
					
					
						|||
| 
						
						
							
						
						73546967b6
	
				 | 
					
					
						|||
| 
						
						
							
						
						16b661efe1
	
				 | 
					
					
						|||
| 
						
						
							
						
						fdb9a75489
	
				 | 
					
					
						|||
| 
						
						
							
						
						232d7a0348
	
				 | 
					
					
						|||
| 
						
						
							
						
						6e4bb5bc34
	
				 | 
					
					
						|||
| 
						
						
							
						
						c840ffe018
	
				 | 
					
					
						|||
| 
						
						
							
						
						45c9d7ea0a
	
				 | 
					
					
						|||
| 
						
						
							
						
						a62bc446e8
	
				 | 
					
					
						|||
| 
						
						
							
						
						62a6a491db
	
				 | 
					
					
						|||
| 
						
						
							
						
						4867d6da6a
	
				 | 
					
					
						|||
| 
						
						
							
						
						d9f7c7a93b
	
				 | 
					
					
						|||
| 
						
						
							
						
						bc8c030700
	
				 | 
					
					
						|||
| 
						
						
							
						
						f7598d8f1c
	
				 | 
					
					
						|||
| 
						
						
							
						
						c353e84a84
	
				 | 
					
					
						|||
| 
						
						
							
						
						99ca23f258
	
				 | 
					
					
						|||
| 
						
						
							
						
						b663d27fd8
	
				 | 
					
					
						|||
| 
						
						
							
						
						67c99dacf6
	
				 | 
					
					
						|||
| 
						
						
							
						
						4abf2b10e4
	
				 | 
					
					
						|||
| 
						
						
							
						
						f5199264f9
	
				 | 
					
					
						|||
| 
						
						
							
						
						b259f09cbd
	
				 | 
					
					
						|||
| 
						
						
							
						
						f4b32e516b
	
				 | 
					
					
						|||
| 
						
						
							
						
						fcb12ecee0
	
				 | 
					
					
						|||
| 
						
						
							
						
						5bc03ceacc
	
				 | 
					
					
						|||
| 
						
						
							
						
						c317429f6d
	
				 | 
					
					
						|||
| 
						
						
							
						
						b512a7f765
	
				 | 
					
					
						|||
| 
						
						
							
						
						e3a87d4f79
	
				 | 
					
					
						|||
| 
						
						
							
						
						dec2d50fbc
	
				 | 
					
					
						|||
| 
						
						
							
						
						34be0013b7
	
				 | 
					
					
						|||
| 
						
						
							
						
						399585f4e7
	
				 | 
					
					
						|||
| 
						
						
							
						
						0240897b1b
	
				 | 
					
					
						|||
| 
						
						
							
						
						1da0da53ec
	
				 | 
					
					
						|||
| 
						
						
							
						
						677cc9f160
	
				 | 
					
					
						|||
| 
						
						
							
						
						ffe7a872dd
	
				 | 
					
					
						|||
| 
						
						
							
						
						95d0005978
	
				 | 
					
					
						|||
| 
						
						
							
						
						498766fdc4
	
				 | 
					
					
						|||
| fc0fcc5742 | |||
| 587bd6dcdd | |||
| 
						
						
							
						
						92a4c72809
	
				 | 
					
					
						|||
| 
						
						
							
						
						a2d61abba2
	
				 | 
					
					
						|||
| 
						
						
							
						
						d2a5a28809
	
				 | 
					
					
						|||
| 
						
						
							
						
						84c0589aee
	
				 | 
					
					
						|||
| 
						
						
							
						
						2961578a54
	
				 | 
					
					
						|||
| 
						
						
							
						
						4d74f76b3c
	
				 | 
					
					
						|||
| 
						
						
							
						
						9e737466c5
	
				 | 
					
					
						|||
| 
						
						
							
						
						0ffb1b1a36
	
				 | 
					
					
						|||
| 
						
						
							
						
						68f0b85eb3
	
				 | 
					
					
						|||
| 
						
						
							
						
						ebbde530d2
	
				 | 
					
					
						|||
| 
						
						
							
						
						ab47df6031
	
				 | 
					
					
						|||
| 
						
						
							
						
						de75b2ffb6
	
				 | 
					
					
						|||
| 
						
						
							
						
						e10d83dadd
	
				 | 
					
					
						|||
| 
						
						
							
						
						f070fd9a64
	
				 | 
					
					
						|||
| 
						
						
							
						
						6e1527b1a8
	
				 | 
					
					
						|||
| 
						
						
							
						
						ebd8b0632b
	
				 | 
					
					
						|||
| 
						
						
							
						
						df26b6c17e
	
				 | 
					
					
						|||
| 
						
						
							
						
						d92151b8a6
	
				 | 
					
					
						|||
| 
						
						
							
						
						b13ead0657
	
				 | 
					
					
						|||
| 
						
						
							
						
						89ced6f952
	
				 | 
					
					
						|||
| 
						
						
							
						
						ae5ba0607a
	
				 | 
					
					
						|||
| 
						
						
							
						
						89fd642b78
	
				 | 
					
					
						|||
| 
						
						
							
						
						65e6dd34cd
	
				 | 
					
					
						|||
| 
						
						
							
						
						0421807e4d
	
				 | 
					
					
						|||
| 
						
						
							
						
						d5eed5055e
	
				 | 
					
					
						|||
| 
						
						
							
						
						f8752bb3e7
	
				 | 
					
					
						|||
| 
						
						
							
						
						170e591701
	
				 | 
					
					
						|||
| 
						
						
							
						
						8d6c3c57c3
	
				 | 
					
					
						|||
| 
						
						
							
						
						79b29f0c51
	
				 | 
					
					
						|||
| 
						
						
							
						
						a4acc85704
	
				 | 
					
					
						|||
| 
						
						
							
						
						f7b9aa67f5
	
				 | 
					
					
						|||
| 
						
						
							
						
						0a39c4f0ef
	
				 | 
					
					
						|||
| 
						
						
							
						
						85323d789c
	
				 | 
					
					
						|||
| 
						
						
							
						
						341a1bf11e
	
				 | 
					
					
						|||
| 
						
						
							
						
						6ee389eda5
	
				 | 
					
					
						|||
| 
						
						
							
						
						83fea62b0f
	
				 | 
					
					
						|||
| 
						
						
							
						
						0d1a5fbb25
	
				 | 
					
					
						|||
| 
						
						
							
						
						4d8444abf2
	
				 | 
					
					
						|||
| 
						
						
							
						
						e8486f6c9e
	
				 | 
					
					
						|||
| 
						
						
							
						
						20cd6f213c
	
				 | 
					
					
						|||
| 
						
						
							
						
						eb80e797c6
	
				 | 
					
					
						|||
| 
						
						
							
						
						736bb8eb38
	
				 | 
					
					
						|||
| 
						
						
							
						
						34a30c4d13
	
				 | 
					
					
						|||
| 
						
						
							
						
						c03e75d736
	
				 | 
					
					
						|||
| 
						
						
							
						
						d08f10f9c8
	
				 | 
					
					
						|||
| 
						
						
							
						
						8467dc1300
	
				 | 
					
					
						|||
| 
						
						
							
						
						635bb5234d
	
				 | 
					
					
						|||
| 
						
						
							
						
						37901da5b5
	
				 | 
					
					
						|||
| 
						
						
							
						
						e36ae3b11e
	
				 | 
					
					
						|||
| 
						
						
							
						
						81c1231a28
	
				 | 
					
					
						|||
| 
						
						
							
						
						bb6f058025
	
				 | 
					
					
						|||
| 
						
						
							
						
						547395b26e
	
				 | 
					
					
						|||
| 
						
						
							
						
						15208241d3
	
				 | 
					
					
						|||
| 
						
						
							
						
						0fd05d496e
	
				 | 
					
					
						|||
| 
						
						
							
						
						023a0d48ba
	
				 | 
					
					
						|||
| 
						
						
							
						
						c687b7a91a
	
				 | 
					
					
						|||
| 
						
						
							
						
						bd4ae36bb6
	
				 | 
					
					
						|||
| 
						
						
							
						
						b60637c7d9
	
				 | 
					
					
						|||
| 
						
						
							
						
						479127a5e4
	
				 | 
					
					
						|||
| 
						
						
							
						
						d261f81642
	
				 | 
					
					
						|||
| 
						
						
							
						
						6bc044d454
	
				 | 
					
					
						|||
| 
						
						
							
						
						9e07e27fbe
	
				 | 
					
					
						|||
| 
						
						
							
						
						575a9fdfe6
	
				 | 
					
					
						|||
| 
						
						
							
						
						35fa3b0d72
	
				 | 
					
					
						|||
| 
						
						
							
						
						ba5760bf8c
	
				 | 
					
					
						|||
| 
						
						
							
						
						5e918da88e
	
				 | 
					
					
						|||
| 
						
						
							
						
						f7e87ea7be
	
				 | 
					
					
						|||
| 
						
						
							
						
						7b233eb31d
	
				 | 
					
					
						|||
| 
						
						
							
						
						b5ea575d8d
	
				 | 
					
					
						|||
| 
						
						
							
						
						98cc3a8c2e
	
				 | 
					
					
						|||
| 
						
						
							
						
						a67d901641
	
				 | 
					
					
						|||
| 
						
						
							
						
						7ae100faeb
	
				 | 
					
					
						|||
| 
						
						
							
						
						debcb21161
	
				 | 
					
					
						|||
| 
						
						
							
						
						8dd7663b3c
	
				 | 
					
					
						|||
| 
						
						
							
						
						cba2a7a996
	
				 | 
					
					
						|||
| 
						
						
							
						
						197bdf7666
	
				 | 
					
					
						|||
| 
						
						
							
						
						46fc2ce3d4
	
				 | 
					
					
						|||
| 
						
						
							
						
						b4d50166f4
	
				 | 
					
					
						|||
| 
						
						
							
						
						c336b217c5
	
				 | 
					
					
						|||
| 
						
						
							
						
						af6c3dd12a
	
				 | 
					
					
						|||
| 
						
						
							
						
						b66c724109
	
				 | 
					
					
						|||
| 
						
						
							
						
						8bc2b6f493
	
				 | 
					
					
						|||
| 
						
						
							
						
						a74d6dfc08
	
				 | 
					
					
						|||
| 
						
						
							
						
						d3922e7878
	
				 | 
					
					
						|||
| 
						
						
							
						
						14814aa5d9
	
				 | 
					
					
						|||
| 
						
						
							
						
						3b053167b1
	
				 | 
					
					
						|||
| 
						
						
							
						
						9bba0d96bb
	
				 | 
					
					
						|||
| 
						
						
							
						
						38c333045b
	
				 | 
					
					
						|||
| 
						
						
							
						
						d4ede33099
	
				 | 
					
					
						|||
| 
						
						
							
						
						0bad75788d
	
				 | 
					
					
						|||
| 
						
						
							
						
						892033b880
	
				 | 
					
					
						|||
| 7c6ab2a652 | |||
| 
						
						
							
						
						1c95c1faa8
	
				 | 
					
					
						|||
| 
						
						
							
						
						9ea14de6f5
	
				 | 
					
					
						|||
| 
						
						
							
						
						9b7a31ebf9
	
				 | 
					
					
						|||
| 
						
						
							
						
						d7c34a30a3
	
				 | 
					
					
						|||
| 
						
						
							
						
						ee5f4cdf74
	
				 | 
					
					
						|||
| 
						
						
							
						
						b014c09a2c
	
				 | 
					
					
						|||
| 
						
						
							
						
						531ff99af0
	
				 | 
					
					
						|||
| 
						
						
							
						
						82d3a7ff2a
	
				 | 
					
					
						|||
| 
						
						
							
						
						6c3cf40a16
	
				 | 
					
					
						|||
| 
						
						
							
						
						681be5eb19
	
				 | 
					
					
						|||
| 
						
						
							
						
						4fae56a386
	
				 | 
					
					
						|||
| 
						
						
							
						
						1d5db7bdbe
	
				 | 
					
					
						|||
| 
						
						
							
						
						32da3a3341
	
				 | 
					
					
						|||
| 
						
						
							
						
						31a3f5832a
	
				 | 
					
					
						|||
| 
						
						
							
						
						3e7130b519
	
				 | 
					
					
						|||
| 
						
						
							
						
						bd0b6a16de
	
				 | 
					
					
						|||
| 
						
						
							
						
						7145298f90
	
				 | 
					
					
						|||
| 
						
						
							
						
						1bfd2bc441
	
				 | 
					
					
						|||
| 
						
						
							
						
						884b3b8425
	
				 | 
					
					
						|||
| 
						
						
							
						
						e06a0c4093
	
				 | 
					
					
						|||
| 
						
						
							
						
						7ba5afcec4
	
				 | 
					
					
						|||
| 
						
						
							
						
						d3978e5b07
	
				 | 
					
					
						|||
| 
						
						
							
						
						4150dac57b
	
				 | 
					
					
						|||
| 
						
						
							
						
						58bc9d191f
	
				 | 
					
					
						|||
| 
						
						
							
						
						96cefc7f74
	
				 | 
					
					
						|||
| 
						
						
							
						
						f85eb2841a
	
				 | 
					
					
						|||
| 
						
						
							
						
						5d506ebc65
	
				 | 
					
					
						|||
| 
						
						
							
						
						af49f27551
	
				 | 
					
					
						|||
| 
						
						
							
						
						f341d2e5eb
	
				 | 
					
					
						|||
| 
						
						
							
						
						ceba0ea417
	
				 | 
					
					
						|||
| 
						
						
							
						
						a34cb1e666
	
				 | 
					
					
						|||
| 
						
						
							
						
						65fc52c5e5
	
				 | 
					
					
						|||
| 
						
						
							
						
						7f13c8c675
	
				 | 
					
					
						|||
| 
						
						
							
						
						9c36cfb8e5
	
				 | 
					
					
						|||
| 
						
						
							
						
						7f72a9eda4
	
				 | 
					
					
						|||
| 
						
						
							
						
						6e96d48ea6
	
				 | 
					
					
						|||
| 
						
						
							
						
						db412066b3
	
				 | 
					
					
						|||
| 
						
						
							
						
						63a836e2a7
	
				 | 
					
					
						|||
| 
						
						
							
						
						dd04238a83
	
				 | 
					
					
						|||
| efdbeb75ea | |||
| 
						
						
							
						
						cd4411260c
	
				 | 
					
					
						|||
| 
						
						
							
						
						8cb232a765
	
				 | 
					
					
						|||
| 
						
						
							
						
						d4ca119265
	
				 | 
					
					
						|||
| 
						
						
							
						
						f72f8c7a8d
	
				 | 
					
					
						|||
| 
						
						
							
						
						d7fa1697a1
	
				 | 
					
					
						|||
| 
						
						
							
						
						b0420d2adb
	
				 | 
					
					
						|||
| 
						
						
							
						
						c70ebba151
	
				 | 
					
					
						|||
| 
						
						
							
						
						ac860e72f2
	
				 | 
					
					
						|||
| 
						
						
							
						
						101c05d248
	
				 | 
					
					
						|||
| 
						
						
							
						
						1b75679496
	
				 | 
					
					
						|||
| 
						
						
							
						
						ebf4a4c2ac
	
				 | 
					
					
						|||
| 
						
						
							
						
						57a83cef26
	
				 | 
					
					
						|||
| 
						
						
							
						
						8ee52143fc
	
				 | 
					
					
						|||
| 
						
						
							
						
						67a18c4f49
	
				 | 
					
					
						|||
| 
						
						
							
						
						b8428e67a8
	
				 | 
					
					
						|||
| 
						
						
							
						
						e18529e6e1
	
				 | 
					
					
						|||
| 
						
						
							
						
						89db1449d1
	
				 | 
					
					
						|||
| 
						
						
							
						
						6660a0cd36
	
				 | 
					
					
						|||
| 
						
						
							
						
						e7d5cb1edb
	
				 | 
					
					
						|||
| 
						
						
							
						
						73d6abd15f
	
				 | 
					
					
						
							
								
								
									
										3
									
								
								Pipfile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Pipfile
									
									
									
									
									
								
							@@ -7,6 +7,7 @@ verify_ssl = true
 | 
			
		||||
 | 
			
		||||
[packages]
 | 
			
		||||
ansible = "*"
 | 
			
		||||
ansible-lint = "*"
 | 
			
		||||
 | 
			
		||||
[requires]
 | 
			
		||||
python_version = "3.9"
 | 
			
		||||
python_version = "3.13"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										819
									
								
								Pipfile.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										819
									
								
								Pipfile.lock
									
									
									
										generated
									
									
									
								
							@@ -1,11 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
    "_meta": {
 | 
			
		||||
        "hash": {
 | 
			
		||||
            "sha256": "65b615b857250757470e21fc3a4b1cdfe75b4b012c0d1d633a5ebf1988d9cb91"
 | 
			
		||||
            "sha256": "47970866f4ffc7775e3a95dd04ee8b75f9784c457baadd8a31fe1783584fa73f"
 | 
			
		||||
        },
 | 
			
		||||
        "pipfile-spec": 6,
 | 
			
		||||
        "requires": {
 | 
			
		||||
            "python_version": "3.9"
 | 
			
		||||
            "python_version": "3.13"
 | 
			
		||||
        },
 | 
			
		||||
        "sources": [
 | 
			
		||||
            {
 | 
			
		||||
@@ -18,175 +18,730 @@
 | 
			
		||||
    "default": {
 | 
			
		||||
        "ansible": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:98e718aea82199be62db7731373d660627aa1e938d34446588f2f49c228638ee"
 | 
			
		||||
                "sha256:1a17f8c593a973e6d81f10ebfe7eac53e799616f745d57b99bd36b34f79f16a2",
 | 
			
		||||
                "sha256:1b3ad8158dd2597ce45a864a55ca09e5be1807cc97f44a00c39d7bb9e1520aa6"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==2.10.4"
 | 
			
		||||
            "markers": "python_version >= '3.11'",
 | 
			
		||||
            "version": "==12.0.0"
 | 
			
		||||
        },
 | 
			
		||||
        "ansible-base": {
 | 
			
		||||
        "ansible-compat": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:d4dad569864c08d8efb6ad99acf48ec46d7d118f8ced64f1185f8eac2c280ec3"
 | 
			
		||||
                "sha256:5bb843838414b75efff24dae5ff5b332cd503a596143d471980243cec4b46c9c",
 | 
			
		||||
                "sha256:f29ab81264b3f04fb94ac2d7f68fe73efc2eb3cbe4ecf00f9b4742e77c41756f"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
 | 
			
		||||
            "version": "==2.10.4"
 | 
			
		||||
            "markers": "python_version >= '3.10'",
 | 
			
		||||
            "version": "==25.8.1"
 | 
			
		||||
        },
 | 
			
		||||
        "ansible-core": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:1fe6ca533951b5ba4a619e763ea4f6725f68c36677c7d5aaa467b59aa449bdc8",
 | 
			
		||||
                "sha256:87fcbbc492ed16eb6adb0379bae0adbf69f3ce88a8440e7e88e0dcefa9f8a54c"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.11'",
 | 
			
		||||
            "version": "==2.19.2"
 | 
			
		||||
        },
 | 
			
		||||
        "ansible-lint": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:2d5a8a2b01c46966591a17769a129142181515aac19c27742ecb8c94e84bf692",
 | 
			
		||||
                "sha256:b8fe138a1257c6e58a755febd726b3186820f6dcb23a5bb062538c939a7277bb"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "markers": "python_version >= '3.10'",
 | 
			
		||||
            "version": "==25.9.0"
 | 
			
		||||
        },
 | 
			
		||||
        "attrs": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3",
 | 
			
		||||
                "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==25.3.0"
 | 
			
		||||
        },
 | 
			
		||||
        "black": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175",
 | 
			
		||||
                "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619",
 | 
			
		||||
                "sha256:154b06d618233fe468236ba1f0e40823d4eb08b26f5e9261526fde34916b9140",
 | 
			
		||||
                "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0",
 | 
			
		||||
                "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92",
 | 
			
		||||
                "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f",
 | 
			
		||||
                "sha256:456386fe87bad41b806d53c062e2974615825c7a52159cde7ccaeb0695fa28fa",
 | 
			
		||||
                "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae",
 | 
			
		||||
                "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a",
 | 
			
		||||
                "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357",
 | 
			
		||||
                "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4",
 | 
			
		||||
                "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e",
 | 
			
		||||
                "sha256:a16b14a44c1af60a210d8da28e108e13e75a284bf21a9afa6b4571f96ab8bb9d",
 | 
			
		||||
                "sha256:aaf319612536d502fdd0e88ce52d8f1352b2c0a955cc2798f79eeca9d3af0608",
 | 
			
		||||
                "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831",
 | 
			
		||||
                "sha256:c0372a93e16b3954208417bfe448e09b0de5cc721d521866cd9e0acac3c04a1f",
 | 
			
		||||
                "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7",
 | 
			
		||||
                "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1",
 | 
			
		||||
                "sha256:e3c1f4cd5e93842774d9ee4ef6cd8d17790e65f44f7cdbaab5f2cf8ccf22a823",
 | 
			
		||||
                "sha256:e593466de7b998374ea2585a471ba90553283fb9beefcfa430d84a2651ed5933",
 | 
			
		||||
                "sha256:ef69351df3c84485a8beb6f7b8f9721e2009e20ef80a8d619e2d1788b7816d47",
 | 
			
		||||
                "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==25.9.0"
 | 
			
		||||
        },
 | 
			
		||||
        "bracex": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952",
 | 
			
		||||
                "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==2.6"
 | 
			
		||||
        },
 | 
			
		||||
        "cffi": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e",
 | 
			
		||||
                "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d",
 | 
			
		||||
                "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a",
 | 
			
		||||
                "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec",
 | 
			
		||||
                "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362",
 | 
			
		||||
                "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668",
 | 
			
		||||
                "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c",
 | 
			
		||||
                "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b",
 | 
			
		||||
                "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06",
 | 
			
		||||
                "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698",
 | 
			
		||||
                "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2",
 | 
			
		||||
                "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c",
 | 
			
		||||
                "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7",
 | 
			
		||||
                "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009",
 | 
			
		||||
                "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03",
 | 
			
		||||
                "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b",
 | 
			
		||||
                "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909",
 | 
			
		||||
                "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53",
 | 
			
		||||
                "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35",
 | 
			
		||||
                "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26",
 | 
			
		||||
                "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b",
 | 
			
		||||
                "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01",
 | 
			
		||||
                "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb",
 | 
			
		||||
                "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293",
 | 
			
		||||
                "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd",
 | 
			
		||||
                "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d",
 | 
			
		||||
                "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3",
 | 
			
		||||
                "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d",
 | 
			
		||||
                "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e",
 | 
			
		||||
                "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca",
 | 
			
		||||
                "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d",
 | 
			
		||||
                "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775",
 | 
			
		||||
                "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375",
 | 
			
		||||
                "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b",
 | 
			
		||||
                "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b",
 | 
			
		||||
                "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"
 | 
			
		||||
                "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb",
 | 
			
		||||
                "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b",
 | 
			
		||||
                "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f",
 | 
			
		||||
                "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9",
 | 
			
		||||
                "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44",
 | 
			
		||||
                "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2",
 | 
			
		||||
                "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c",
 | 
			
		||||
                "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75",
 | 
			
		||||
                "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65",
 | 
			
		||||
                "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e",
 | 
			
		||||
                "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a",
 | 
			
		||||
                "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e",
 | 
			
		||||
                "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25",
 | 
			
		||||
                "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a",
 | 
			
		||||
                "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe",
 | 
			
		||||
                "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b",
 | 
			
		||||
                "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91",
 | 
			
		||||
                "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592",
 | 
			
		||||
                "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187",
 | 
			
		||||
                "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c",
 | 
			
		||||
                "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1",
 | 
			
		||||
                "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94",
 | 
			
		||||
                "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba",
 | 
			
		||||
                "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb",
 | 
			
		||||
                "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165",
 | 
			
		||||
                "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529",
 | 
			
		||||
                "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca",
 | 
			
		||||
                "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c",
 | 
			
		||||
                "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6",
 | 
			
		||||
                "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c",
 | 
			
		||||
                "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0",
 | 
			
		||||
                "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743",
 | 
			
		||||
                "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63",
 | 
			
		||||
                "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5",
 | 
			
		||||
                "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5",
 | 
			
		||||
                "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4",
 | 
			
		||||
                "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d",
 | 
			
		||||
                "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b",
 | 
			
		||||
                "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93",
 | 
			
		||||
                "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205",
 | 
			
		||||
                "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27",
 | 
			
		||||
                "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512",
 | 
			
		||||
                "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d",
 | 
			
		||||
                "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c",
 | 
			
		||||
                "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037",
 | 
			
		||||
                "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26",
 | 
			
		||||
                "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322",
 | 
			
		||||
                "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb",
 | 
			
		||||
                "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c",
 | 
			
		||||
                "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8",
 | 
			
		||||
                "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4",
 | 
			
		||||
                "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414",
 | 
			
		||||
                "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9",
 | 
			
		||||
                "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664",
 | 
			
		||||
                "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9",
 | 
			
		||||
                "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775",
 | 
			
		||||
                "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739",
 | 
			
		||||
                "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc",
 | 
			
		||||
                "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062",
 | 
			
		||||
                "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe",
 | 
			
		||||
                "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9",
 | 
			
		||||
                "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92",
 | 
			
		||||
                "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5",
 | 
			
		||||
                "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13",
 | 
			
		||||
                "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d",
 | 
			
		||||
                "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26",
 | 
			
		||||
                "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f",
 | 
			
		||||
                "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495",
 | 
			
		||||
                "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b",
 | 
			
		||||
                "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6",
 | 
			
		||||
                "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c",
 | 
			
		||||
                "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef",
 | 
			
		||||
                "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5",
 | 
			
		||||
                "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18",
 | 
			
		||||
                "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad",
 | 
			
		||||
                "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3",
 | 
			
		||||
                "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7",
 | 
			
		||||
                "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5",
 | 
			
		||||
                "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534",
 | 
			
		||||
                "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49",
 | 
			
		||||
                "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2",
 | 
			
		||||
                "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5",
 | 
			
		||||
                "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453",
 | 
			
		||||
                "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"
 | 
			
		||||
            ],
 | 
			
		||||
            "version": "==1.14.4"
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==2.0.0"
 | 
			
		||||
        },
 | 
			
		||||
        "click": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc",
 | 
			
		||||
                "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.10'",
 | 
			
		||||
            "version": "==8.3.0"
 | 
			
		||||
        },
 | 
			
		||||
        "cryptography": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d",
 | 
			
		||||
                "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7",
 | 
			
		||||
                "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901",
 | 
			
		||||
                "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c",
 | 
			
		||||
                "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244",
 | 
			
		||||
                "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6",
 | 
			
		||||
                "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5",
 | 
			
		||||
                "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e",
 | 
			
		||||
                "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c",
 | 
			
		||||
                "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0",
 | 
			
		||||
                "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812",
 | 
			
		||||
                "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a",
 | 
			
		||||
                "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030",
 | 
			
		||||
                "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302"
 | 
			
		||||
                "sha256:0a17377fa52563d730248ba1f68185461fff36e8bc75d8787a7dd2e20a802b7a",
 | 
			
		||||
                "sha256:0ca4be2af48c24df689a150d9cd37404f689e2968e247b6b8ff09bff5bcd786f",
 | 
			
		||||
                "sha256:0d1922d9280e08cde90b518a10cd66831f632960a8d08cb3418922d83fce6f12",
 | 
			
		||||
                "sha256:0dfb7c88d4462a0cfdd0d87a3c245a7bc3feb59de101f6ff88194f740f72eda6",
 | 
			
		||||
                "sha256:0ff483716be32690c14636e54a1f6e2e1b7bf8e22ca50b989f88fa1b2d287080",
 | 
			
		||||
                "sha256:13e67c4d3fb8b6bc4ef778a7ccdd8df4cd15b4bcc18f4239c8440891a11245cc",
 | 
			
		||||
                "sha256:15b5fd9358803b0d1cc42505a18d8bca81dabb35b5cfbfea1505092e13a9d96d",
 | 
			
		||||
                "sha256:1cd6d50c1a8b79af1a6f703709d8973845f677c8e97b1268f5ff323d38ce8475",
 | 
			
		||||
                "sha256:2dd339ba3345b908fa3141ddba4025568fa6fd398eabce3ef72a29ac2d73ad75",
 | 
			
		||||
                "sha256:341fb7a26bc9d6093c1b124b9f13acc283d2d51da440b98b55ab3f79f2522ead",
 | 
			
		||||
                "sha256:34f04b7311174469ab3ac2647469743720f8b6c8b046f238e5cb27905695eb2a",
 | 
			
		||||
                "sha256:41c281a74df173876da1dc9a9b6953d387f06e3d3ed9284e3baae3ab3f40883a",
 | 
			
		||||
                "sha256:449ef2b321bec7d97ef2c944173275ebdab78f3abdd005400cc409e27cd159ab",
 | 
			
		||||
                "sha256:45f790934ac1018adeba46a0f7289b2b8fe76ba774a88c7f1922213a56c98bc1",
 | 
			
		||||
                "sha256:48948940d0ae00483e85e9154bb42997d0b77c21e43a77b7773c8c80de532ac5",
 | 
			
		||||
                "sha256:4c49eda9a23019e11d32a0eb51a27b3e7ddedde91e099c0ac6373e3aacc0d2ee",
 | 
			
		||||
                "sha256:504e464944f2c003a0785b81668fe23c06f3b037e9cb9f68a7c672246319f277",
 | 
			
		||||
                "sha256:534b96c0831855e29fc3b069b085fd185aa5353033631a585d5cd4dd5d40d657",
 | 
			
		||||
                "sha256:6ef1488967e729948d424d09c94753d0167ce59afba8d0f6c07a22b629c557b2",
 | 
			
		||||
                "sha256:7176a5ab56fac98d706921f6416a05e5aff7df0e4b91516f450f8627cda22af3",
 | 
			
		||||
                "sha256:7411c910fb2a412053cf33cfad0153ee20d27e256c6c3f14d7d7d1d9fec59fd5",
 | 
			
		||||
                "sha256:757af4f6341ce7a1e47c326ca2a81f41d236070217e5fbbad61bbfe299d55d28",
 | 
			
		||||
                "sha256:7823bc7cdf0b747ecfb096d004cc41573c2f5c7e3a29861603a2871b43d3ef32",
 | 
			
		||||
                "sha256:7fab1187b6c6b2f11a326f33b036f7168f5b996aedd0c059f9738915e4e8f53a",
 | 
			
		||||
                "sha256:84ef1f145de5aee82ea2447224dc23f065ff4cc5791bb3b506615957a6ba8128",
 | 
			
		||||
                "sha256:92e8cfe8bd7dd86eac0a677499894862cd5cc2fd74de917daa881d00871ac8e7",
 | 
			
		||||
                "sha256:9394c7d5a7565ac5f7d9ba38b2617448eba384d7b107b262d63890079fad77ca",
 | 
			
		||||
                "sha256:9495d78f52c804b5ec8878b5b8c7873aa8e63db9cd9ee387ff2db3fffe4df784",
 | 
			
		||||
                "sha256:9873bf7c1f2a6330bdfe8621e7ce64b725784f9f0c3a6a55c3047af5849f920e",
 | 
			
		||||
                "sha256:9babb7818fdd71394e576cf26c5452df77a355eac1a27ddfa24096665a27f8fd",
 | 
			
		||||
                "sha256:9e8776dac9e660c22241b6587fae51a67b4b0147daa4d176b172c3ff768ad736",
 | 
			
		||||
                "sha256:9ed64e5083fa806709e74fc5ea067dfef9090e5b7a2320a49be3c9df3583a2d8",
 | 
			
		||||
                "sha256:9f2c4cc63be3ef43c0221861177cee5d14b505cd4d4599a89e2cd273c4d3542a",
 | 
			
		||||
                "sha256:9f40642a140c0c8649987027867242b801486865277cbabc8c6059ddef16dc8b",
 | 
			
		||||
                "sha256:af84e8e99f1a82cea149e253014ea9dc89f75b82c87bb6c7242203186f465129",
 | 
			
		||||
                "sha256:b9c79af2c3058430d911ff1a5b2b96bbfe8da47d5ed961639ce4681886614e70",
 | 
			
		||||
                "sha256:c52fded6383f7e20eaf70a60aeddd796b3677c3ad2922c801be330db62778e05",
 | 
			
		||||
                "sha256:cbb8e769d4cac884bb28e3ff620ef1001b75588a5c83c9c9f1fdc9afbe7f29b0",
 | 
			
		||||
                "sha256:d84c40bdb8674c29fa192373498b6cb1e84f882889d21a471b45d1f868d8d44b",
 | 
			
		||||
                "sha256:db5597a4c7353b2e5fb05a8e6cb74b56a4658a2b7bf3cb6b1821ae7e7fd6eaa0",
 | 
			
		||||
                "sha256:e22801b61613ebdebf7deb18b507919e107547a1d39a3b57f5f855032dd7cfb8",
 | 
			
		||||
                "sha256:e34da95e29daf8a71cb2841fd55df0511539a6cdf33e6f77c1e95e44006b9b46",
 | 
			
		||||
                "sha256:e46710a240a41d594953012213ea8ca398cd2448fbc5d0f1be8160b5511104a0",
 | 
			
		||||
                "sha256:e94eb5fa32a8a9f9bf991f424f002913e3dd7c699ef552db9b14ba6a76a6313b",
 | 
			
		||||
                "sha256:ec13b7105117dbc9afd023300fb9954d72ca855c274fe563e72428ece10191c0",
 | 
			
		||||
                "sha256:ed570874e88f213437f5cf758f9ef26cbfc3f336d889b1e592ee11283bb8d1c7",
 | 
			
		||||
                "sha256:ed957044e368ed295257ae3d212b95456bd9756df490e1ac4538857f67531fcc",
 | 
			
		||||
                "sha256:ef648d2c690703501714588b2ba640facd50fd16548133b11b2859e8655a69da",
 | 
			
		||||
                "sha256:efc9e51c3e595267ff84adf56e9b357db89ab2279d7e375ffcaf8f678606f3d9",
 | 
			
		||||
                "sha256:f736ab8036796f5a119ff8211deda416f8c15ce03776db704a7a4e17381cb2ef",
 | 
			
		||||
                "sha256:f7a24ea78de345cfa7f6a8d3bde8b242c7fac27f2bd78fa23474ca38dfaeeab9",
 | 
			
		||||
                "sha256:f7de12fa0eee6234de9a9ce0ffcfa6ce97361db7a50b09b65c63ac58e5f22fc7",
 | 
			
		||||
                "sha256:f9b55038b5c6c47559aa33626d8ecd092f354e23de3c6975e4bb205df128a2a0",
 | 
			
		||||
                "sha256:fd4b5e2ee4e60425711ec65c33add4e7a626adef79d66f62ba0acfd493af282d"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
 | 
			
		||||
            "version": "==3.3.1"
 | 
			
		||||
            "markers": "python_version >= '3.8' and python_full_version not in '3.9.0, 3.9.1'",
 | 
			
		||||
            "version": "==46.0.1"
 | 
			
		||||
        },
 | 
			
		||||
        "distro": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed",
 | 
			
		||||
                "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.6'",
 | 
			
		||||
            "version": "==1.9.0"
 | 
			
		||||
        },
 | 
			
		||||
        "filelock": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58",
 | 
			
		||||
                "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==3.19.1"
 | 
			
		||||
        },
 | 
			
		||||
        "importlib-metadata": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000",
 | 
			
		||||
                "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==8.7.0"
 | 
			
		||||
        },
 | 
			
		||||
        "jinja2": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0",
 | 
			
		||||
                "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"
 | 
			
		||||
                "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
 | 
			
		||||
                "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
 | 
			
		||||
            "version": "==2.11.2"
 | 
			
		||||
            "markers": "python_version >= '3.7'",
 | 
			
		||||
            "version": "==3.1.6"
 | 
			
		||||
        },
 | 
			
		||||
        "jsonschema": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63",
 | 
			
		||||
                "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==4.25.1"
 | 
			
		||||
        },
 | 
			
		||||
        "jsonschema-specifications": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe",
 | 
			
		||||
                "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==2025.9.1"
 | 
			
		||||
        },
 | 
			
		||||
        "markupsafe": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
 | 
			
		||||
                "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
 | 
			
		||||
                "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
 | 
			
		||||
                "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
 | 
			
		||||
                "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
 | 
			
		||||
                "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
 | 
			
		||||
                "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
 | 
			
		||||
                "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
 | 
			
		||||
                "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
 | 
			
		||||
                "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
 | 
			
		||||
                "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
 | 
			
		||||
                "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
 | 
			
		||||
                "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
 | 
			
		||||
                "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
 | 
			
		||||
                "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
 | 
			
		||||
                "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
 | 
			
		||||
                "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
 | 
			
		||||
                "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
 | 
			
		||||
                "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
 | 
			
		||||
                "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
 | 
			
		||||
                "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
 | 
			
		||||
                "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
 | 
			
		||||
                "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
 | 
			
		||||
                "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
 | 
			
		||||
                "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
 | 
			
		||||
                "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
 | 
			
		||||
                "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
 | 
			
		||||
                "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
 | 
			
		||||
                "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
 | 
			
		||||
                "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
 | 
			
		||||
                "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
 | 
			
		||||
                "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
 | 
			
		||||
                "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
 | 
			
		||||
                "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
 | 
			
		||||
                "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
 | 
			
		||||
                "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
 | 
			
		||||
                "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
 | 
			
		||||
                "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
 | 
			
		||||
                "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
 | 
			
		||||
                "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
 | 
			
		||||
                "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
 | 
			
		||||
                "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
 | 
			
		||||
                "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
 | 
			
		||||
                "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
 | 
			
		||||
                "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
 | 
			
		||||
                "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
 | 
			
		||||
                "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
 | 
			
		||||
                "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
 | 
			
		||||
                "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
 | 
			
		||||
                "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
 | 
			
		||||
                "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
 | 
			
		||||
                "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
 | 
			
		||||
                "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
 | 
			
		||||
                "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
 | 
			
		||||
                "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
 | 
			
		||||
                "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
 | 
			
		||||
                "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
 | 
			
		||||
                "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
 | 
			
		||||
                "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
 | 
			
		||||
                "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
 | 
			
		||||
                "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
 | 
			
		||||
                "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
 | 
			
		||||
                "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
 | 
			
		||||
                "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
 | 
			
		||||
                "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
 | 
			
		||||
                "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
 | 
			
		||||
                "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
 | 
			
		||||
                "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
 | 
			
		||||
                "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
 | 
			
		||||
                "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
 | 
			
		||||
                "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
 | 
			
		||||
                "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
 | 
			
		||||
                "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
 | 
			
		||||
                "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
 | 
			
		||||
                "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
 | 
			
		||||
                "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
 | 
			
		||||
                "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
 | 
			
		||||
                "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
 | 
			
		||||
                "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
 | 
			
		||||
                "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
 | 
			
		||||
                "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
 | 
			
		||||
                "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
 | 
			
		||||
                "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
 | 
			
		||||
                "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
 | 
			
		||||
                "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
 | 
			
		||||
                "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
 | 
			
		||||
                "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
 | 
			
		||||
                "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
 | 
			
		||||
                "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
 | 
			
		||||
                "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
 | 
			
		||||
                "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
 | 
			
		||||
                "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
 | 
			
		||||
                "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
 | 
			
		||||
                "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 | 
			
		||||
            "version": "==1.1.1"
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==3.0.2"
 | 
			
		||||
        },
 | 
			
		||||
        "mypy-extensions": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505",
 | 
			
		||||
                "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==1.1.0"
 | 
			
		||||
        },
 | 
			
		||||
        "packaging": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858",
 | 
			
		||||
                "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"
 | 
			
		||||
                "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
 | 
			
		||||
                "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 | 
			
		||||
            "version": "==20.8"
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==25.0"
 | 
			
		||||
        },
 | 
			
		||||
        "pathspec": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08",
 | 
			
		||||
                "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==0.12.1"
 | 
			
		||||
        },
 | 
			
		||||
        "platformdirs": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85",
 | 
			
		||||
                "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==4.4.0"
 | 
			
		||||
        },
 | 
			
		||||
        "pycparser": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0",
 | 
			
		||||
                "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"
 | 
			
		||||
                "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2",
 | 
			
		||||
                "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 | 
			
		||||
            "version": "==2.20"
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==2.23"
 | 
			
		||||
        },
 | 
			
		||||
        "pyparsing": {
 | 
			
		||||
        "pytokens": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
 | 
			
		||||
                "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
 | 
			
		||||
                "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044",
 | 
			
		||||
                "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 | 
			
		||||
            "version": "==2.4.7"
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==0.1.10"
 | 
			
		||||
        },
 | 
			
		||||
        "pyyaml": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97",
 | 
			
		||||
                "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76",
 | 
			
		||||
                "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2",
 | 
			
		||||
                "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e",
 | 
			
		||||
                "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648",
 | 
			
		||||
                "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf",
 | 
			
		||||
                "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f",
 | 
			
		||||
                "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2",
 | 
			
		||||
                "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee",
 | 
			
		||||
                "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a",
 | 
			
		||||
                "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d",
 | 
			
		||||
                "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c",
 | 
			
		||||
                "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"
 | 
			
		||||
                "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
 | 
			
		||||
                "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
 | 
			
		||||
                "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
 | 
			
		||||
                "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
 | 
			
		||||
                "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
 | 
			
		||||
                "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
 | 
			
		||||
                "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
 | 
			
		||||
                "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
 | 
			
		||||
                "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
 | 
			
		||||
                "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
 | 
			
		||||
                "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
 | 
			
		||||
                "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
 | 
			
		||||
                "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
 | 
			
		||||
                "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
 | 
			
		||||
                "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
 | 
			
		||||
                "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
 | 
			
		||||
                "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
 | 
			
		||||
                "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
 | 
			
		||||
                "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
 | 
			
		||||
                "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
 | 
			
		||||
                "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
 | 
			
		||||
                "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
 | 
			
		||||
                "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
 | 
			
		||||
                "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
 | 
			
		||||
                "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
 | 
			
		||||
                "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
 | 
			
		||||
                "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
 | 
			
		||||
                "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
 | 
			
		||||
                "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
 | 
			
		||||
                "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
 | 
			
		||||
                "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
 | 
			
		||||
                "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
 | 
			
		||||
                "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
 | 
			
		||||
                "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
 | 
			
		||||
                "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
 | 
			
		||||
                "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
 | 
			
		||||
                "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
 | 
			
		||||
                "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
 | 
			
		||||
                "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
 | 
			
		||||
                "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
 | 
			
		||||
                "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
 | 
			
		||||
                "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
 | 
			
		||||
                "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
 | 
			
		||||
                "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
 | 
			
		||||
                "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
 | 
			
		||||
                "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
 | 
			
		||||
                "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
 | 
			
		||||
                "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
 | 
			
		||||
                "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
 | 
			
		||||
                "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
 | 
			
		||||
                "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
 | 
			
		||||
                "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
 | 
			
		||||
                "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
 | 
			
		||||
            ],
 | 
			
		||||
            "version": "==5.3.1"
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==6.0.2"
 | 
			
		||||
        },
 | 
			
		||||
        "six": {
 | 
			
		||||
        "referencing": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
 | 
			
		||||
                "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
 | 
			
		||||
                "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa",
 | 
			
		||||
                "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 | 
			
		||||
            "version": "==1.15.0"
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==0.36.2"
 | 
			
		||||
        },
 | 
			
		||||
        "resolvelib": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:8e3e2000beaf53fdfd8772fda1a7b1df97e803ab7c8925621bbb87c4d187a94d",
 | 
			
		||||
                "sha256:c27fbb5098acd7dfc01fb2be3724bd0881168edc2bd3b4dc876ca3f46b8e4a3d"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==1.2.0"
 | 
			
		||||
        },
 | 
			
		||||
        "rpds-py": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400",
 | 
			
		||||
                "sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1",
 | 
			
		||||
                "sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e",
 | 
			
		||||
                "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f",
 | 
			
		||||
                "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60",
 | 
			
		||||
                "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059",
 | 
			
		||||
                "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2",
 | 
			
		||||
                "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff",
 | 
			
		||||
                "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef",
 | 
			
		||||
                "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd",
 | 
			
		||||
                "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf",
 | 
			
		||||
                "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d",
 | 
			
		||||
                "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e",
 | 
			
		||||
                "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52",
 | 
			
		||||
                "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8",
 | 
			
		||||
                "sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d",
 | 
			
		||||
                "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc",
 | 
			
		||||
                "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5",
 | 
			
		||||
                "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8",
 | 
			
		||||
                "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf",
 | 
			
		||||
                "sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c",
 | 
			
		||||
                "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418",
 | 
			
		||||
                "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746",
 | 
			
		||||
                "sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905",
 | 
			
		||||
                "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688",
 | 
			
		||||
                "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39",
 | 
			
		||||
                "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb",
 | 
			
		||||
                "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502",
 | 
			
		||||
                "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66",
 | 
			
		||||
                "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b",
 | 
			
		||||
                "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc",
 | 
			
		||||
                "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675",
 | 
			
		||||
                "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013",
 | 
			
		||||
                "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1",
 | 
			
		||||
                "sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1",
 | 
			
		||||
                "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a",
 | 
			
		||||
                "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734",
 | 
			
		||||
                "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5",
 | 
			
		||||
                "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e",
 | 
			
		||||
                "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92",
 | 
			
		||||
                "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c",
 | 
			
		||||
                "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195",
 | 
			
		||||
                "sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786",
 | 
			
		||||
                "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274",
 | 
			
		||||
                "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3",
 | 
			
		||||
                "sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859",
 | 
			
		||||
                "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a",
 | 
			
		||||
                "sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125",
 | 
			
		||||
                "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71",
 | 
			
		||||
                "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83",
 | 
			
		||||
                "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3",
 | 
			
		||||
                "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5",
 | 
			
		||||
                "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817",
 | 
			
		||||
                "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48",
 | 
			
		||||
                "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772",
 | 
			
		||||
                "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2",
 | 
			
		||||
                "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948",
 | 
			
		||||
                "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef",
 | 
			
		||||
                "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde",
 | 
			
		||||
                "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9",
 | 
			
		||||
                "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802",
 | 
			
		||||
                "sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3",
 | 
			
		||||
                "sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab",
 | 
			
		||||
                "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be",
 | 
			
		||||
                "sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6",
 | 
			
		||||
                "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8",
 | 
			
		||||
                "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad",
 | 
			
		||||
                "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf",
 | 
			
		||||
                "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec",
 | 
			
		||||
                "sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4",
 | 
			
		||||
                "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1",
 | 
			
		||||
                "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a",
 | 
			
		||||
                "sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8",
 | 
			
		||||
                "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39",
 | 
			
		||||
                "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4",
 | 
			
		||||
                "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab",
 | 
			
		||||
                "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808",
 | 
			
		||||
                "sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5",
 | 
			
		||||
                "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10",
 | 
			
		||||
                "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797",
 | 
			
		||||
                "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3",
 | 
			
		||||
                "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61",
 | 
			
		||||
                "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228",
 | 
			
		||||
                "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4",
 | 
			
		||||
                "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf",
 | 
			
		||||
                "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881",
 | 
			
		||||
                "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002",
 | 
			
		||||
                "sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52",
 | 
			
		||||
                "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9",
 | 
			
		||||
                "sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1",
 | 
			
		||||
                "sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f",
 | 
			
		||||
                "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998",
 | 
			
		||||
                "sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485",
 | 
			
		||||
                "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456",
 | 
			
		||||
                "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd",
 | 
			
		||||
                "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e",
 | 
			
		||||
                "sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475",
 | 
			
		||||
                "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e",
 | 
			
		||||
                "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c",
 | 
			
		||||
                "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334",
 | 
			
		||||
                "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90",
 | 
			
		||||
                "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2",
 | 
			
		||||
                "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657",
 | 
			
		||||
                "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15",
 | 
			
		||||
                "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b",
 | 
			
		||||
                "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33",
 | 
			
		||||
                "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2",
 | 
			
		||||
                "sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8",
 | 
			
		||||
                "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881",
 | 
			
		||||
                "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136",
 | 
			
		||||
                "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212",
 | 
			
		||||
                "sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc",
 | 
			
		||||
                "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0",
 | 
			
		||||
                "sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e",
 | 
			
		||||
                "sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819",
 | 
			
		||||
                "sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527",
 | 
			
		||||
                "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed",
 | 
			
		||||
                "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df",
 | 
			
		||||
                "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb",
 | 
			
		||||
                "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a",
 | 
			
		||||
                "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a",
 | 
			
		||||
                "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21",
 | 
			
		||||
                "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf",
 | 
			
		||||
                "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8",
 | 
			
		||||
                "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594",
 | 
			
		||||
                "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a",
 | 
			
		||||
                "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e",
 | 
			
		||||
                "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7",
 | 
			
		||||
                "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8",
 | 
			
		||||
                "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6",
 | 
			
		||||
                "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3",
 | 
			
		||||
                "sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec",
 | 
			
		||||
                "sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3",
 | 
			
		||||
                "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723",
 | 
			
		||||
                "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b",
 | 
			
		||||
                "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb",
 | 
			
		||||
                "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081",
 | 
			
		||||
                "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7",
 | 
			
		||||
                "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d",
 | 
			
		||||
                "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9",
 | 
			
		||||
                "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9",
 | 
			
		||||
                "sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4",
 | 
			
		||||
                "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444",
 | 
			
		||||
                "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a",
 | 
			
		||||
                "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0",
 | 
			
		||||
                "sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b",
 | 
			
		||||
                "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83",
 | 
			
		||||
                "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3",
 | 
			
		||||
                "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636",
 | 
			
		||||
                "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc",
 | 
			
		||||
                "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2",
 | 
			
		||||
                "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a",
 | 
			
		||||
                "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb",
 | 
			
		||||
                "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec",
 | 
			
		||||
                "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==0.27.1"
 | 
			
		||||
        },
 | 
			
		||||
        "ruamel-yaml": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701",
 | 
			
		||||
                "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==0.18.15"
 | 
			
		||||
        },
 | 
			
		||||
        "ruamel-yaml-clib": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b",
 | 
			
		||||
                "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4",
 | 
			
		||||
                "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef",
 | 
			
		||||
                "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5",
 | 
			
		||||
                "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3",
 | 
			
		||||
                "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632",
 | 
			
		||||
                "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6",
 | 
			
		||||
                "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7",
 | 
			
		||||
                "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680",
 | 
			
		||||
                "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf",
 | 
			
		||||
                "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da",
 | 
			
		||||
                "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6",
 | 
			
		||||
                "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a",
 | 
			
		||||
                "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01",
 | 
			
		||||
                "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519",
 | 
			
		||||
                "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6",
 | 
			
		||||
                "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f",
 | 
			
		||||
                "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd",
 | 
			
		||||
                "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2",
 | 
			
		||||
                "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52",
 | 
			
		||||
                "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd",
 | 
			
		||||
                "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d",
 | 
			
		||||
                "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c",
 | 
			
		||||
                "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6",
 | 
			
		||||
                "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb",
 | 
			
		||||
                "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a",
 | 
			
		||||
                "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969",
 | 
			
		||||
                "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28",
 | 
			
		||||
                "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d",
 | 
			
		||||
                "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e",
 | 
			
		||||
                "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45",
 | 
			
		||||
                "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4",
 | 
			
		||||
                "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12",
 | 
			
		||||
                "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31",
 | 
			
		||||
                "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642",
 | 
			
		||||
                "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e",
 | 
			
		||||
                "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285",
 | 
			
		||||
                "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed",
 | 
			
		||||
                "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1",
 | 
			
		||||
                "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7",
 | 
			
		||||
                "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3",
 | 
			
		||||
                "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475",
 | 
			
		||||
                "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5",
 | 
			
		||||
                "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76",
 | 
			
		||||
                "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987",
 | 
			
		||||
                "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==0.2.12"
 | 
			
		||||
        },
 | 
			
		||||
        "subprocess-tee": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:21942e976715af4a19a526918adb03a8a27a8edab959f2d075b777e3d78f532d",
 | 
			
		||||
                "sha256:91b2b4da3aae9a7088d84acaf2ea0abee3f4fd9c0d2eae69a9b9122a71476590"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.8'",
 | 
			
		||||
            "version": "==0.4.2"
 | 
			
		||||
        },
 | 
			
		||||
        "wcmatch": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a",
 | 
			
		||||
                "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==10.1"
 | 
			
		||||
        },
 | 
			
		||||
        "yamllint": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:364f0d79e81409f591e323725e6a9f4504c8699ddf2d7263d8d2b539cd66a583",
 | 
			
		||||
                "sha256:81f7c0c5559becc8049470d86046b36e96113637bcbe4753ecef06977c00245d"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==1.37.1"
 | 
			
		||||
        },
 | 
			
		||||
        "zipp": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e",
 | 
			
		||||
                "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '3.9'",
 | 
			
		||||
            "version": "==3.23.0"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "develop": {}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ Ansible playbook for base and initial configuration of the web server hosting my
 | 
			
		||||
## Assumptions
 | 
			
		||||
Before you can run this, a few things are assumed:
 | 
			
		||||
 | 
			
		||||
- You have a clean, minimal Ubuntu 18.04, Debian 10, or Ubuntu 20.04 host up and running
 | 
			
		||||
- You have a clean, minimal Debian 12 host up and running
 | 
			
		||||
- Python 3 is installed on the remote server (requirement of Ansible)
 | 
			
		||||
- You have a user account with password-less SSH access to the machine
 | 
			
		||||
- You have sudo privileges on the remote host
 | 
			
		||||
@@ -25,7 +25,7 @@ Once you've satisfied the the above assumptions, you can execute:
 | 
			
		||||
- Switch from `cron-apt` to [`unattended-upgrades`](https://wiki.debian.org/UnattendedUpgrades)
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
Copyright (C) 2014–2020 Alan Orth
 | 
			
		||||
Copyright (C) 2014–2021 Alan Orth
 | 
			
		||||
 | 
			
		||||
The contents of this repository are free software: you can redistribute
 | 
			
		||||
it and/or modify it under the terms of the GNU General Public License
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								ansible.cfg
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								ansible.cfg
									
									
									
									
									
								
							@@ -2,15 +2,16 @@
 | 
			
		||||
retry_files_enabled=False
 | 
			
		||||
force_handlers=True
 | 
			
		||||
inventory=hosts
 | 
			
		||||
gathering = smart
 | 
			
		||||
# instead of using --ask-vault-pass
 | 
			
		||||
ask_vault_pass=True
 | 
			
		||||
remote_user = provisioning
 | 
			
		||||
 | 
			
		||||
ansible_managed = This file is managed by Ansible.%n
 | 
			
		||||
  template: {file}
 | 
			
		||||
  date: %Y-%m-%d %H:%M:%S
 | 
			
		||||
  user: {uid}
 | 
			
		||||
  host: {host}
 | 
			
		||||
interpreter_python=auto
 | 
			
		||||
# Don't warn on unknown SSH host keys because it's super annoying for new hosts
 | 
			
		||||
# or if you get a new laptop and run Ansible there!
 | 
			
		||||
#
 | 
			
		||||
# See: https://docs.ansible.com/ansible/latest/user_guide/connection_details.html#managing-host-key-checking
 | 
			
		||||
host_key_checking = False
 | 
			
		||||
 | 
			
		||||
[privilege_escalation]
 | 
			
		||||
# instead of using -K
 | 
			
		||||
 
 | 
			
		||||
@@ -3,4 +3,12 @@
 | 
			
		||||
 | 
			
		||||
tls_cipher_suite: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
 | 
			
		||||
 | 
			
		||||
ansible_managed: |-
 | 
			
		||||
  This file is managed by Ansible.
 | 
			
		||||
 | 
			
		||||
  {{ 'template: ' + template_path }}
 | 
			
		||||
  {{ 'date: ' + (template_mtime | string) }}
 | 
			
		||||
  {{ 'user: ' + template_uid }}
 | 
			
		||||
  {{ 'host: ' + template_host }}
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								group_vars/web
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								group_vars/web
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
---
 | 
			
		||||
# file: group_vars/web
 | 
			
		||||
 | 
			
		||||
# run nginx by default
 | 
			
		||||
webserver: nginx
 | 
			
		||||
 | 
			
		||||
# all hosts run fail2ban with the sshd filter, but some can use other filters
 | 
			
		||||
extra_fail2ban_filters:
 | 
			
		||||
  - nginx
 | 
			
		||||
 | 
			
		||||
# root prefix for all web servers
 | 
			
		||||
web_root_prefix: /var/www
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
@@ -1,87 +0,0 @@
 | 
			
		||||
$ANSIBLE_VAULT;1.1;AES256
 | 
			
		||||
37356463383831623061363666396235346361663734326234323239633332383431656534636337
 | 
			
		||||
3238613566336363636235393535373330363562333135630a626531343430396666323139633833
 | 
			
		||||
37656533353537393335393966323637326335666134613633643330313334383237383736623637
 | 
			
		||||
6533343338396536640a376466633436643162393533646464343930346665616165613835373630
 | 
			
		||||
66353037653339633038353033316463393234313630646138636633643066653636343739383730
 | 
			
		||||
65343161306339343931323737336531646131363034343163366137616231363638313330343365
 | 
			
		||||
31663932343436313364326331373733373830646637313733323335306161626135616438656363
 | 
			
		||||
32623333646637633636316139613234613232393462306364633966666639623231643735663266
 | 
			
		||||
35396266313936326532383139346361626532323263633662373139363638303961616638636535
 | 
			
		||||
65343862623865386436643930353834323566356164386432373434336536363262356638313333
 | 
			
		||||
64626633353565303538353634626438363131633164636263643938386538323932346337343730
 | 
			
		||||
31336266343532306531626234323962353930343333656436356436343666336335633233386462
 | 
			
		||||
34623332393734633761303762306336656232326533313131316331326639376338393437363834
 | 
			
		||||
32663766633037316266373064376638643237343434356166613862383963633231353531646432
 | 
			
		||||
36393438653234326330316438333862396163383231623034383963336435393533393263653739
 | 
			
		||||
38373764373034313231373536653233666230333437626431383161346636376434383135393434
 | 
			
		||||
30353361343136663135356536316630643163613930306363343830323932393635343936396535
 | 
			
		||||
38366638353737336637356237646332353438303632396238356364343464323064373031656331
 | 
			
		||||
31346134323965646336666336303835326463656339356131613633336539613234653332353539
 | 
			
		||||
35613362653335663863626532363433663634393036373462663833636333646661643865353533
 | 
			
		||||
39376535313635373434633466643135323762613539366135376536653761303134303964343534
 | 
			
		||||
65333934396638373239646339343732623139303037336133363533653330383261383437393061
 | 
			
		||||
37336334363237333437633664313637366566396232336337303235366337616530333261356662
 | 
			
		||||
39666531653762326364353534623431333530653935316161383535663762636136316239336233
 | 
			
		||||
35373962623934633663656337306439616431316165666563336532373135323566386431303733
 | 
			
		||||
36313264323066653164346338653433393337623666646162383666303930613939396662373965
 | 
			
		||||
38653863623935336632666366373764383136376163663137313234663761343066336235626232
 | 
			
		||||
35303532376537643663653431323830623364623362346437396664386363396632646364666130
 | 
			
		||||
62663265363334383663626661363632646432393463373564396633393235353434636437623261
 | 
			
		||||
30323866636332356136396662363930613961613961343963313733343033616539316131323262
 | 
			
		||||
65666665663731636633623464353430623135373430313065626438396363366335363466316132
 | 
			
		||||
64353730383761386563353133396262366265343637643931643565386461303138613565303239
 | 
			
		||||
37646339316366316431663237653230346464643433376639356462643133643234386131613965
 | 
			
		||||
66333831663832326131343134633231636633373735333634663861393531633738366136356130
 | 
			
		||||
38653534666662303539353534636537343665366231346565376437313037646162663365666630
 | 
			
		||||
33366631653530326234326333623333346535343362666263376561333334633533356264393637
 | 
			
		||||
64633864616430653663366133343962376233656562643335633336326335626664653861323334
 | 
			
		||||
65653864323062616234343636633435396332636635653266353032623637356133383538383034
 | 
			
		||||
36383936666238333366386637313434656332626266346439346566666537623039323936303936
 | 
			
		||||
62353130663632636636623466326663623639313433353766346230383138323461643962666562
 | 
			
		||||
65646234346631613139393265666663663537323236383832373532393662643566636164653364
 | 
			
		||||
39636133613937393433636231626238386463376434666166643662313661663635356436636165
 | 
			
		||||
38333830313638643863373162636530346433613366613437643932383035643464363732663633
 | 
			
		||||
38633065366638656635356462393935383665386532633936366437333233316563366231393935
 | 
			
		||||
32393736343365383164346634326336373436386630386630616436373139646531353038333562
 | 
			
		||||
39646132643332373563613664303931633735656135376561646166343934396130343834653461
 | 
			
		||||
62343662386239313731336538393430316263333966306530616161633763306331633834323633
 | 
			
		||||
35633237333136366439376666636461356131663830323832646462653035643561396337633362
 | 
			
		||||
64323532663637323966663262353266316361353931333738323762656532343165626266653035
 | 
			
		||||
36353462306361383233303464353766323466393862313037386139326231656230343630616139
 | 
			
		||||
34626533323065646636643736323535356461623063663262656562333466666634376239356633
 | 
			
		||||
38373362363030346434316261643236363337663237323032623339393936303130393662666434
 | 
			
		||||
33386134386633623930376334333466666137356432636131373562306533333836353332316136
 | 
			
		||||
63653533336232336632353465373263363037313933663131633763343366663034353364373661
 | 
			
		||||
63333166306332663837313334623231653561363964306337353564326266353366343538366433
 | 
			
		||||
63383335336566366564333735383337353765613035383135616135653662346133333338303730
 | 
			
		||||
36303334623335613836333938646366376634353664633731666235346638346662656634393631
 | 
			
		||||
35396262323939393562306530323763353939363264666331373266363937653063366138636364
 | 
			
		||||
36623835383961336331303439613731633734343135323938306263363637616235336461333732
 | 
			
		||||
65303636623766313038356266363666316665343832623662643263623233356232333062333933
 | 
			
		||||
65373763376430366565363161333330376138313130363534623364653434616438363732643333
 | 
			
		||||
61336631653762613231373236613164623566663730396163383136366430353439346637623965
 | 
			
		||||
39356138633037313165333034633234353666646132656532386332393962626239383633383833
 | 
			
		||||
64396430343535346438623233326632663839336233316336383261346330353739633331396362
 | 
			
		||||
65643161396430646436376636613061656566623038633665623938656232633665633365613837
 | 
			
		||||
36386633313032306238373063346662333539313931366232323931613165343639666437386630
 | 
			
		||||
63343766633336346632393231303566323562373236656135366135376262613163646235646635
 | 
			
		||||
31356264393231353335363331663666623832643638653064366438373063623462333631663631
 | 
			
		||||
32356664663332356538636462383364633036303733393161366565393361363530626431623532
 | 
			
		||||
34303538653032313138373339663833613637356364376561316535643238356633356130376665
 | 
			
		||||
37643231333037626164663634383666323333316235353832333335393262366235613461623166
 | 
			
		||||
30343933643637656262613337313962666432656632323631353066353838373864383734646361
 | 
			
		||||
35393966646331633466316636326162343831393639383034396133383537313138646339646163
 | 
			
		||||
37363736613135326634363031626132326664343732646161623362373036323337623063653064
 | 
			
		||||
37373839396261653764626338393438643634666463336263346566653366336536376464643934
 | 
			
		||||
31366261353734383064346433363730623762636463613432373338356337656665376338353965
 | 
			
		||||
34353866343734633661633466313132663463323962653431316536643565666364386438336236
 | 
			
		||||
35376163313462383130366337653239623866663837666238346262636238623932333435623634
 | 
			
		||||
65333132373436353533333834653131656638336362623535613366346266653863326431666137
 | 
			
		||||
32613563316138333837333131663637346634663962616230623534383239616132623130646137
 | 
			
		||||
62613863626632323838343736633765393666336664313563316535346130333462353063656166
 | 
			
		||||
62376237663566396665366238323937343434363964653133393163343932353761353038373234
 | 
			
		||||
33303462613837653730646462643765396631656536353335353532663033663433613032623833
 | 
			
		||||
36656534646163353266316531343137626131316536396338666262336136653734613838333133
 | 
			
		||||
62663937346566626131323033313432333562633337326634623866656363393165363235386265
 | 
			
		||||
6332653639336330336135333865633662363738613565303766
 | 
			
		||||
@@ -1,127 +0,0 @@
 | 
			
		||||
$ANSIBLE_VAULT;1.1;AES256
 | 
			
		||||
35356461313263333464373365643730653766393437316133336138313761343130646131363861
 | 
			
		||||
3834623038366139376261326439633334393565346666650a323963393665366134386535316530
 | 
			
		||||
61316264343737383331663361353838656333623335393635393762303533313036373161393462
 | 
			
		||||
6664616164633039360a613766323932323266613166646635376333626333356364316233633931
 | 
			
		||||
37646436383339343938356164646262363032663063393038616535346139633435623265343762
 | 
			
		||||
33663036393761643861386538336665366537626464373931386535666237636439383133393636
 | 
			
		||||
31383938376331313531366237336463323563323134313037393435333239613663663234376239
 | 
			
		||||
62346163663061316666636138353962383336623133333030396534323033626632343561386466
 | 
			
		||||
30356266313566316565626562376364643238386561323165633730383262343638326337636264
 | 
			
		||||
35636264386262363264633833653265393962373435653639363733636562343238363931663031
 | 
			
		||||
63666135613437366166643130623034616636616632633838653464666130383365326434666234
 | 
			
		||||
32643164353766323131343137373438613663646635326338303934613065653466613036323961
 | 
			
		||||
38353034636434663061353138393130316432366539643937623935643834633964653630326564
 | 
			
		||||
31636563336138623433366536663632313863313435333531353865623066656631343032383937
 | 
			
		||||
65313535303563653762646261396366333737306331643037366433323030303265613638616164
 | 
			
		||||
36336338333837393235326539303964323261393039393533643538623634613432643532333863
 | 
			
		||||
66376166336662306564323433356330336662333433633061313266323638396165656665663965
 | 
			
		||||
38376465383662626633396366326466333436333338373361363039306539396337333061643264
 | 
			
		||||
37356562623130373765366331643332376337353065366561656261353131666533636466386432
 | 
			
		||||
31643438633464356464333065316139626166326164616666363666393562356239343637333030
 | 
			
		||||
39366231316462663265346464613333306336316163643131303235616432613565613733333466
 | 
			
		||||
33343036326435643736336465303861643739663536343965346433363231323065643733336634
 | 
			
		||||
63646133633037613964393935373161666161383862616333376638616336616537616363643661
 | 
			
		||||
36326665316332303537663935633431626533323838393638653661343665306332396130393866
 | 
			
		||||
66303231666533393132396538393963626132643366373539656437386663653261323465613366
 | 
			
		||||
39633964366362353866326562313834313266656265363161316261386638623737393034663665
 | 
			
		||||
66303966623830366431316432323863386332383362396534396166343238616534346335323761
 | 
			
		||||
31366164623465643331323330323736336337653230623362626230623365636364633261653765
 | 
			
		||||
38613566626537386134373133376139623062383736356634393739353665326164343131323833
 | 
			
		||||
31313038363663316636356431613032636131303964373564633462303735323364636131373033
 | 
			
		||||
30623336306663346639326638303930383466323938356163633964623565313261363139303238
 | 
			
		||||
31326666363164376261393062616339643039316163346362633865356433346636323664656262
 | 
			
		||||
65323565346137333338363864346437373261383936626531316330316539653339303464623462
 | 
			
		||||
32616635373631323465646632323732323432316332353033656339366639663732313939303733
 | 
			
		||||
37306130656662383237613361326161313039326561396538396333373362633365353130343963
 | 
			
		||||
35613833616635353266636265313766323635303764346236306664346432366632376132333034
 | 
			
		||||
65303235366137356634666138343232366533613966363030376537386162396638656637663932
 | 
			
		||||
66663939393737313634383430323339663634333533653265656163326637636635386163313333
 | 
			
		||||
38666236626131333139633834373534316638303364666135396361616130303061313431643936
 | 
			
		||||
64666134623666363937356334356134306463386466613365363136663136393833616430623836
 | 
			
		||||
65373663363664333766373136336636393663376535623532626632396665366436623661636665
 | 
			
		||||
62333961383034353664323333353766343939666636616539653236646634313333373639643765
 | 
			
		||||
32353161633665306463386633616131333130303139306134646134663865306463353838323565
 | 
			
		||||
39313538393034323065333031386634396261336131333763393466633335666238373663623564
 | 
			
		||||
38316633663536383730376532633830623939633662346636356632653031633335313732666663
 | 
			
		||||
33613133653666313564626261353730373637396137323964363866653964373838613130643337
 | 
			
		||||
32376165356236663332366566626639313038363138343061306438313435613862626564613830
 | 
			
		||||
61306262613262366539663338643962313066613665353063306537643561666462333763623866
 | 
			
		||||
30643230313334646535336662616137326437323438336361376562663361376230316362323235
 | 
			
		||||
65363630666464323638323761343033313763633866623361376636653631396263626239613764
 | 
			
		||||
64656163343435643838353033316364306134663833616231343831613338653330643466643630
 | 
			
		||||
62323039396231366136353432373732613465336163326132353731313765356163323866633736
 | 
			
		||||
35326665613165373339353165613036646665313065343432663563306664323163306535613338
 | 
			
		||||
31663138333639666133323139326339313733663334336637373866636661636538666630346233
 | 
			
		||||
31393364313433626565616661313265336165613534666232333835383963646433316632303533
 | 
			
		||||
62626134623830363533393833633439313034633965346163393932636464326664653335643833
 | 
			
		||||
35386332663736343766656232313031306534653434363164623530613232306531336561373534
 | 
			
		||||
37333763626135373538313561303737623035653832333533663534313035313530373037616634
 | 
			
		||||
30613937626664373333643735633164663930316235336663376132353338356333623431343535
 | 
			
		||||
37623138363937646665626535303463643330333233363136313134383939343535646539346363
 | 
			
		||||
61633966396234393961663735646634373266373264626635306162386632376262646336316266
 | 
			
		||||
36363166393332626533613736353038656266323263333036303964656662663436616532396665
 | 
			
		||||
64366638386164313466313630663138333066653061666362336661336539653339616234646538
 | 
			
		||||
30316334346162363065313438663865346434313564363863613532313637313430653439333962
 | 
			
		||||
34643039383030623564666230623264303338343564643961653531366463623166333661653630
 | 
			
		||||
38613062626464663963626233663837653533626532653239343065383036663162646261386535
 | 
			
		||||
36356231383263396365653639613664346361643666336463623136616330336161373336643535
 | 
			
		||||
36613530396266633861643530633732333436373966613437343736653537333531663466383438
 | 
			
		||||
64323064356262646133363463316639353630653766663731653030616461393139396265343033
 | 
			
		||||
31336662366465633264643065386432376435346236323565326562663161396435373762613839
 | 
			
		||||
36316365633937636330643837646335613262363734396261313633373731363466356632636532
 | 
			
		||||
37653036336665393733343832363739323739383730306635306666333566366663396230623433
 | 
			
		||||
64663338626239313265623838383933653539666666383633623939343461393036303230663562
 | 
			
		||||
35363232636635613739356536386439326537363965626261363962383231386532623565343662
 | 
			
		||||
61633931613131303836356366653030656333623235663266636535666632353666386666386630
 | 
			
		||||
36303134613262663335623330356639383432353133333137363665633565363037333136653933
 | 
			
		||||
64396230613837396435333835343265633638346232303738663764663032343061346539393135
 | 
			
		||||
63303064366130333030663739326331633762386332333162393631346234306363313737663261
 | 
			
		||||
31303437376339353634393438316139663862333530653339393030633932343765326435303530
 | 
			
		||||
30326566336361646563313433663063396338663661353832666561393437306131336465343332
 | 
			
		||||
63316533623362613062626337306530633833323132616662613366653566396136643936653435
 | 
			
		||||
33323938333666333439653037383335353763386132643362643361386232383964366237326538
 | 
			
		||||
32343061643462343265383234366465366232666434623634383132303138643333343663613039
 | 
			
		||||
65663339663030326364663561383833333432633437313232356265396532303735316234353565
 | 
			
		||||
39313532306437333238373064643238666632383166313832326662663762316165323936623239
 | 
			
		||||
62366239393530366666343866376566623863373333666266316334346138396566613263333539
 | 
			
		||||
38373438653663353537323961373434363735303838306262323330616538636333306366373663
 | 
			
		||||
62666462336331623761363036353331356632643664373665656332663530613931376666353261
 | 
			
		||||
64346531363265316439393633346334383439623338653334343739353464316436626635653139
 | 
			
		||||
39633232626463303463646162633131626538353232646663356335363663613234376338623539
 | 
			
		||||
30303765636635633331326337373334626664343063623130393438633863306531653631323763
 | 
			
		||||
63323661356362346536646430623864306135663766313833366165653066343439663064336331
 | 
			
		||||
33353135383830373831623463646461616665326139623565666464363961306461343361343665
 | 
			
		||||
30633331666533383161623130613963376266613533366334393262313730313630323836623162
 | 
			
		||||
33613637363431306632366230336537373732613337613830666635353632383834383465303261
 | 
			
		||||
39633334616561386163353661306564333632653731363434666562353561363462376563626563
 | 
			
		||||
63353666653637336666376138333966643237633434396561386164623435333836653238383261
 | 
			
		||||
30643331373138313062616532366265313831613938373865336435383564636266663462636461
 | 
			
		||||
63663230626532613130623566376437356337653564303033393737663735316130633234643163
 | 
			
		||||
30373264363331366435383837303762363531333335613738613463336139643333626239346232
 | 
			
		||||
31393631663861623330353536313731353332313135363436643161353435653865313666373639
 | 
			
		||||
37313734306461633338363033623535653066633135666463303261383366333266613830623138
 | 
			
		||||
37303963666139306632666537633137326434366231333435323335623130356332313165353733
 | 
			
		||||
37656238613138396635303765376666303631633034306133393639363662313066653062373638
 | 
			
		||||
63313961343932393964643538663863313664616164363264663438393639306161373539653265
 | 
			
		||||
34346535373939316563353437663066656439353161623337343935396463363231636262656565
 | 
			
		||||
61653766616238393030333837616631373736323837363136623337623539336661633533653663
 | 
			
		||||
37376530303630313861376261323231303464653666323237373466353037313230333861373366
 | 
			
		||||
61323964636235373030343462326166323533343266353236653138326639363664633066346239
 | 
			
		||||
66636439373262646536333134306363313531333437316536656337633764356339633933336131
 | 
			
		||||
64366565323438343864666462356232616263623530613631303265313861383135333562343263
 | 
			
		||||
39633938313435313266386538346132336638303938373964616535313035653063636435643538
 | 
			
		||||
31636134393930363635613733343538326637366661623833396531623832616238323637633866
 | 
			
		||||
35666266656465323830356432653839633763643430363431326632393664656464363238363364
 | 
			
		||||
64356132326561376330316434393765663661356466346463366538323439393531343632316134
 | 
			
		||||
65313436623664613230616562323138343831623033643338363839343837303334346361356433
 | 
			
		||||
63356163626432343733336531366333636466613863613438373662643266636134633934326432
 | 
			
		||||
31386634363161653965303230306336373434613232613237343836353061613533616237666462
 | 
			
		||||
35393935383431323764646465636563363633336463353064346631363531383061333135386161
 | 
			
		||||
64363366303262336464646232316231613332333732373932643562626534666634316565343164
 | 
			
		||||
39336436366163326137396236393034363162366634616233376465303063663330386137343733
 | 
			
		||||
65393231343634316365326663666532646162623633373530393563313861653638353932396137
 | 
			
		||||
38666161336432303666316263396538663665353334376637343762613262303062313932363831
 | 
			
		||||
65346637366163333233633562393535306263666330666636613363383939393035643132326162
 | 
			
		||||
35656130366237363136643938633931363731623662343536623136313436616265333138646239
 | 
			
		||||
3765356139356136346264386137316437303865646335643530
 | 
			
		||||
							
								
								
									
										110
									
								
								host_vars/web19
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								host_vars/web19
									
									
									
									
									
								
							@@ -1,110 +0,0 @@
 | 
			
		||||
$ANSIBLE_VAULT;1.1;AES256
 | 
			
		||||
62303831326630663635326562636631623864363765306162636436383762613432313536643863
 | 
			
		||||
3639623135613264323034323632663332393239616238390a353162646331663465656362316436
 | 
			
		||||
61353064663734613432653436363961653539633364656337353532373138626263343035306463
 | 
			
		||||
6333333566653635640a623630613736323933363935356435343561613230636532656533326431
 | 
			
		||||
35343335393536393934313865626662643533373938383337646233393236613037323363343437
 | 
			
		||||
61343161376631323333626331356139633139383366643036346139623564373536383634643137
 | 
			
		||||
31626231636639316463313166373362336663373138643234623435383363323065306232663734
 | 
			
		||||
34663963663930343633373864666532353864306137663234313133353537666633396136366665
 | 
			
		||||
35393066383234313836326336343633363237376564303238636439303762373337313062616633
 | 
			
		||||
38633634373832313633313939643231326130363561623530613836636363643466303930653230
 | 
			
		||||
32323837656637316635633062373737616166663532303066656538386565393933353666313666
 | 
			
		||||
30336434346562353662663263653833356263643464643563386566643330656633633062626333
 | 
			
		||||
30383265393964326431386630366463616563613630663431393735373433636433646663663734
 | 
			
		||||
36323635333838396363616331303061646530306430383033366666353663393863613163623362
 | 
			
		||||
30393234643036373231616666356363613832616630633462306231326138633461663062643836
 | 
			
		||||
61663333323830393338663362383037396230356431303839386263356630303139386136623939
 | 
			
		||||
36656432393633373332646261313663313636333633646432616566363338333938323636336336
 | 
			
		||||
36643761356361383363336266333261666330323330616466303363306464346362613566323862
 | 
			
		||||
33356532343236666134643766373932383630383937343664633037616436626265623064316363
 | 
			
		||||
33623730393964363465306638376537303435353937363934383865333639306133643663616265
 | 
			
		||||
38643366303035393363666432323062626164666237383239633232303130316265306463386265
 | 
			
		||||
33386562366233396366303132363365616634343066326631363836363437303231616433623736
 | 
			
		||||
66343333373033663439636432303630313237613461633965316233356636363832353362633632
 | 
			
		||||
35663439383135323230363464646433313939396561633030383139346630323435613566396439
 | 
			
		||||
64356666666336616334623631333132373064383135323532613635326661343962623363656236
 | 
			
		||||
33303639323764623264383964303130306239626638306439643939393630353062313636633466
 | 
			
		||||
38613637316534666337353164616534366530336536663162353834636634666639643163643936
 | 
			
		||||
34366566636463303431663436376531616139366264393738316330633036396563336330656239
 | 
			
		||||
35653736346664386262636538353536393064663161646533353135636137643230653965323562
 | 
			
		||||
38346233373861333832666566346261663935646465363231633261626563373762633832623562
 | 
			
		||||
32613563383665393531333139353639623232623263353163613138333861383465336635386663
 | 
			
		||||
38326464356261663834316632353132323362653737306265366239633431323738393930313761
 | 
			
		||||
37633163383932323462373862663034346365643535383862353231363534646530303639316162
 | 
			
		||||
62343565653332313663353263303430643032346432653861356235633735303234643666353664
 | 
			
		||||
38376666633336383537333464666463666262353063613966383331326239343263376263356230
 | 
			
		||||
62343964633131313331626565336635393334633864383431316564626536373463353765636131
 | 
			
		||||
62316634393133316666613236366661303332366135336266643763353662313066333464353064
 | 
			
		||||
30653664353434323033393361376335616633623331306630376138393764323764353861343430
 | 
			
		||||
39363666353464643833643937343538343338313361356566656333373230613833636532663862
 | 
			
		||||
62666162313830633936303836393238643561326264373338643663393930653931613964383263
 | 
			
		||||
36623435393265363637616234653938656133663761353132366435336533633961316263633137
 | 
			
		||||
61623135383837393333303137623030363033383837623534383464346538373433333737656138
 | 
			
		||||
37353138396537306330366261653036653835643937336666633630303232336564393334393462
 | 
			
		||||
31323637626465393561616362356662393861346436653963306566613964613666656264653864
 | 
			
		||||
39336234396332383534383961663831386135393564396434376361333461613166633332643862
 | 
			
		||||
33373165343539613362356164643361623635663232346633356232313232633864303438356132
 | 
			
		||||
36623461663831343563363765393966393666633766653061306537616663373535356139353461
 | 
			
		||||
38303239316239303466346436306339653932376462366237326262363961333034326235626436
 | 
			
		||||
66383730343635633566613461653437383463376666366534383639623032333335666134373931
 | 
			
		||||
63326239666432353564363535623530646439646236623932343963653530393261363838353961
 | 
			
		||||
31333036326637656235633331616531653961336165373763373238626265373232373439303361
 | 
			
		||||
38343066643236383866376139363634346632393533383637616139616233373365653862383864
 | 
			
		||||
34633638633339643962363536303634386435616662373061643862386331633032666434363834
 | 
			
		||||
64623336383366366539643431306230303932666333386635336233363830616461353337633436
 | 
			
		||||
36653464616534643038636134366132663430366362643961383335366534353361633230346565
 | 
			
		||||
35376534363330316262306564653661353866383930316634623235383337636662376464363931
 | 
			
		||||
39333864323162663835356534303135303437306439623938353061623634616365396533613264
 | 
			
		||||
64626432653531386634363539623734356234646231323338366165663033363362343437643338
 | 
			
		||||
39393362333231653834653237346561613338313264643662336335373163643166356562316363
 | 
			
		||||
63396464633334613662383733333136306131343138663237643265386134653034636439663632
 | 
			
		||||
31303935373633376438613338303966633462663937653835333939393133653237396130396366
 | 
			
		||||
66636533616365343938396664633364653633613231653938383830363439316331313834643163
 | 
			
		||||
35343935383462386266313739336232336233343931333965313239383365393164613936636465
 | 
			
		||||
30323665633134396662623864643430393434313961623363363039363331306338363137383830
 | 
			
		||||
35626161666338646363383562373364623765633430616365336435383230663338633335373433
 | 
			
		||||
37643365616339633761663864383438383934366535343861366163323338626437346636323632
 | 
			
		||||
36383135373566393561636631663137346266303631323837363261333731333132663830393539
 | 
			
		||||
64303066663932353762353839643430323039643138623161633734333132633963323831663439
 | 
			
		||||
35366236306632346336663035616664363864643662343235613535663032373239353966316631
 | 
			
		||||
36313739333965303962626563356461333536613832643162323031653662663830373839396632
 | 
			
		||||
36363635303133373064646333643334393163386531353562316164353536656362393865353539
 | 
			
		||||
38376435313530626435373066326132333936663566636331356666396465323565643866346438
 | 
			
		||||
39633036323935323130383537666262336362363138633666303833393538653665326561663430
 | 
			
		||||
33323466316565373565373966353331346462633430313161613334663465386631623761356233
 | 
			
		||||
37313234303561616534363735326531353932386636373730333263656239343262343139646137
 | 
			
		||||
65316533613762356638373962393433663236656435303661653430396534316162373366393536
 | 
			
		||||
39303732623264336563326362613830636538663736623362663764393762316133323764633134
 | 
			
		||||
65643134636466353639356437353538316462666236373261353863653135633030613966633939
 | 
			
		||||
36343939333631353361393636353137613236343166663166643863393961333035646636396633
 | 
			
		||||
33643064653631373239343930663435396361366437373163653231373836653063636365386138
 | 
			
		||||
35326134383565636230666664323736623139623062633038336133376561333439343238663963
 | 
			
		||||
32623561666134343837353332346664306339386336376664626564376431353736363762313434
 | 
			
		||||
66336464656662623030643133646466373135383039626530396166636439643336383863343263
 | 
			
		||||
39363062316339373966343130353536323263373961383739623065316166303466633631663265
 | 
			
		||||
32386632393232643331353730613965636634366465343339366363326638313132633434316262
 | 
			
		||||
39333239626430623561346335376664303064396430623865643062326461623662653031353332
 | 
			
		||||
38313730646463393766656262323836336364353531343434336534626237633335623761326337
 | 
			
		||||
36663537633530653664316135343535626331356239313932323731393034653165636363633463
 | 
			
		||||
35613961366336363632643532336135346331306361656264323531646365373164316163663030
 | 
			
		||||
33323936313735613362336361613638646234326436343661373138333934396165316462376530
 | 
			
		||||
37636562373261663134626233353239643036366332353232633237633637363434653537313638
 | 
			
		||||
66326633613061396262613637313832653739666331653534383736363431616637656333633239
 | 
			
		||||
65386533333933646561643266353466343436366134623637336264623265363538303635656265
 | 
			
		||||
38326361333964353736373832623333366363323133623363656433393236626265343638633232
 | 
			
		||||
62616439356232383461366639623838616533343634666161323466366462613063383666363832
 | 
			
		||||
63633261333135613735366631336434646534653966383133356133316530343038633537386133
 | 
			
		||||
34373866616334396636383636343831366663386166323161306538363061326631323565333461
 | 
			
		||||
37666566313166303665646333313062646531306230656631613766313766333938663161653965
 | 
			
		||||
34343665653037316339393938366131356230373662666135333935306232323732383964323633
 | 
			
		||||
36346562313663643736333235313630666664646139633365363436373061373430666434376133
 | 
			
		||||
36373762383032373665323564636539386631653662303439643834623662336363653361373032
 | 
			
		||||
36383366626137386438646139663363363430376636666561336566313333623038363833323063
 | 
			
		||||
35346162646461346461333865323661366463643665303266636364626332386238346264383135
 | 
			
		||||
66313739376637393330336339626330653631373732633962363239353734393930353330356433
 | 
			
		||||
30323436646233616139343435363636313561313964353831383634646239636434643839366339
 | 
			
		||||
65313939343637393138373837376364396633346231663964656639316265643437663463326631
 | 
			
		||||
30383835356635323938343164663633326666363536626165376131373930386264383937303939
 | 
			
		||||
37396165393765326262643832336537356361616639653130316266666538616238383463626163
 | 
			
		||||
6336
 | 
			
		||||
							
								
								
									
										27
									
								
								host_vars/web21
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								host_vars/web21
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
$ANSIBLE_VAULT;1.1;AES256
 | 
			
		||||
38663333313561616264323430323162323837623430363739623561633331656664613936666665
 | 
			
		||||
6364373033623163393239663035306337383066343438310a383666313434323036643037363065
 | 
			
		||||
30396333626130303633663930663965666662646233393439376661346265616565616236623366
 | 
			
		||||
3930373433646231610a336233663132306263656465633034333030316362643939316465666534
 | 
			
		||||
38353961393038613961353732613434663565633466303265383231343336386330333464376363
 | 
			
		||||
33616330643364376332623634363766656366666239633964316439376463313063333162343963
 | 
			
		||||
61356634393438313063666434626338616264613639656462626639616263366531663135393466
 | 
			
		||||
66346635616439306364356133303664376134626636616131373138656562363363306633333164
 | 
			
		||||
62623135343633393834393165383231316562643062343165663235313930663039623135373263
 | 
			
		||||
61343336643235303962333938613230356465346436376334373438386461366231383737643137
 | 
			
		||||
36343832353730366131653430633465383163396336353065306638373166386438356264616139
 | 
			
		||||
65346635663338366463343932336231386235393836616238373864626235623935663661396663
 | 
			
		||||
31633565356465333737303339333435383162316530396563333335613062623138333232336162
 | 
			
		||||
62376363666431363931663231643561616562383230643737393261623934363633313231333137
 | 
			
		||||
39383238656237343661626662366465356463396336386261326334613436396364633062646532
 | 
			
		||||
61313136366636363861316166396134316562666435653437326331363563653035343138636163
 | 
			
		||||
66336139636533656334643966383962383734623565323435333665666164353732663736326364
 | 
			
		||||
35616264383237316330386539363065376334643432393636643464646238633034333166663665
 | 
			
		||||
33313166393738626133636136346637646437306335326263393634363133663736666338313838
 | 
			
		||||
64623139613037653461643563666539613237323934376534376461313833336338623032616661
 | 
			
		||||
64643062663633366436383232366137373936383430306332616634636331326361383931363961
 | 
			
		||||
62313236313563326438303935373837666434313435653236643135303739373763656562393537
 | 
			
		||||
31653265653739346433663937343439656231663963333633373066356231623762313438393763
 | 
			
		||||
36306336656566633034373834316363333233326130626639313130643935333437653934313636
 | 
			
		||||
32383034346234333561333466653561323834346166633831303566376266373933356536383031
 | 
			
		||||
6236303934323963336662386666653138313165366133303434
 | 
			
		||||
							
								
								
									
										141
									
								
								host_vars/web22
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								host_vars/web22
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,141 @@
 | 
			
		||||
$ANSIBLE_VAULT;1.1;AES256
 | 
			
		||||
38353762626535363837346634333565643931386536313339336365663162656533363636383931
 | 
			
		||||
3737373161623364396366323338613062386466313539640a653334643937326338386262623261
 | 
			
		||||
65643635373532636439396235373964303537646334343633633531633435323037313433346636
 | 
			
		||||
3866306363303338360a356166353265386130616163616662623764313536616666656237636563
 | 
			
		||||
30323036353635303438363234646234656530373365396530666539393132643831653039666562
 | 
			
		||||
65383962306465363862333131383263353736623264616465336139313638343462653361333239
 | 
			
		||||
64363562653366396664623662376433663335313231653935626237663430303734326433333739
 | 
			
		||||
62616265373732316530366331323664373637386661353664626464646264356465346466663539
 | 
			
		||||
31613435366362343564313732616639376664613630316236373333653634386130663463626231
 | 
			
		||||
31396631623466666364316237313363366439326231653035316437616134643035393138383364
 | 
			
		||||
35313738373562353632366637663232393638396330626165323535343538633264353366663738
 | 
			
		||||
30663135646162396331623837343661613333313437313434313365623664316135626239636230
 | 
			
		||||
65376137303439323166346536353831653537326662356330393362666430633831323537623830
 | 
			
		||||
65326164663136383339353138663936306166633662346363353063663435323266653137666630
 | 
			
		||||
61353263653735626236373233313436343466653238376634623366356431333439323932343938
 | 
			
		||||
33303432613063383135633261653837633961643737623462626439373335613430356532353031
 | 
			
		||||
31626666663963643736323731613735376239663530373166626365666339346435323761333637
 | 
			
		||||
35383464626437646665653931653932653033376464386132383038633734373138313830303466
 | 
			
		||||
39313532333866303565353161636435646231313461646639316566386639323561363633636139
 | 
			
		||||
37613661626162306431313266383964323434343039386533333535646565373933396565613565
 | 
			
		||||
34666136633265663035306261623531333665636336303665613635333232316331643935353461
 | 
			
		||||
32643735623532313363663530656630653531666335323565353063316537396334383230386462
 | 
			
		||||
33333565616634356537376466373332356663376363353166656139623336396130653564333739
 | 
			
		||||
39303733303939313838363331356437646632386631343466383332313037616430313566396335
 | 
			
		||||
31363038373437643266656463373662653966653832613935303462303031653761336165646162
 | 
			
		||||
31646631373335336435383638666562373236656231613662646161613533376237366463383630
 | 
			
		||||
36393532316336303531353032303937353963306164663162386137393664353962323865616532
 | 
			
		||||
63326462626130386234643639363762323863326134623063343731366433306431303763363233
 | 
			
		||||
36366334386266616261616266386439623665326339653562373836306165353137353137376337
 | 
			
		||||
37316363653935623736613138356333653936363866356665303737363032363564643532303234
 | 
			
		||||
37656432656363336564393263353430373437303337303461613763346461646565646535366638
 | 
			
		||||
34366337343033666134383966646563356533626665373337646231313431346239303635353261
 | 
			
		||||
62313939383762303235373537643531623465353062303939383666323139396630346461626136
 | 
			
		||||
38656632373637616532666433626564376338363239326234656561636239653536366331633234
 | 
			
		||||
65366139623238336234363564616430646435666562616636303064663437663731303839313365
 | 
			
		||||
38636438386162623862363865646233346336636439663833343136316165343564393339653565
 | 
			
		||||
38346166346434386338303032303430303535373635336562663030336566666435623537363137
 | 
			
		||||
61373161343138656365376531633830313561336632633330323035346431643837383062343537
 | 
			
		||||
66663961306666333535656432393134363565656635333633363732626665656365356138623164
 | 
			
		||||
65303936633666643034313636663262616661313739663135653335366261613133643630343362
 | 
			
		||||
66343033363835613031626635336538303362393561313032336136306465316231366137373736
 | 
			
		||||
62303335393333306132326135393562666431303631306538326433613362306131316139386361
 | 
			
		||||
31383665386466653066613038633335636233396335383764336462636138333034383836386365
 | 
			
		||||
38323739346630643532346161383336646165333336393961663930623531303434366265313861
 | 
			
		||||
39613231373335373338656434636134663036636234393534353033613133383034343437626434
 | 
			
		||||
31646339613430343265333833303231333739666266646436336161363330396264313636616461
 | 
			
		||||
61396332363537636162316261363030393466356263353938343236323932306366316535366533
 | 
			
		||||
38633165393339356339383939666161336461653438353632653530326639313238323761386461
 | 
			
		||||
63653765313532646166306237386435663432633934343039666637323362626338313135623034
 | 
			
		||||
30356438633635363738383932393861376235353962303663313963313964383530306530316363
 | 
			
		||||
64656638363436326562323234303961396333323931666365656433663865616439336138656232
 | 
			
		||||
66653964383034343837663936306632336562373637346132333063663263306237303461333732
 | 
			
		||||
65363661623064643663623661393563353739373535373764356163666639376236313839336438
 | 
			
		||||
35386265646331313663653761353864663934663261313037396135373938343265353934353361
 | 
			
		||||
30343564623631316366343838656135393364353836613330393536623662383637333039383133
 | 
			
		||||
37653733626662646631616563306638366263323634303636616331323964393962643061646361
 | 
			
		||||
39363562396634656637626630653533396236613334343332326439656165306537326464613436
 | 
			
		||||
37333632663731316165613432353339356561316431623038303365303663326666303666646363
 | 
			
		||||
66656630396661353765666131393737636630366666373136313837373165303437316233656261
 | 
			
		||||
38346463303964343132393162663762346163363739383733326635643264616166393264633934
 | 
			
		||||
64333137373532343032303431316633613836323631613231346133366635616435366436316239
 | 
			
		||||
64353633366431386664623239353735623037623364346431633733336563303430653233313637
 | 
			
		||||
35353138616164643834343339653739373038633531303039333632663566323565383637646561
 | 
			
		||||
31383965396365653364343761363161656432656665383963656463613637633938376234353532
 | 
			
		||||
33653837613266666661613165376665626432643439363637623333336234313836373232333736
 | 
			
		||||
65313232373233613763376463663161643636663162643864363962376232326462643936383131
 | 
			
		||||
39366164323038376633376238363663313238336166386663616261306532633331643537376631
 | 
			
		||||
31376663393036363566653061353636326565376636346466656263663266326332656461336437
 | 
			
		||||
32646162313932646632663738646532663439313630393038383530653562313439336631663535
 | 
			
		||||
36396265353231373435353137303164356633653938373166363663616632303764633738333439
 | 
			
		||||
62626533346561333565626163643235393164353861636662636531333834623965323034363735
 | 
			
		||||
33336138356663303462393864343434636364346432383665313931653062363138623261326438
 | 
			
		||||
31616533643163363261386635653732343939633965363362643536626264323537656238633539
 | 
			
		||||
62393935386433313366656133633532353131343237623466376632623434626362363062326531
 | 
			
		||||
33346165643164363365626432333631393664316266613731663162313764386336333231396632
 | 
			
		||||
36666536336333623063346166306164376138343566353063343866316432333266366337623866
 | 
			
		||||
61313039663661643863663434343732313139653037373065333463383635393061323938643162
 | 
			
		||||
61383064303461366162636439343438376266313931323934313563623435346634663739666565
 | 
			
		||||
62333035346634303139626432313262383262633437663436323763313361633235393037343665
 | 
			
		||||
62316564376464333133343134333230383765303834613233613232626131343631326433373062
 | 
			
		||||
36343466396430313534336332636233623337613134333861646334326633396434353765636163
 | 
			
		||||
37343638363234313030363661306337393361333332306331396164346633336130336366396430
 | 
			
		||||
62306539656332313162626239303066656664383639353730633738643132386662643733393761
 | 
			
		||||
62666339346130626163656237623730363066343838303036613038613763356263363365366238
 | 
			
		||||
62623435303838623630333231663137393362323234383533393763623235376164626461373736
 | 
			
		||||
36343761353362623433663936623433353439646463613233363732613435373564616239626564
 | 
			
		||||
61313066333939326435656535333963313831316231356232346534633531613963353130333432
 | 
			
		||||
37656163663230626632393939363532356366643764323330366630656334623261656334633865
 | 
			
		||||
61303066333566363061626437643132353664383061383364333338666230313034373535613063
 | 
			
		||||
63386237383638333263323337313336373830303865303466363965303839316162663431656538
 | 
			
		||||
33376332643335366537306133613761613132643232316438623939356331656263633933613935
 | 
			
		||||
65653465383434386561323462626362623566663330656439386361616562353430303938636436
 | 
			
		||||
66636531343063633561363330663436383930613438323764356562383536393933646264323135
 | 
			
		||||
64633764356166343965346362323466306636363633656466653934313230326435336536306230
 | 
			
		||||
38353432323537393131313239373861386237313530366139313338313330326632313536353837
 | 
			
		||||
63386161336335363834356437326630353031373435316462613634633039336132646134653236
 | 
			
		||||
31346664353932323339366464356161333637313761666138386164313163333531626235663338
 | 
			
		||||
62386333303264306363646136646463393134373939346438383465393439343337643336633039
 | 
			
		||||
62316464663038326439656334373331303165346534346466663538313632633561393335333931
 | 
			
		||||
65363964363335616639643462393463343437626539363838626439386164303464316666633663
 | 
			
		||||
63656639626133653266306266306531646331386366343936316136363935323662336335326338
 | 
			
		||||
30666130316265666631306635646565363039306138313462376662626161313134383633653834
 | 
			
		||||
32376163383763306165323466306264616366343332636564636162666434333732643635336163
 | 
			
		||||
61626162626331613438373464336465303739316130343965633532336531313661613961313164
 | 
			
		||||
39636165316638616338653965373833333732396363393463383433383930353361636166346232
 | 
			
		||||
61323935663536306533336137356566383130393564623938666231393431626136396137633066
 | 
			
		||||
36633133313861353338616561373838363833353531633465363731336237663561383561326635
 | 
			
		||||
62306338643965613635353536613335363934666362366466663461646135346436336164346536
 | 
			
		||||
62666631303638386137356233303235613636346661303834613335616161396238663530643165
 | 
			
		||||
65366364336139303766303938643038303461656335303438396565346330313665636165626432
 | 
			
		||||
64326666313562646239356231663834326566313331303363343064346539626636346438313266
 | 
			
		||||
65643364656164336166353435343730376266333633666230316464356439336463316464653137
 | 
			
		||||
66303865613961373732323439326535373933393537656462303831333432636261613564636330
 | 
			
		||||
63323361366332386331376437666234346661373233653432343733346363306130383665626437
 | 
			
		||||
33313330336365633464643563643465393935653132376135663163393161616462353838336664
 | 
			
		||||
35393833656135643733623765626639386561333336623930303465323963613164666531396632
 | 
			
		||||
35326365386566353966383635643132316230383363393539653335633934646239316131653536
 | 
			
		||||
66656161653030343462346337653434313062343663633665363838393865336536626532623132
 | 
			
		||||
66643636656134353363636433636538623930396262663864343332303066333566653063336464
 | 
			
		||||
32303030396137346636636164323133396364623532643332363638643761323938616530353836
 | 
			
		||||
65366331633561623331393231323534343239323565333330636136383836616230343034633036
 | 
			
		||||
38373530616532653166653932643665396434373465376530313663646236336238656266616261
 | 
			
		||||
33396463303963646633373038336662623161643135656136326533646337316562323932613833
 | 
			
		||||
65616434316239353531666131383335383733333830613934393465663138353662613063323537
 | 
			
		||||
31393337343737646537666430323666366338303731623339323063393636353132636233343436
 | 
			
		||||
61653862333837623666343061633531396235633565313631663937393337303764316466613130
 | 
			
		||||
33653732373034613639326338353438643664653461616133646235393864386564353765313932
 | 
			
		||||
36613165323465333937626165316632313334313364353463366239356630653530313761373261
 | 
			
		||||
35326331313438656238646535643131656634396238363734626431633734336238616538383636
 | 
			
		||||
32303331666531653331306263303534613332653535643833303062653566393632333030383263
 | 
			
		||||
63393636643264656439373165383861323534333462353763343931363065393738323433323839
 | 
			
		||||
33333530323434363662633939303261636465356663326565633238663333656131376130396561
 | 
			
		||||
63363636613161383465323233626630613265346162386439353665393832383961616564636538
 | 
			
		||||
65333635336638646436623033343831356339656638333231666439643337306636313931643466
 | 
			
		||||
32393765303361323735646130613035346564356562656631373435653832663165313131336236
 | 
			
		||||
31636634663466366234386262623234626161663461386661656435656133616339383633386230
 | 
			
		||||
34313065396335636630333066633339646432313632373131306235333164336534363630313939
 | 
			
		||||
32623062393230633732323130613338363833356533306662616637326337343330303635343532
 | 
			
		||||
38396665633938313932656130303263396631343761616631616637633831666139343130313236
 | 
			
		||||
62356630346264376432
 | 
			
		||||
							
								
								
									
										67
									
								
								host_vars/web23
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								host_vars/web23
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
$ANSIBLE_VAULT;1.1;AES256
 | 
			
		||||
64326662336532386161646564656439396461666266656463393335663130323930326139386562
 | 
			
		||||
3639653630336132663666646161363938386334323064320a663564613066313533353433333434
 | 
			
		||||
30346561616465646163646534356339666639333862623637613435376361323032636439633930
 | 
			
		||||
3731313063363337380a373961353530383764623830363935626231333734303364313565626633
 | 
			
		||||
37343037633862633632613165323136373662396438613663636433346566653064653632313338
 | 
			
		||||
36396333393334336434326630646164333531306432386133353664336535343363343939393464
 | 
			
		||||
34626335626436353239366138323863656336636536383733363931633933636331643263653566
 | 
			
		||||
30613931616462373336393337363430353962613665353936383533326364353365623333316664
 | 
			
		||||
62383439396131303831326562323264336638623461643361663763356236373464346464316237
 | 
			
		||||
65393232343733643338653734326562626166366562303037613862396564636662363066356664
 | 
			
		||||
32656363616637303039373732396533643432343961666365313963383131643464333765643737
 | 
			
		||||
32386165666131626365313938633530346361383734323334613464353862393931323836626563
 | 
			
		||||
62656531346532646530306463653364326362613162323536643836643839663933343132613435
 | 
			
		||||
63303234646335306632316166626266313635303566396363333464363631353834373761353837
 | 
			
		||||
65643461623135363139646564336430353461336433633765303138313730613630346465326666
 | 
			
		||||
61393133636262653836333664623333656164663361353130623863653863323131326136373238
 | 
			
		||||
33376333316433653337373834666136363130373261333330643439313734343036636364306532
 | 
			
		||||
63343662383539633235356162656366323965383331343139616361653466633865626337326562
 | 
			
		||||
63643761613536613334333065643533323066393764633931633066353064393966646161376361
 | 
			
		||||
37623939386636346161346164303832303534323038626335336665653634386132343031303861
 | 
			
		||||
61323765306366333936303765636436633465356539316631343562363535663932333666363035
 | 
			
		||||
30386233623265636464393662386464333430396337626230306438396563303437363938303061
 | 
			
		||||
32653939383136376365343934613339383563303935623664633639326137353437363261393637
 | 
			
		||||
66613331643530623862636665396536613730306537373666623135663837393466343261646461
 | 
			
		||||
62376162613861643633656334303132353034333834626664666237393534386439313638393933
 | 
			
		||||
35643663613432323432646466386434363335353234643264643463613334356462313766643030
 | 
			
		||||
30336364396235663230356235303264323339643761333036333537633862343862386130626533
 | 
			
		||||
36626536396663393031303533313238616133323239356634303830353439363133353839663266
 | 
			
		||||
36306539636563633734623162356230383232306138393831393336626336383966643335376564
 | 
			
		||||
36303730313936633361643736613736303163363536313038316432323039643362636538333037
 | 
			
		||||
65613663333032623035656665393565366363396134363832363163656532363537373435623233
 | 
			
		||||
36373961333237373264326634353363356537356538343663613034396132396366626330303365
 | 
			
		||||
62353461616434343938386237373365633861333733613631633234623034366364363761613636
 | 
			
		||||
34393532316466323264363363653335366639613731326131393335313039646538626665356333
 | 
			
		||||
62663435633539643237326631636563363833633130363535653336333538366137306235663730
 | 
			
		||||
36633934636536633865376262356239303966646638626638386536366662386432343466366161
 | 
			
		||||
36646436636538643366623864326630396565373462393132343834626638313437316137353564
 | 
			
		||||
34646138616438323065336266366434316135613938643131353034646230396632386433366365
 | 
			
		||||
38616436346232363563336439613939313464323861616530633962316634363462373530613665
 | 
			
		||||
63653636646565303664326631363535373037663734663965346430363831613431613365393832
 | 
			
		||||
62373030336262643430313635626261613232656236333130396537633238623265363932333966
 | 
			
		||||
34326135363762396564613064323135313663613565646461376162306532643433333336666532
 | 
			
		||||
65383661303137613335653336663666653463623565386137326662653839633536326135633764
 | 
			
		||||
33623437333931393737363061356235336232376437643131373531356566323336306138353561
 | 
			
		||||
66333863313461613930383231663162616261616639323238646439656166666261626533636161
 | 
			
		||||
38333362393033316266633364313739366262636530363937386137616234326638303137613433
 | 
			
		||||
65313962653566333364383732386165396136303666383439303064326463346563663434646364
 | 
			
		||||
62396130646632653039383661613638303162363538376236666338623865366639663138363636
 | 
			
		||||
36373766386234383465316635323931356233366262386135363238366538623135623361386436
 | 
			
		||||
64653533646233653463656334633566373433303365353965663732636566663332343337626337
 | 
			
		||||
34623861373562386264346430333133343631653631376366373735626664363965666561306262
 | 
			
		||||
35666235653235346233636361383566616533646662333662323139313865383264633734643263
 | 
			
		||||
63656431393834633935613430643839613433326431666665323136376562333737383862313261
 | 
			
		||||
65656431336439303563373833343965323965346439636131633366633431393032613963666539
 | 
			
		||||
38326539343132326334316233323362633835356265333031663066643535363639623031336362
 | 
			
		||||
64346230383638363763323462386261666266623134393139303264343234623132323437396630
 | 
			
		||||
66363738376133393731616535653230303262313937373333353932303038626166346366303163
 | 
			
		||||
66613831353731373165636532363165356561383137626437333563616561386666623234313438
 | 
			
		||||
37333435306530323235393164383138346131653235633536383636316161316238313064636261
 | 
			
		||||
33353963333430383236303038333939316637326130396430623964633338353863613534653663
 | 
			
		||||
30333839393230626261663966616230303330636335323565663938343562666663303536636332
 | 
			
		||||
34336665323764663163653161373166313631393534326532613538313637313136356336313433
 | 
			
		||||
34353036653738343433613763383137336562373332333062326134626638633938336364376131
 | 
			
		||||
61303435333163663636653135363162303663663266393438656430306532343438386436343735
 | 
			
		||||
31343231653263373532386263653263386435363633396638396164323539306233303562303862
 | 
			
		||||
3339306136613431636138333266633739323666633431363039
 | 
			
		||||
@@ -13,13 +13,13 @@
 | 
			
		||||
 | 
			
		||||
- hosts: all
 | 
			
		||||
  user: provisioning
 | 
			
		||||
  become: yes
 | 
			
		||||
  become: true
 | 
			
		||||
  vars_files:
 | 
			
		||||
    - "../vars/{{ ansible_distribution }}.yml"
 | 
			
		||||
 | 
			
		||||
  tasks:
 | 
			
		||||
    - name: Set password, shell, homedir for provisioning user
 | 
			
		||||
      when: provisioning_user is defined
 | 
			
		||||
      user: name={{ provisioning_user.name }} password={{ provisioning_user.password }} shell={{ provisioning_user.shell }} state={{ provisioning_user.state }} createhome=no
 | 
			
		||||
      user: name={{ provisioning_user.name }} password={{ provisioning_user.password }} shell={{ provisioning_user.shell }} state={{ provisioning_user.state }} createhome=false
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
# file: nomads.yml
 | 
			
		||||
 | 
			
		||||
- hosts: nomads
 | 
			
		||||
  become: yes
 | 
			
		||||
  become: true
 | 
			
		||||
  roles:
 | 
			
		||||
    - common
 | 
			
		||||
    - munin
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								roles/caddy/defaults/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								roles/caddy/defaults/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/caddy/defaults/main.yml
 | 
			
		||||
 | 
			
		||||
# parent directory of vhost document roots
 | 
			
		||||
caddy_root_prefix: "{{ web_root_prefix }}"
 | 
			
		||||
 | 
			
		||||
# Email address to use for the ACME account managing the site's certificates.
 | 
			
		||||
# Not sure what Caddy does if this doesn't exist.
 | 
			
		||||
caddy_email: foo@example.com
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
							
								
								
									
										10
									
								
								roles/caddy/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								roles/caddy/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/caddy/handlers/main.yml
 | 
			
		||||
 | 
			
		||||
# I'm currently not sure when we need to restart versus reload
 | 
			
		||||
- name: reload caddy
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: caddy
 | 
			
		||||
    state: reloaded
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
							
								
								
									
										82
									
								
								roles/caddy/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								roles/caddy/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/caddy/tasks/main.yml
 | 
			
		||||
#
 | 
			
		||||
# Configure Caddy.
 | 
			
		||||
 | 
			
		||||
- name: Check Caddy package signing key
 | 
			
		||||
  ansible.builtin.stat:
 | 
			
		||||
    path: /etc/apt/keyrings/caddy-stable-archive-keyring.key
 | 
			
		||||
  register: caddy_signing_key_stat
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - caddy
 | 
			
		||||
 | 
			
		||||
# See: https://caddyserver.com/docs/install#debian-ubuntu-raspbian
 | 
			
		||||
- name: Download Caddy package signing key
 | 
			
		||||
  ansible.builtin.get_url:
 | 
			
		||||
    url: https://dl.cloudsmith.io/public/caddy/stable/gpg.key
 | 
			
		||||
    dest: /etc/apt/keyrings/caddy-stable-archive-keyring.key
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  register: download_caddy_signing_key
 | 
			
		||||
  when: not caddy_signing_key_stat.stat.exists
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - caddy
 | 
			
		||||
 | 
			
		||||
- name: Add Caddy stable repo
 | 
			
		||||
  ansible.builtin.apt_repository:
 | 
			
		||||
    repo: deb [signed-by=/etc/apt/keyrings/caddy-stable-archive-keyring.key] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main
 | 
			
		||||
    filename: caddy-stable
 | 
			
		||||
    state: present
 | 
			
		||||
  register: add_caddy_apt_repository
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - caddy
 | 
			
		||||
 | 
			
		||||
- name: Update apt cache
 | 
			
		||||
  ansible.builtin.apt: # noqa no-handler
 | 
			
		||||
    update_cache: true
 | 
			
		||||
  when: (download_caddy_signing_key.status_code is defined and download_caddy_signing_key.status_code == 200) or add_caddy_apt_repository is changed
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - caddy
 | 
			
		||||
 | 
			
		||||
- name: Install Caddy
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: caddy
 | 
			
		||||
    state: present
 | 
			
		||||
    install_recommends: false
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
  tags:
 | 
			
		||||
    - caddy
 | 
			
		||||
    - packages
 | 
			
		||||
 | 
			
		||||
- name: Create Caddyfile
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/caddy/Caddyfile.j2
 | 
			
		||||
    dest: /etc/caddy/Caddyfile
 | 
			
		||||
    mode: "0755"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload caddy
 | 
			
		||||
  tags: caddy
 | 
			
		||||
 | 
			
		||||
- name: Create Caddy conf.d directory
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: /etc/caddy/conf.d
 | 
			
		||||
    state: directory
 | 
			
		||||
    mode: "0755"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  tags: caddy
 | 
			
		||||
 | 
			
		||||
# TODO: the variable is still named nginx_vhosts
 | 
			
		||||
- name: Configure Caddy virtual hosts
 | 
			
		||||
  ansible.builtin.include_tasks: vhosts.yml
 | 
			
		||||
  when: nginx_vhosts is defined
 | 
			
		||||
  tags: caddy
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
							
								
								
									
										14
									
								
								roles/caddy/tasks/vhosts.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								roles/caddy/tasks/vhosts.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Configure vhosts
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/caddy/conf.d/vhost.j2
 | 
			
		||||
    dest: /etc/caddy/conf.d/{{ item.domain_name }}
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  loop: "{{ nginx_vhosts }}"
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload caddy
 | 
			
		||||
  tags: caddy
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
							
								
								
									
										29
									
								
								roles/caddy/templates/etc/caddy/Caddyfile.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								roles/caddy/templates/etc/caddy/Caddyfile.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
# Global options
 | 
			
		||||
{
 | 
			
		||||
    email {{ caddy_email }}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Common security response headers
 | 
			
		||||
(security-headers) {
 | 
			
		||||
    header {
 | 
			
		||||
        # disable Google FLoC tracking
 | 
			
		||||
        Permissions-Policy interest-cohort=()
 | 
			
		||||
 | 
			
		||||
        # enable HSTS
 | 
			
		||||
        Strict-Transport-Security max-age=31536000
 | 
			
		||||
 | 
			
		||||
        # disable clients from sniffing the media type
 | 
			
		||||
        X-Content-Type-Options nosniff
 | 
			
		||||
 | 
			
		||||
        # clickjacking protection: refuse to allow rendering this page
 | 
			
		||||
        # in a frame, iframe, etc.
 | 
			
		||||
        X-Frame-Options DENY
 | 
			
		||||
 | 
			
		||||
        # keep referrer data off of HTTP connections
 | 
			
		||||
        Referrer-Policy no-referrer-when-downgrade
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Import additional caddy config files in /etc/caddy/conf.d/
 | 
			
		||||
# Note: these are imported in lexical sort order!
 | 
			
		||||
import /etc/caddy/conf.d/*
 | 
			
		||||
							
								
								
									
										46
									
								
								roles/caddy/templates/etc/caddy/conf.d/vhost.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								roles/caddy/templates/etc/caddy/conf.d/vhost.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
{{ ansible_managed | comment }}
 | 
			
		||||
 | 
			
		||||
{# helper variables and per-site defaults that we can't set in role defaults #}
 | 
			
		||||
{% set domain_name    = item.domain_name %}
 | 
			
		||||
{% set domain_aliases = item.domain_aliases | default("") %}
 | 
			
		||||
{# assume optional features are off unless a vhost explicitly sets them #}
 | 
			
		||||
{% set has_wordpress  = item.has_wordpress | default(false) %}
 | 
			
		||||
{% set needs_php      = item.needs_php | default(false) %}
 | 
			
		||||
{% set has_gitea      = item.has_gitea | default(false) %}
 | 
			
		||||
{% set static_site    = item.static_site | default(false) %}
 | 
			
		||||
{# Allow sites to override the document root #}
 | 
			
		||||
{% if item.document_root is defined %}
 | 
			
		||||
{%   set document_root = item.document_root %}
 | 
			
		||||
{% else %}
 | 
			
		||||
{%   set document_root = (caddy_root_prefix, domain_name) | ansible.builtin.path_join %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if domain_aliases %}
 | 
			
		||||
{#   domain_aliases is a string, so we split on space #}
 | 
			
		||||
{%   for domain in domain_aliases | split (' ') %}
 | 
			
		||||
{{ domain }} {
 | 
			
		||||
    redir https://{{domain_name}}{uri}
 | 
			
		||||
}
 | 
			
		||||
{%   endfor %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{{ domain_name }} {
 | 
			
		||||
    {% if has_gitea %}
 | 
			
		||||
    reverse_proxy :3000
 | 
			
		||||
    {% elif static_site -%}
 | 
			
		||||
    root * {{ document_root }}
 | 
			
		||||
 | 
			
		||||
    encode
 | 
			
		||||
 | 
			
		||||
    file_server
 | 
			
		||||
    {% elif has_wordpress -%}
 | 
			
		||||
    root * {{ document_root }}
 | 
			
		||||
    encode
 | 
			
		||||
    {%   if ansible_distribution_major_version is version('12', '==') -%}
 | 
			
		||||
    php_fastcgi unix//run/php/php8.2-fpm-{{ domain_name }}.sock
 | 
			
		||||
    {%   endif -%}
 | 
			
		||||
    file_server
 | 
			
		||||
    {% endif -%}
 | 
			
		||||
 | 
			
		||||
    import security-headers
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +1,17 @@
 | 
			
		||||
---
 | 
			
		||||
#file - roles/common/defaults/main.yml
 | 
			
		||||
 | 
			
		||||
# add a dummy API key for AbuseIPDB.com (override with real one in host_vars)
 | 
			
		||||
abuseipdb_api_key: dummy
 | 
			
		||||
fail2ban_maxretry: 6
 | 
			
		||||
# 1 hour in seconds
 | 
			
		||||
fail2ban_findtime: 3600
 | 
			
		||||
# 2 weeks in seconds
 | 
			
		||||
fail2ban_bantime: 1209600
 | 
			
		||||
fail2ban_ignoreip: 127.0.0.1/8,172.26.0.0/16,192.168.5.0/24
 | 
			
		||||
fail2ban_ignoreip: 127.0.0.0/8
 | 
			
		||||
 | 
			
		||||
# Disable SSH passwords. Must use SSH keys. This is OK because we add the keys
 | 
			
		||||
# before re-configuring the SSH daemon to disable passwords.
 | 
			
		||||
ssh_password_authentication: disabled
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
[Journal]
 | 
			
		||||
Storage=persistent
 | 
			
		||||
							
								
								
									
										5
									
								
								roles/common/files/abusech-ipv4.nft
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								roles/common/files/abusech-ipv4.nft
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
#!/usr/sbin/nft -f
 | 
			
		||||
 | 
			
		||||
define ABUSECH_IPV4 = {
 | 
			
		||||
192.168.254.254
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,11 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<ipset type="hash:ip">
 | 
			
		||||
  <option name="family" value="inet6" />
 | 
			
		||||
  <short>abusers-ipv6</short>
 | 
			
		||||
  <description>A list of abusive IPv6 addresses.</description>
 | 
			
		||||
  <entry>2001:41d0:a:3307::</entry>
 | 
			
		||||
  <entry>2402:1f00:8001:8bd::</entry>
 | 
			
		||||
  <entry>2604:a880:800:10::5bf:2001</entry>
 | 
			
		||||
  <entry>2607:5300:120:878::</entry>
 | 
			
		||||
  <entry>2a03:b0c0:3:d0::d4d:b001</entry>
 | 
			
		||||
</ipset>
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
autoclean -y
 | 
			
		||||
upgrade -y -o APT::Get::Show-Upgraded=true
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
# Configuration for cron-apt. For further information about the possible
 | 
			
		||||
# configuration settings see the README file.
 | 
			
		||||
 | 
			
		||||
MAILON="never"
 | 
			
		||||
OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list -o Dir::Etc::SourceParts=\"/dev/null\""
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
provisioning   ALL=(ALL)  ALL
 | 
			
		||||
							
								
								
									
										5
									
								
								roles/common/files/firehol_level1-ipv4.nft
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								roles/common/files/firehol_level1-ipv4.nft
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
#!/usr/sbin/nft -f
 | 
			
		||||
 | 
			
		||||
define FIREHOL_LEVEL1_IPV4 = {
 | 
			
		||||
192.168.254.254/32
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHmRO6E0G4Ls3TifVfJ+mQjlfWiBZNJfsSXGhwQ/HA1M aorth@balozi
 | 
			
		||||
							
								
								
									
										24
									
								
								roles/common/files/update-firehol-nftables.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								roles/common/files/update-firehol-nftables.service
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Update FireHOL lists
 | 
			
		||||
# Make sure the network is up
 | 
			
		||||
After=network-online.target
 | 
			
		||||
Wants=network-online.target update-firehol-nftables.timer
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
# https://www.ctrl.blog/entry/systemd-service-hardening.html
 | 
			
		||||
# Doesn't need access to /home or /root
 | 
			
		||||
ProtectHome=true
 | 
			
		||||
# Possibly only works on Ubuntu 18.04+
 | 
			
		||||
ProtectKernelTunables=true
 | 
			
		||||
ProtectSystem=full
 | 
			
		||||
# Newer systemd can use ReadWritePaths to list files, but this works everywhere
 | 
			
		||||
ReadWriteDirectories=/etc/nftables
 | 
			
		||||
PrivateTmp=true
 | 
			
		||||
WorkingDirectory=/var/tmp
 | 
			
		||||
 | 
			
		||||
SyslogIdentifier=update-firehol-nftables
 | 
			
		||||
ExecStart=/usr/bin/flock -x update-firehol-nftables.lck \
 | 
			
		||||
          /usr/local/bin/update-firehol-nftables.sh
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
							
								
								
									
										12
									
								
								roles/common/files/update-firehol-nftables.timer
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								roles/common/files/update-firehol-nftables.timer
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Update FireHOL lists
 | 
			
		||||
 | 
			
		||||
[Timer]
 | 
			
		||||
# Once a day at midnight
 | 
			
		||||
OnCalendar=*-*-* 00:00:00
 | 
			
		||||
# Add a random delay of 0–3600 seconds
 | 
			
		||||
RandomizedDelaySec=3600
 | 
			
		||||
Persistent=true
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=timers.target
 | 
			
		||||
@@ -1,17 +1,27 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/common/handlers/main.yml
 | 
			
		||||
# ansible.builtin.file: roles/common/handlers/main.yml
 | 
			
		||||
 | 
			
		||||
- name: reload sshd
 | 
			
		||||
  systemd: name={{ sshd_service_name }} state=reloaded
 | 
			
		||||
- name: Reload sshd
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: "{{ sshd_service_name }}"
 | 
			
		||||
    state: reloaded
 | 
			
		||||
 | 
			
		||||
- name: reload sysctl
 | 
			
		||||
  command: sysctl -p /etc/sysctl.conf
 | 
			
		||||
- name: Reload sysctl
 | 
			
		||||
  ansible.builtin.command: sysctl -p /etc/sysctl.conf
 | 
			
		||||
 | 
			
		||||
- name: restart firewalld
 | 
			
		||||
  systemd: name=firewalld state=restarted
 | 
			
		||||
- name: Reload systemd
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    daemon_reload: true
 | 
			
		||||
 | 
			
		||||
- name: restart fail2ban
 | 
			
		||||
  systemd: name=fail2ban state=restarted
 | 
			
		||||
- name: Restart nftables
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: nftables
 | 
			
		||||
    state: restarted
 | 
			
		||||
 | 
			
		||||
- name: reload systemd
 | 
			
		||||
  systemd: daemon_reload=yes
 | 
			
		||||
# 2021-09-28: note to self to keep fail2ban at the end, as handlers are executed
 | 
			
		||||
# in the order they are defined, not in the order they are listed in the task's
 | 
			
		||||
# notify statement and we must restart fail2ban after updating the firewall.
 | 
			
		||||
- name: Restart fail2ban
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: fail2ban
 | 
			
		||||
    state: restarted
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,17 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Remove cron-apt
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: cron-apt
 | 
			
		||||
    state: absent
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
 | 
			
		||||
- name: Configure cron-apt (config)
 | 
			
		||||
  copy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }} owner={{ item.owner }} group={{ item.group }}
 | 
			
		||||
- name: Remove cron-apt configs
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: "{{ item }}"
 | 
			
		||||
    state: absent
 | 
			
		||||
  loop:
 | 
			
		||||
    - { src: 'etc/cron-apt/config', dest: '/etc/cron-apt/config', mode: '0644', owner: 'root', group: 'root' }
 | 
			
		||||
    - { src: 'etc/cron-apt/3-download', dest: '/etc/cron-apt/action.d/3-download', mode: '0644', owner: 'root', group: 'root' }
 | 
			
		||||
 | 
			
		||||
- name: Configure cron-apt (security)
 | 
			
		||||
  template: src=security.sources.list.j2 dest=/etc/apt/security.sources.list mode=0644 owner=root group=root
 | 
			
		||||
    - /etc/cron-apt/config
 | 
			
		||||
    - /etc/cron-apt/action.d/3-download
 | 
			
		||||
    - /etc/apt/security.sources.list
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,55 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Install fail2ban
 | 
			
		||||
  when: ansible_distribution_version is version('11', '>=')
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name:
 | 
			
		||||
      - fail2ban
 | 
			
		||||
      - python3-systemd
 | 
			
		||||
    state: present
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
 | 
			
		||||
- name: Configure fail2ban sshd filter
 | 
			
		||||
  template: src=etc/fail2ban/jail.d/sshd.local.j2 dest=/etc/fail2ban/jail.d/sshd.local owner=root mode=0644
 | 
			
		||||
  notify: restart fail2ban
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/fail2ban/jail.d/sshd.local.j2
 | 
			
		||||
    dest: /etc/fail2ban/jail.d/sshd.local
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  notify: Restart fail2ban
 | 
			
		||||
 | 
			
		||||
- name: Configure fail2ban nginx filter
 | 
			
		||||
  when:
 | 
			
		||||
    - webserver is defined and webserver == 'nginx'
 | 
			
		||||
    - extra_fail2ban_filters is defined
 | 
			
		||||
    - "'nginx' in extra_fail2ban_filters"
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/fail2ban/jail.d/nginx.local.j2
 | 
			
		||||
    dest: /etc/fail2ban/jail.d/nginx.local
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  notify: Restart fail2ban
 | 
			
		||||
 | 
			
		||||
- name: Create fail2ban service override directory
 | 
			
		||||
  file: path=/etc/systemd/system/fail2ban.service.d state=directory owner=root mode=0755
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: /etc/systemd/system/fail2ban.service.d
 | 
			
		||||
    state: directory
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0755"
 | 
			
		||||
 | 
			
		||||
# See Arch Linux's example: https://wiki.archlinux.org/index.php/Fail2ban
 | 
			
		||||
- name: Configure fail2ban service override
 | 
			
		||||
  template: src=etc/systemd/system/fail2ban.service.d/override.conf.j2 dest=/etc/systemd/system/fail2ban.service.d/override.conf owner=root mode=0644
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/systemd/system/fail2ban.service.d/override.conf.j2
 | 
			
		||||
    dest: /etc/systemd/system/fail2ban.service.d/override.conf
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload systemd
 | 
			
		||||
    - restart fail2ban
 | 
			
		||||
    - Reload systemd
 | 
			
		||||
    - Restart fail2ban
 | 
			
		||||
 | 
			
		||||
- name: Start and enable fail2ban service
 | 
			
		||||
  systemd: name=fail2ban state=started enabled=yes
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: fail2ban
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								roles/common/tasks/firewall.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								roles/common/tasks/firewall.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
---
 | 
			
		||||
# Debian 11+ will use nftables directly, with no firewalld.
 | 
			
		||||
 | 
			
		||||
- name: Install Debian firewall packages
 | 
			
		||||
  when: ansible_distribution_version is version('11', '>=')
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: nftables
 | 
			
		||||
    state: present
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
 | 
			
		||||
- name: Remove iptables on newer Debian
 | 
			
		||||
  when: ansible_distribution_version is version('11', '>=')
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    pkg: iptables
 | 
			
		||||
    state: absent
 | 
			
		||||
 | 
			
		||||
- name: Configure nftables
 | 
			
		||||
  when: ansible_distribution_version is version('11', '>=')
 | 
			
		||||
  ansible.builtin.include_tasks: nftables.yml
 | 
			
		||||
 | 
			
		||||
- name: Configure fail2ban
 | 
			
		||||
  when: ansible_distribution_version is version('9', '>=')
 | 
			
		||||
  ansible.builtin.include_tasks: fail2ban.yml
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Set Debian firewall packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      debian_firewall_packages:
 | 
			
		||||
        - firewalld
 | 
			
		||||
        - tidy
 | 
			
		||||
        - fail2ban
 | 
			
		||||
        - python3-systemd # for fail2ban systemd backend
 | 
			
		||||
 | 
			
		||||
  - name: Install firewalld and deps
 | 
			
		||||
    when: ansible_distribution_major_version is version('9', '>=')
 | 
			
		||||
    apt: pkg={{ debian_firewall_packages }} state=present
 | 
			
		||||
 | 
			
		||||
  - name: Use iptables backend in firewalld
 | 
			
		||||
    when: ansible_distribution_major_version is version('10', '>=')
 | 
			
		||||
    lineinfile:
 | 
			
		||||
      dest: /etc/firewalld/firewalld.conf
 | 
			
		||||
      regexp: '^FirewallBackend=nftables$'
 | 
			
		||||
      line: 'FirewallBackend=iptables'
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
# firewalld seems to have an issue with iptables 1.8.2 when using the nftables
 | 
			
		||||
# backend. Using individual calls seems to work around it.
 | 
			
		||||
# See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=931722
 | 
			
		||||
  - name: Use individual iptables calls
 | 
			
		||||
    when: ansible_distribution_major_version is version('10', '>=')
 | 
			
		||||
    lineinfile:
 | 
			
		||||
      dest: /etc/firewalld/firewalld.conf
 | 
			
		||||
      regexp: '^IndividualCalls=no$'
 | 
			
		||||
      line: 'IndividualCalls=yes'
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
  - name: Copy firewalld public zone file
 | 
			
		||||
    when: ansible_distribution_major_version is version('9', '>=')
 | 
			
		||||
    template: src=public.xml.j2 dest=/etc/firewalld/zones/public.xml owner=root mode=0600
 | 
			
		||||
 | 
			
		||||
  - name: Format public.xml firewalld zone file
 | 
			
		||||
    when: ansible_distribution_major_version is version('9', '>=')
 | 
			
		||||
    command: tidy -xml -iq -m -w 0 /etc/firewalld/zones/public.xml
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
  - name: Copy ipsets of abusive IPs
 | 
			
		||||
    when: ansible_distribution_major_version is version('9', '>=')
 | 
			
		||||
    copy: src={{ item }} dest=/etc/firewalld/ipsets/{{ item }} owner=root group=root mode=0600
 | 
			
		||||
    loop:
 | 
			
		||||
      - abusers-ipv4.xml
 | 
			
		||||
      - abusers-ipv6.xml
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
  - include_tasks: fail2ban.yml
 | 
			
		||||
    when: ansible_distribution_major_version is version('9', '>=')
 | 
			
		||||
  tags: firewall
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,64 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Set Ubuntu firewall packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      ubuntu_firewall_packages:
 | 
			
		||||
        - firewalld
 | 
			
		||||
        - tidy
 | 
			
		||||
        - fail2ban
 | 
			
		||||
        - python3-systemd # for fail2ban systemd backend
 | 
			
		||||
 | 
			
		||||
  - name: Install firewalld and deps
 | 
			
		||||
    when: ansible_distribution_version is version('16.04', '>=')
 | 
			
		||||
    apt: pkg={{ ubuntu_firewall_packages }} state=present
 | 
			
		||||
 | 
			
		||||
  - name: Remove ufw
 | 
			
		||||
    when: ansible_distribution_version is version('16.04', '>=')
 | 
			
		||||
    apt: pkg=ufw state=absent
 | 
			
		||||
 | 
			
		||||
  # I'm not sure why, but you can use firewalld with the nftables backend even
 | 
			
		||||
  # if nftables itself is not installed. In that case the only way to see the
 | 
			
		||||
  # currently active rules is with firewall-cmd. I prefer installing nftables
 | 
			
		||||
  # so that we can have somewhat of a parallel with iptables:
 | 
			
		||||
  #
 | 
			
		||||
  #   nft list ruleset
 | 
			
		||||
  #
 | 
			
		||||
  # See: https://firewalld.org/2018/07/nftables-backend
 | 
			
		||||
  - name: Install nftables
 | 
			
		||||
    when: ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
    apt: pkg=nftables state=present
 | 
			
		||||
 | 
			
		||||
  - name: Use nftables backend in firewalld
 | 
			
		||||
    when: ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
    lineinfile:
 | 
			
		||||
      dest: /etc/firewalld/firewalld.conf
 | 
			
		||||
      regexp: '^FirewallBackend=iptables$'
 | 
			
		||||
      line: 'FirewallBackend=nftables'
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
  - name: Copy firewalld public zone file
 | 
			
		||||
    when: ansible_distribution_version is version('16.04', '>=')
 | 
			
		||||
    template: src=public.xml.j2 dest=/etc/firewalld/zones/public.xml owner=root mode=0600
 | 
			
		||||
 | 
			
		||||
  - name: Format public.xml firewalld zone file
 | 
			
		||||
    when: ansible_distribution_version is version('16.04', '>=')
 | 
			
		||||
    command: tidy -xml -iq -m -w 0 /etc/firewalld/zones/public.xml
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
  - name: Copy ipsets of abusive IPs
 | 
			
		||||
    when: ansible_distribution_version is version('16.04', '>=')
 | 
			
		||||
    copy: src={{ item }} dest=/etc/firewalld/ipsets/{{ item }} owner=root group=root mode=0600
 | 
			
		||||
    loop:
 | 
			
		||||
      - abusers-ipv4.xml
 | 
			
		||||
      - abusers-ipv6.xml
 | 
			
		||||
    notify:
 | 
			
		||||
      - restart firewalld
 | 
			
		||||
 | 
			
		||||
  - include_tasks: fail2ban.yml
 | 
			
		||||
    when: ansible_distribution_version is version('16.04', '>=')
 | 
			
		||||
  tags: firewall
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,54 +1,48 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Import OS-specific variables
 | 
			
		||||
  include_vars: "vars/{{ ansible_distribution }}.yml"
 | 
			
		||||
  ansible.builtin.include_vars: vars/{{ ansible_distribution }}.yml
 | 
			
		||||
  tags: always
 | 
			
		||||
 | 
			
		||||
- name: Configure network time
 | 
			
		||||
  import_tasks: ntp.yml
 | 
			
		||||
  ansible.builtin.import_tasks: ntp.yml
 | 
			
		||||
  tags: ntp
 | 
			
		||||
 | 
			
		||||
- name: Install common packages
 | 
			
		||||
  include_tasks: packages_Debian.yml
 | 
			
		||||
  when: ansible_distribution == 'Debian'
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
- name: Install common packages
 | 
			
		||||
  include_tasks: packages_Ubuntu.yml
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu'
 | 
			
		||||
  ansible.builtin.include_tasks: packages.yml
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
- name: Configure firewall
 | 
			
		||||
  include_tasks: firewall_Debian.yml
 | 
			
		||||
  when: ansible_distribution == 'Debian'
 | 
			
		||||
  tags: firewall
 | 
			
		||||
 | 
			
		||||
- name: Configure firewall
 | 
			
		||||
  include_tasks: firewall_Ubuntu.yml
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu'
 | 
			
		||||
  ansible.builtin.import_tasks: firewall.yml
 | 
			
		||||
  tags: firewall
 | 
			
		||||
 | 
			
		||||
- name: Configure secure shell daemon
 | 
			
		||||
  import_tasks: sshd.yml
 | 
			
		||||
  ansible.builtin.import_tasks: sshd.yml
 | 
			
		||||
  tags: sshd
 | 
			
		||||
 | 
			
		||||
# containers identify as virtualization hosts, which makes this tricky, because we have actual Debian VM hosts!
 | 
			
		||||
- name: Reconfigure /etc/sysctl.conf
 | 
			
		||||
  when: ansible_virtualization_role != 'host'
 | 
			
		||||
  template: src=sysctl_{{ ansible_distribution }}.j2 dest=/etc/sysctl.conf owner=root group=root mode=0644
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: "sysctl_{{ ansible_distribution }}.j2"
 | 
			
		||||
    dest: /etc/sysctl.conf
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload sysctl
 | 
			
		||||
    - Reload sysctl
 | 
			
		||||
  tags: sysctl
 | 
			
		||||
 | 
			
		||||
- name: Reconfigure /etc/rc.local
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('19.04', '<=')
 | 
			
		||||
  template: src=rc.local_Ubuntu.j2 dest=/etc/rc.local owner=root group=root mode=0755
 | 
			
		||||
 | 
			
		||||
- name: Set I/O scheduler
 | 
			
		||||
  template: src=etc/udev/rules.d/60-scheduler.rules.j2 dest=/etc/udev/rules.d/60-scheduler.rules owner=root group=root mode=0644
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/udev/rules.d/60-scheduler.rules.j2
 | 
			
		||||
    dest: /etc/udev/rules.d/60-scheduler.rules
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  tags: udev
 | 
			
		||||
 | 
			
		||||
- name: Copy admin SSH keys
 | 
			
		||||
  import_tasks: ssh-keys.yml
 | 
			
		||||
  ansible.builtin.import_tasks: ssh-keys.yml
 | 
			
		||||
  tags: ssh-keys
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										96
									
								
								roles/common/tasks/nftables.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								roles/common/tasks/nftables.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
			
		||||
---
 | 
			
		||||
# Common nftables tasks for Debian 11 and Debian 12.
 | 
			
		||||
 | 
			
		||||
- name: Copy nftables.conf
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: nftables.conf.j2
 | 
			
		||||
    dest: /etc/nftables.conf
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  notify:
 | 
			
		||||
    - Restart nftables
 | 
			
		||||
    - Restart fail2ban
 | 
			
		||||
 | 
			
		||||
- name: Create /etc/nftables extra config directory
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: /etc/nftables
 | 
			
		||||
    state: directory
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0755"
 | 
			
		||||
 | 
			
		||||
- name: Copy extra nftables configuration files
 | 
			
		||||
  ansible.builtin.copy:
 | 
			
		||||
    src: "{{ item.src }}"
 | 
			
		||||
    dest: /etc/nftables/{{ item.src }}
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    force: "{{ item.force }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    - { src: firehol_level1-ipv4.nft, force: false }
 | 
			
		||||
  notify:
 | 
			
		||||
    - Restart nftables
 | 
			
		||||
    - Restart fail2ban
 | 
			
		||||
 | 
			
		||||
- name: Copy nftables update scripts
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: update-firehol-nftables.sh.j2
 | 
			
		||||
    dest: /usr/local/bin/update-firehol-nftables.sh
 | 
			
		||||
    mode: "0755"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
 | 
			
		||||
- name: Remove deprecated data and scripts
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: "{{ item }}"
 | 
			
		||||
    state: absent
 | 
			
		||||
  loop:
 | 
			
		||||
    - /etc/nftables/spamhaus-ipv4.nft
 | 
			
		||||
    - /etc/nftables/spamhaus-ipv6.nft
 | 
			
		||||
    - /etc/nftables/abuseipdb-ipv4.nft
 | 
			
		||||
    - /etc/nftables/abuseipdb-ipv6.nft
 | 
			
		||||
    - /etc/nftables/abusech-ipv4.nft
 | 
			
		||||
    - /usr/local/bin/update-abusech-nftables.sh
 | 
			
		||||
    - /usr/local/bin/update-spamhaus-nftables.sh
 | 
			
		||||
    - /etc/systemd/system/update-abusech-nftables.service
 | 
			
		||||
    - /etc/systemd/system/update-abusech-nftables.timer
 | 
			
		||||
    - /etc/systemd/system/update-spamhaus-nftables.service
 | 
			
		||||
    - /etc/systemd/system/update-spamhaus-nftables.timer
 | 
			
		||||
    - /usr/local/bin/aggregate-cidr-addresses.pl
 | 
			
		||||
  notify:
 | 
			
		||||
    - Restart nftables
 | 
			
		||||
    - Restart fail2ban
 | 
			
		||||
 | 
			
		||||
- name: Copy nftables systemd units
 | 
			
		||||
  ansible.builtin.copy:
 | 
			
		||||
    src: "{{ item }}"
 | 
			
		||||
    dest: /etc/systemd/system/{{ item }}
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  loop:
 | 
			
		||||
    - update-firehol-nftables.service
 | 
			
		||||
    - update-firehol-nftables.timer
 | 
			
		||||
  register: nftables_systemd_units
 | 
			
		||||
 | 
			
		||||
# need to reload to pick up service/timer/environment changes
 | 
			
		||||
- name: Reload systemd daemon
 | 
			
		||||
  when: nftables_systemd_units is changed
 | 
			
		||||
  ansible.builtin.systemd_service: # noqa no-handler
 | 
			
		||||
    daemon_reload: true
 | 
			
		||||
 | 
			
		||||
- name: Start and enable nftables update timers
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: "{{ item }}"
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
  loop:
 | 
			
		||||
    - update-firehol-nftables.timer
 | 
			
		||||
 | 
			
		||||
- name: Start and enable nftables
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: nftables
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,18 +1,40 @@
 | 
			
		||||
---
 | 
			
		||||
# Hosts running Ubuntu 16.04+ and Debian 9+ use systemd init system and should
 | 
			
		||||
# use timedatectl as a network time client instead of the standalone ntp client.
 | 
			
		||||
# Hosts running Debian 9+ use systemd init system and can use systemd-timesyncd
 | 
			
		||||
# as a network time client instead of the standalone ntp client.
 | 
			
		||||
 | 
			
		||||
- name: Set timezone
 | 
			
		||||
  when: timezone is defined and ansible_service_mgr == 'systemd'
 | 
			
		||||
  command: /usr/bin/timedatectl set-timezone {{ timezone }}
 | 
			
		||||
  when:
 | 
			
		||||
    - timezone is defined
 | 
			
		||||
    - ansible_service_mgr == 'systemd'
 | 
			
		||||
  community.general.timezone:
 | 
			
		||||
    name: "{{ timezone }}"
 | 
			
		||||
  tags: timezone
 | 
			
		||||
 | 
			
		||||
# Apparently some cloud images don't have this installed by default. From what
 | 
			
		||||
# I can see on existing servers, systemd-timesyncd is a standalone package on
 | 
			
		||||
# Debian 11 and Debian 12.
 | 
			
		||||
- name: Install systemd-timesyncd
 | 
			
		||||
  when: ansible_distribution_version is version('11', '>=')
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: systemd-timesyncd
 | 
			
		||||
    state: present
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
 | 
			
		||||
- name: Start and enable systemd's NTP client
 | 
			
		||||
  when: ansible_service_mgr == 'systemd'
 | 
			
		||||
  systemd: name=systemd-timesyncd state=started enabled=yes
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: systemd-timesyncd
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
 | 
			
		||||
- name: Uninstall ntp on modern Ubuntu/Debian
 | 
			
		||||
  apt: name=ntp state=absent update_cache=yes
 | 
			
		||||
  when: ansible_service_mgr == 'systemd'
 | 
			
		||||
# On Debian 12 ntp doesn't conflict with systemd-timesyncd so we should try to
 | 
			
		||||
# remove it to be sure.
 | 
			
		||||
- name: Uninstall ntp on Debian 12
 | 
			
		||||
  when:
 | 
			
		||||
    - ansible_service_mgr == 'systemd'
 | 
			
		||||
    - ansible_distribution_major_version is version('12', '==')
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: ntp
 | 
			
		||||
    state: absent
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								roles/common/tasks/packages.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								roles/common/tasks/packages.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Configure Debian packages
 | 
			
		||||
  tags: packages
 | 
			
		||||
  block:
 | 
			
		||||
    # Scaleway seems to use a weird sources.list format as of Debian 12?
 | 
			
		||||
    - name: Check for weird Debian sources
 | 
			
		||||
      ansible.builtin.stat:
 | 
			
		||||
        path: /etc/apt/sources.list.d/debian.sources
 | 
			
		||||
      register: weird_debian_sources_stat
 | 
			
		||||
 | 
			
		||||
    - name: Configure apt mirror
 | 
			
		||||
      when:
 | 
			
		||||
        - ansible_architecture != 'armv7l'
 | 
			
		||||
        - not weird_debian_sources_stat
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: sources.list.j2
 | 
			
		||||
        dest: /etc/apt/sources.list
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: root
 | 
			
		||||
        mode: "0644"
 | 
			
		||||
 | 
			
		||||
    - name: Set fact for base packages
 | 
			
		||||
      ansible.builtin.set_fact:
 | 
			
		||||
        base_packages:
 | 
			
		||||
          - git
 | 
			
		||||
          - git-lfs
 | 
			
		||||
          - tmux
 | 
			
		||||
          - iotop
 | 
			
		||||
          - htop
 | 
			
		||||
          - strace
 | 
			
		||||
          - safe-rm
 | 
			
		||||
          - debian-goodies
 | 
			
		||||
          - mosh
 | 
			
		||||
          - python3-pycurl # for ansible's apt_repository
 | 
			
		||||
          - vim
 | 
			
		||||
          - unzip
 | 
			
		||||
          - apt-transport-https # for https support in apt
 | 
			
		||||
          - gnupg2
 | 
			
		||||
          - zstd
 | 
			
		||||
          - rsync
 | 
			
		||||
          - lsof
 | 
			
		||||
          - unattended-upgrades
 | 
			
		||||
 | 
			
		||||
    - name: Install base packages
 | 
			
		||||
      ansible.builtin.apt:
 | 
			
		||||
        name: "{{ base_packages }}"
 | 
			
		||||
        state: present
 | 
			
		||||
        cache_valid_time: 3600
 | 
			
		||||
 | 
			
		||||
    - name: Remove cron-apt
 | 
			
		||||
      tags: cron-apt
 | 
			
		||||
      ansible.builtin.import_tasks: cron-apt.yml
 | 
			
		||||
 | 
			
		||||
    - name: Install tarsnap
 | 
			
		||||
      ansible.builtin.import_tasks: tarsnap.yml
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Configure apt mirror
 | 
			
		||||
    template: src=sources.list.j2 dest=/etc/apt/sources.list owner=root group=root mode=0644
 | 
			
		||||
 | 
			
		||||
  - name: Set fact for base packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      base_packages:
 | 
			
		||||
        - git
 | 
			
		||||
        - tmux
 | 
			
		||||
        - iotop
 | 
			
		||||
        - htop
 | 
			
		||||
        - strace
 | 
			
		||||
        - cron-apt
 | 
			
		||||
        - safe-rm
 | 
			
		||||
        - debian-goodies
 | 
			
		||||
        - mosh
 | 
			
		||||
        - python3-pycurl # for ansible's apt_repository
 | 
			
		||||
        - vim
 | 
			
		||||
        - unzip
 | 
			
		||||
        - apt-transport-https # for https support in apt
 | 
			
		||||
        - gnupg2
 | 
			
		||||
        - zstd
 | 
			
		||||
 | 
			
		||||
  - name: Install base packages
 | 
			
		||||
    apt: name={{ base_packages }} state=present update_cache=yes cache_valid_time=3600
 | 
			
		||||
 | 
			
		||||
  - name: Configure cron-apt
 | 
			
		||||
    import_tasks: cron-apt.yml
 | 
			
		||||
    tags: cron-apt
 | 
			
		||||
 | 
			
		||||
  - name: Install tarsnap
 | 
			
		||||
    import_tasks: tarsnap.yml
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,105 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Configure apt mirror
 | 
			
		||||
    template: src=sources.list.j2 dest=/etc/apt/sources.list owner=root group=root mode=0644
 | 
			
		||||
    when: ansible_architecture != 'armv7l'
 | 
			
		||||
 | 
			
		||||
  - name: Upgrade base OS
 | 
			
		||||
    apt: upgrade=dist update_cache=yes cache_valid_time=3600
 | 
			
		||||
 | 
			
		||||
  - name: Set Ubuntu base packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      ubuntu_base_packages:
 | 
			
		||||
      - git
 | 
			
		||||
      - tmux
 | 
			
		||||
      - iotop
 | 
			
		||||
      - htop
 | 
			
		||||
      - strace
 | 
			
		||||
      - cron-apt
 | 
			
		||||
      - safe-rm
 | 
			
		||||
      - debian-goodies
 | 
			
		||||
      - mosh
 | 
			
		||||
      - python-pycurl # for ansible's apt_repository
 | 
			
		||||
      - vim
 | 
			
		||||
      - unzip
 | 
			
		||||
      - apt-transport-https # for https support in apt
 | 
			
		||||
      - zstd
 | 
			
		||||
 | 
			
		||||
  - name: Install base packages
 | 
			
		||||
    apt: pkg={{ ubuntu_base_packages }} state=present update_cache=yes cache_valid_time=3600
 | 
			
		||||
 | 
			
		||||
  # We have to remove snaps one by one in a specific order because some depend
 | 
			
		||||
  # on others. Only after that can we remove the corresponding system packages.
 | 
			
		||||
  - name: Remove lxd snap
 | 
			
		||||
    snap: name=lxd state=absent
 | 
			
		||||
    when: ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
    ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
  - name: Remove core18 snap
 | 
			
		||||
    snap: name=core18 state=absent
 | 
			
		||||
    when: ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
    ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
  - name: Remove snapd snap
 | 
			
		||||
    snap: name=snapd state=absent
 | 
			
		||||
    when: ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
    ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
  - name: Set fact for packages to remove (Ubuntu <= 18.04)
 | 
			
		||||
    set_fact:
 | 
			
		||||
      ubuntu_annoying_packages:
 | 
			
		||||
        - whoopsie # security (CIS 4.1)
 | 
			
		||||
        - apport   # security (CIS 4.1)
 | 
			
		||||
        - command-not-found # annoying
 | 
			
		||||
        - command-not-found-data # annoying
 | 
			
		||||
        - python3-commandnotfound # annoying
 | 
			
		||||
        - snapd # annoying (Ubuntu >= 16.04)
 | 
			
		||||
        - lxd # annoying (Ubuntu >= 16.04)
 | 
			
		||||
        - lxd-client # annoying (Ubuntu >= 16.04)
 | 
			
		||||
        - liblxc1 # annoying (Ubuntu >= 16.04)
 | 
			
		||||
        - lxc-common # annoying (Ubuntu >= 16.04)
 | 
			
		||||
        - lxcfs #annoying (Ubuntu >= 16.04)
 | 
			
		||||
    when: ansible_distribution_version is version('18.04', '<=')
 | 
			
		||||
 | 
			
		||||
  - name: Set fact for packages to remove (Ubuntu 20.04)
 | 
			
		||||
    set_fact:
 | 
			
		||||
      ubuntu_annoying_packages:
 | 
			
		||||
        - whoopsie # security (CIS 4.1)
 | 
			
		||||
        - apport   # security (CIS 4.1)
 | 
			
		||||
        - command-not-found # annoying
 | 
			
		||||
        - command-not-found-data # annoying
 | 
			
		||||
        - python3-commandnotfound # annoying
 | 
			
		||||
        - snapd # annoying (Ubuntu >= 16.04)
 | 
			
		||||
        - lxd-agent-loader # annoying (Ubuntu 20.04)
 | 
			
		||||
    when: ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
 | 
			
		||||
  - name: Remove packages
 | 
			
		||||
    apt: name={{ ubuntu_annoying_packages }} state=absent purge=yes
 | 
			
		||||
 | 
			
		||||
  - name: Disable annoying Canonical spam in MOTD
 | 
			
		||||
    file: path={{ item }} mode=0644 state=absent
 | 
			
		||||
    loop:
 | 
			
		||||
      - /etc/update-motd.d/99-esm # Ubuntu 14.04
 | 
			
		||||
      - /etc/update-motd.d/10-help-text # Ubuntu 14.04+
 | 
			
		||||
      - /etc/update-motd.d/50-motd-news # Ubuntu 18.04+
 | 
			
		||||
      - /etc/update-motd.d/80-esm # Ubuntu 18.04+
 | 
			
		||||
      - /etc/update-motd.d/80-livepatch # Ubuntu 18.04+
 | 
			
		||||
    ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
  - name: Disable annoying Canonical spam in MOTD
 | 
			
		||||
    systemd: name={{ item }} state=stopped enabled=no
 | 
			
		||||
    when: ansible_service_mgr == 'systemd'
 | 
			
		||||
    loop:
 | 
			
		||||
      - motd-news.service
 | 
			
		||||
      - motd-news.timer
 | 
			
		||||
 | 
			
		||||
  - name: Configure cron-apt
 | 
			
		||||
    import_tasks: cron-apt.yml
 | 
			
		||||
    tags: cron-apt
 | 
			
		||||
 | 
			
		||||
  - name: Install tarsnap
 | 
			
		||||
    import_tasks: tarsnap.yml
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
@@ -1,9 +1,11 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Zero .ssh/authorized_keys for provisioning user
 | 
			
		||||
  file: dest={{ provisioning_user.home }}/.ssh/authorized_keys state=absent
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    dest: "{{ provisioning_user.home }}/.ssh/authorized_keys"
 | 
			
		||||
    state: absent
 | 
			
		||||
 | 
			
		||||
- name: Add public keys to authorized_keys
 | 
			
		||||
  authorized_key: { user: '{{ provisioning_user.name }}', key: "{{ lookup('file',item) }}" }
 | 
			
		||||
  ansible.posix.authorized_key: { user: "{{ provisioning_user.name }}", key: "{{ lookup('file', item) }}" }
 | 
			
		||||
  with_fileglob:
 | 
			
		||||
    # use descriptive names for keys, like: aorth-mzito-rsa.pub
 | 
			
		||||
    - ssh-pub-keys/*.pub
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,62 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# SSH configs don't change in Debian minor versions
 | 
			
		||||
# Only override the system sshd configuration on older Debian.
 | 
			
		||||
- name: Reconfigure /etc/ssh/sshd_config
 | 
			
		||||
  template: src=sshd_config_{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.j2 dest=/etc/ssh/sshd_config owner=root group=root mode=0600
 | 
			
		||||
  when: ansible_distribution == 'Debian'
 | 
			
		||||
  notify: reload sshd
 | 
			
		||||
  when: ansible_distribution_version is version('12', '<=')
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: "sshd_config_{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.j2"
 | 
			
		||||
    dest: /etc/ssh/sshd_config
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0600"
 | 
			
		||||
  notify: Reload sshd
 | 
			
		||||
 | 
			
		||||
# Ubuntu is the only distro we have where SSH version is very different from 14.04 -> 14.10,
 | 
			
		||||
# ie with new ciphers supported etc.
 | 
			
		||||
- name: Reconfigure /etc/ssh/sshd_config
 | 
			
		||||
  template: src=sshd_config_{{ ansible_distribution }}-{{ ansible_distribution_version }}.j2 dest=/etc/ssh/sshd_config owner=root group=root mode=0600
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu'
 | 
			
		||||
  notify: reload sshd
 | 
			
		||||
# Newer OpenSSH versions support including extra configuration. The includes
 | 
			
		||||
# happen at the beginning of the file and the first value to be read is used.
 | 
			
		||||
- name: Configure sshd_config.d overrides
 | 
			
		||||
  when: ansible_distribution_version is version('13', '>=')
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: etc/ssh/sshd_config.d/01-{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.conf.j2
 | 
			
		||||
    dest: /etc/ssh/sshd_config.d/01-custom.conf
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0600"
 | 
			
		||||
  notify: Reload sshd
 | 
			
		||||
 | 
			
		||||
# See: WeakDH (2015): https://weakdh.org/sysadmin.html
 | 
			
		||||
- name: Remove small Diffie-Hellman SSH moduli
 | 
			
		||||
  block:
 | 
			
		||||
    - name: Check unsafe Diffie-Hellman SSH moduli
 | 
			
		||||
      ansible.builtin.shell:
 | 
			
		||||
        cmd: awk '$5 < 3071' moduli
 | 
			
		||||
        chdir: /etc/ssh
 | 
			
		||||
        creates: moduli.safe
 | 
			
		||||
      register: check_unsafe_moduli
 | 
			
		||||
 | 
			
		||||
    - name: Extract safe Diffie-Hellman SSH moduli
 | 
			
		||||
      when: check_unsafe_moduli.stdout | length > 0
 | 
			
		||||
      ansible.builtin.shell:
 | 
			
		||||
        cmd: awk '$5 >= 3071' moduli > moduli.safe
 | 
			
		||||
        chdir: /etc/ssh
 | 
			
		||||
        creates: moduli.safe
 | 
			
		||||
      register: extract_safe_moduli
 | 
			
		||||
 | 
			
		||||
    - name: Replace unsafe Diffie-Hellman SSH moduli
 | 
			
		||||
      when: extract_safe_moduli is changed
 | 
			
		||||
      ansible.builtin.command:
 | 
			
		||||
        cmd: mv moduli.safe moduli
 | 
			
		||||
        chdir: /etc/ssh
 | 
			
		||||
      register: replace_small_moduli
 | 
			
		||||
      notify: Reload sshd
 | 
			
		||||
 | 
			
		||||
- name: Remove DSA and ECDSA host keys
 | 
			
		||||
  file: name=/etc/ssh/{{ item }} state=absent
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    name: "/etc/ssh/{{ item }}"
 | 
			
		||||
    state: absent
 | 
			
		||||
  loop:
 | 
			
		||||
    - ssh_host_dsa_key
 | 
			
		||||
    - ssh_host_dsa_key.pub
 | 
			
		||||
    - ssh_host_ecdsa_key
 | 
			
		||||
    - ssh_host_ecdsa_key.pub
 | 
			
		||||
  notify: reload sshd
 | 
			
		||||
  notify: Reload sshd
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,45 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Add Tarsnap apt mirror
 | 
			
		||||
  template: src=tarsnap_sources.list.j2 dest=/etc/apt/sources.list.d/tarsnap.list owner=root group=root mode=0644
 | 
			
		||||
  register: add_tarsnap_apt_repository
 | 
			
		||||
  when: ansible_architecture != 'armv7l'
 | 
			
		||||
- name: Check tarsnap apt signing key
 | 
			
		||||
  ansible.builtin.stat:
 | 
			
		||||
    path: /etc/apt/keyrings/tarsnap-deb-packaging-key.asc
 | 
			
		||||
  register: tarsnap_signing_key_stat
 | 
			
		||||
 | 
			
		||||
- name: Add GPG key for Tarsnap
 | 
			
		||||
  apt_key: id=0xFC72A10BF6B692AA url=https://pkg.tarsnap.com/tarsnap-deb-packaging-key.asc state=present
 | 
			
		||||
  register: add_tarsnap_apt_key
 | 
			
		||||
- name: Download tarsnap apt signing key
 | 
			
		||||
  when: not tarsnap_signing_key_stat.stat.exists
 | 
			
		||||
  ansible.builtin.get_url:
 | 
			
		||||
    url: https://pkg.tarsnap.com/tarsnap-deb-packaging-key.asc
 | 
			
		||||
    dest: /etc/apt/keyrings/tarsnap-deb-packaging-key.asc
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  register: download_tarsnap_signing_key
 | 
			
		||||
 | 
			
		||||
- name: Add tarsnap.org repo
 | 
			
		||||
  when: ansible_architecture != 'armv7l'
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: tarsnap_sources.list.j2
 | 
			
		||||
    dest: /etc/apt/sources.list.d/tarsnap.list
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  register: add_tarsnap_apt_repository
 | 
			
		||||
 | 
			
		||||
- name: Update apt cache
 | 
			
		||||
  apt:
 | 
			
		||||
    update_cache: yes
 | 
			
		||||
  when:
 | 
			
		||||
    add_tarsnap_apt_key is changed or
 | 
			
		||||
    add_tarsnap_apt_repository is changed
 | 
			
		||||
  when: (download_tarsnap_signing_key.status_code is defined and download_tarsnap_signing_key.status_code == 200) or add_tarsnap_apt_repository is changed
 | 
			
		||||
  ansible.builtin.apt: # noqa no-handler
 | 
			
		||||
    update_cache: true
 | 
			
		||||
 | 
			
		||||
- name: Install tarsnap
 | 
			
		||||
  apt: pkg=tarsnap cache_valid_time=3600
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    pkg: tarsnap
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
 | 
			
		||||
- name: Copy tarsnaprc
 | 
			
		||||
  copy: src=tarsnaprc dest=/root/.tarsnaprc owner=root group=root mode=0600
 | 
			
		||||
  ansible.builtin.copy:
 | 
			
		||||
    src: tarsnaprc
 | 
			
		||||
    dest: /root/.tarsnaprc
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0600"
 | 
			
		||||
 | 
			
		||||
# vim: set sw=2 ts=2:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								roles/common/templates/etc/fail2ban/jail.d/nginx.local.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								roles/common/templates/etc/fail2ban/jail.d/nginx.local.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
[nginx]
 | 
			
		||||
enabled   = true
 | 
			
		||||
# See: /etc/fail2ban/filter.d/nginx-botsearch.conf
 | 
			
		||||
filter    = nginx-botsearch
 | 
			
		||||
# Integrate with nftables
 | 
			
		||||
banaction=nftables[type=allports]
 | 
			
		||||
backend   = pyinotify
 | 
			
		||||
logpath   = /var/log/nginx/*-access.log
 | 
			
		||||
# Try to find a non-existent wp-login.php once and get banned. Tough luck.
 | 
			
		||||
maxretry  = 1
 | 
			
		||||
findtime  = {{ fail2ban_findtime }}
 | 
			
		||||
bantime   = {{ fail2ban_bantime }}
 | 
			
		||||
ignoreip  = {{ fail2ban_ignoreip }}
 | 
			
		||||
@@ -2,8 +2,8 @@
 | 
			
		||||
enabled   = true
 | 
			
		||||
# See: /etc/fail2ban/filter.d/sshd.conf
 | 
			
		||||
filter    = sshd
 | 
			
		||||
# Integrate with firewalld and ipsets
 | 
			
		||||
banaction = firewallcmd-ipset
 | 
			
		||||
# Integrate with nftables
 | 
			
		||||
banaction=nftables[type=allports]
 | 
			
		||||
backend   = systemd
 | 
			
		||||
maxretry  = {{ fail2ban_maxretry }}
 | 
			
		||||
findtime  = {{ fail2ban_findtime }}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
{{ ansible_managed | comment }}
 | 
			
		||||
 | 
			
		||||
HostKey /etc/ssh/ssh_host_ed25519_key
 | 
			
		||||
 | 
			
		||||
# LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear
 | 
			
		||||
# audit track of which key was using to log in.
 | 
			
		||||
LogLevel VERBOSE
 | 
			
		||||
 | 
			
		||||
MaxAuthTries 4
 | 
			
		||||
 | 
			
		||||
AuthorizedKeysFile	.ssh/authorized_keys
 | 
			
		||||
 | 
			
		||||
# To disable tunneled clear text passwords, change to no here!
 | 
			
		||||
{% if ssh_password_authentication == 'disabled' %}
 | 
			
		||||
PasswordAuthentication no
 | 
			
		||||
{% else %}
 | 
			
		||||
PasswordAuthentication yes
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
X11Forwarding no
 | 
			
		||||
 | 
			
		||||
# Based on the ssh-audit profile for Debian 13, but with but with all algos with
 | 
			
		||||
# less than 256 bits removed, as NSA's Suite B removed them years ago and the
 | 
			
		||||
# new (2018) CNSA suite is 256 bits and up.
 | 
			
		||||
#
 | 
			
		||||
# See: ssh-audit.py -P "Hardened Debian 13 (version 1)"
 | 
			
		||||
# See: https://en.wikipedia.org/wiki/Commercial_National_Security_Algorithm_Suite
 | 
			
		||||
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
 | 
			
		||||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
 | 
			
		||||
KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com
 | 
			
		||||
 | 
			
		||||
{% if ssh_allowed_users is defined and ssh_allowed_users %}
 | 
			
		||||
AllowUsers {{ ssh_allowed_users|join(" ") }} {{ provisioning_user.name }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
PerSourcePenaltyExemptList {{ fail2ban_ignoreip | replace(" ", ",") }}
 | 
			
		||||
 | 
			
		||||
# Mask to use for IPv4 and IPv6 respectively when applying network penalties.
 | 
			
		||||
# The default is 32:128.
 | 
			
		||||
PerSourceNetBlockSize 24:56
 | 
			
		||||
@@ -1,15 +1,19 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
# If nftables is stopped or restarted, propagate to fail2ban as well
 | 
			
		||||
PartOf=nftables.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
PrivateDevices=yes
 | 
			
		||||
PrivateTmp=yes
 | 
			
		||||
ProtectHome=read-only
 | 
			
		||||
{% if ansible_distribution == 'Ubuntu' and ansible_distribution_major_version is version('18','>=') %}
 | 
			
		||||
{% if ansible_distribution_version is version('11','>=') %}
 | 
			
		||||
ProtectSystem=strict
 | 
			
		||||
{% else %}
 | 
			
		||||
{# Older systemd versions don't have ProtectSystem=strict #}
 | 
			
		||||
ProtectSystem=full
 | 
			
		||||
{% endif %}
 | 
			
		||||
NoNewPrivileges=yes
 | 
			
		||||
{% if ansible_distribution == 'Ubuntu' and ansible_distribution_major_version is version('18','>=') %}
 | 
			
		||||
{% if ansible_distribution_version is version('11','>=') %}
 | 
			
		||||
ReadWritePaths=-/var/run/fail2ban
 | 
			
		||||
ReadWritePaths=-/var/lib/fail2ban
 | 
			
		||||
ReadWritePaths=-/var/log/fail2ban.log
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								roles/common/templates/nftables.conf.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								roles/common/templates/nftables.conf.j2
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
#!/usr/sbin/nft -f
 | 
			
		||||
#
 | 
			
		||||
# Initially based on: https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
flush ruleset
 | 
			
		||||
 | 
			
		||||
# List updated daily by update-firehol-nftables.sh
 | 
			
		||||
include "/etc/nftables/firehol_level1-ipv4.nft"
 | 
			
		||||
 | 
			
		||||
# Notes:
 | 
			
		||||
#   - tables hold chains, chains hold rules
 | 
			
		||||
#   - inet is for both ipv4 and ipv6
 | 
			
		||||
table inet filter {
 | 
			
		||||
    set firehol_level1-ipv4 {
 | 
			
		||||
        type ipv4_addr
 | 
			
		||||
        # if the set contains prefixes we need to use the interval flag
 | 
			
		||||
        flags interval
 | 
			
		||||
        elements = $FIREHOL_LEVEL1_IPV4
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    chain input {
 | 
			
		||||
        type filter hook input priority 0;
 | 
			
		||||
 | 
			
		||||
        ct state {established, related} accept comment "Allow traffic from established and related packets"
 | 
			
		||||
 | 
			
		||||
        ct state invalid counter drop comment "Early drop of invalid connections"
 | 
			
		||||
 | 
			
		||||
        ip saddr @firehol_level1-ipv4 counter drop comment "Early drop of incoming packets matching firehol_level1-ipv4 list"
 | 
			
		||||
 | 
			
		||||
        iifname lo accept comment "Allow from loopback"
 | 
			
		||||
 | 
			
		||||
        ip protocol icmp limit rate 4/second accept comment "Allow ICMP"
 | 
			
		||||
        ip6 nexthdr ipv6-icmp limit rate 4/second accept comment "Allow IPv6 ICMP"
 | 
			
		||||
        ip protocol igmp limit rate 4/second accept comment "Allow IGMP"
 | 
			
		||||
 | 
			
		||||
        {# SSH rules #}
 | 
			
		||||
        ip saddr 0.0.0.0/0 ct state new tcp dport 22 counter accept comment "Allow SSH"
 | 
			
		||||
        ip6 saddr ::/0 ct state new tcp dport 22 counter accept comment "Allow SSH"
 | 
			
		||||
 | 
			
		||||
        {# Web rules #}
 | 
			
		||||
        {% if 'web' in group_names %}
 | 
			
		||||
        ip saddr 0.0.0.0/0 ct state new tcp dport 80 counter accept comment "Allow HTTP"
 | 
			
		||||
        ip saddr 0.0.0.0/0 ct state new tcp dport 443 counter accept comment "Allow HTTPS"
 | 
			
		||||
        ip6 saddr ::/0 ct state new tcp dport 80 counter accept comment "Allow HTTP"
 | 
			
		||||
        ip6 saddr ::/0 ct state new tcp dport 443 counter accept comment "Allow HTTPS"
 | 
			
		||||
        {% endif %}
 | 
			
		||||
 | 
			
		||||
        ip saddr 0.0.0.0/0 ct state new udp dport 60001-60003 counter accept comment "Allow mosh"
 | 
			
		||||
        ip6 saddr ::/0 ct state new udp dport 60001-60003 counter accept comment "Allow mosh"
 | 
			
		||||
 | 
			
		||||
        {# Extra rules #}
 | 
			
		||||
        {% if extra_iptables_rules is defined %}
 | 
			
		||||
        {% for rule in extra_iptables_rules %}
 | 
			
		||||
        ip saddr {{ ghetto_ipsets[rule.acl].src }} ct state new {{ rule.protocol }} dport {{ rule.port }} counter accept
 | 
			
		||||
 | 
			
		||||
        {% if ghetto_ipsets[rule.acl].ipv6src is defined %}
 | 
			
		||||
        ip6 saddr {{ ghetto_ipsets[rule.acl].ipv6src }} ct state new {{ rule.protocol }} dport {{ rule.port }} counter accept
 | 
			
		||||
        {% endif %}
 | 
			
		||||
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
 | 
			
		||||
        # everything else
 | 
			
		||||
        reject with icmpx type port-unreachable
 | 
			
		||||
    }
 | 
			
		||||
    chain forward {
 | 
			
		||||
        type filter hook forward priority 0;
 | 
			
		||||
    }
 | 
			
		||||
    chain output {
 | 
			
		||||
        type filter hook output priority 0;
 | 
			
		||||
 | 
			
		||||
        ip daddr @firehol_level1-ipv4 counter drop comment "Drop outgoing packets matching firehol_level1-ipv4 list"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
<zone>
 | 
			
		||||
    <short>Public</short>
 | 
			
		||||
    <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
 | 
			
		||||
    <interface name="{{ ansible_default_ipv4.interface }}"/>
 | 
			
		||||
 | 
			
		||||
    {# ssh rules #}
 | 
			
		||||
    <rule family="ipv4">
 | 
			
		||||
        <source address="0.0.0.0/0"/>
 | 
			
		||||
        <port protocol="tcp" port="22"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
 | 
			
		||||
    {# ipv6 ssh rules #}
 | 
			
		||||
    <rule family="ipv6">
 | 
			
		||||
        <source address="::/0"/>
 | 
			
		||||
        <port protocol="tcp" port="22"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
 | 
			
		||||
    {# web rules #}
 | 
			
		||||
    <rule family="ipv4">
 | 
			
		||||
        <source address="0.0.0.0/0"/>
 | 
			
		||||
        <port protocol="tcp" port="80"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
 | 
			
		||||
    {# ipv6 web rules #}
 | 
			
		||||
    <rule family="ipv6">
 | 
			
		||||
        <source address="::/0"/>
 | 
			
		||||
        <port protocol="tcp" port="80"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
 | 
			
		||||
    {# munin rules #}
 | 
			
		||||
    {% if munin_master_host is defined %}
 | 
			
		||||
    <rule family="ipv4">
 | 
			
		||||
        <source address="{{ ghetto_ipsets[munin_master_host].src }}"/>
 | 
			
		||||
        <port protocol="tcp" port="{{ munin_node_port }}"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    {# extra rules #}
 | 
			
		||||
    {% if extra_iptables_rules is defined %}
 | 
			
		||||
    {% for rule in extra_iptables_rules %}
 | 
			
		||||
    <rule family="ipv4">
 | 
			
		||||
        <source address="{{ ghetto_ipsets[rule.acl].src }}"/>
 | 
			
		||||
        <port protocol="{{ rule.protocol }}" port="{{ rule.port }}"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
 | 
			
		||||
    {# ipv6 extra rules #}
 | 
			
		||||
    {% if ghetto_ipsets[rule.acl].ipv6src is defined %}
 | 
			
		||||
    <rule family="ipv6">
 | 
			
		||||
        <source address="{{ ghetto_ipsets[rule.acl].ipv6src }}"/>
 | 
			
		||||
        <port protocol="{{ rule.protocol }}" port="{{ rule.port }}"/>
 | 
			
		||||
        <accept/>
 | 
			
		||||
    </rule>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    <rule>
 | 
			
		||||
      <source ipset="abusers-ipv4"/>
 | 
			
		||||
      <drop/>
 | 
			
		||||
    </rule>
 | 
			
		||||
    <rule>
 | 
			
		||||
      <source ipset="abusers-ipv6"/>
 | 
			
		||||
      <drop/>
 | 
			
		||||
    </rule>
 | 
			
		||||
</zone>
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
#
 | 
			
		||||
# rc.local
 | 
			
		||||
#
 | 
			
		||||
# This script is executed at the end of each multiuser runlevel.
 | 
			
		||||
# Make sure that the script will "exit 0" on success or any other
 | 
			
		||||
# value on error.
 | 
			
		||||
#
 | 
			
		||||
# In order to enable or disable this script just change the execution
 | 
			
		||||
# bits.
 | 
			
		||||
#
 | 
			
		||||
# By default this script does nothing.
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
{% if ansible_distribution == 'Ubuntu' %}
 | 
			
		||||
deb http://security.ubuntu.com/ubuntu {{ ansible_distribution_release }}-security main restricted universe multiverse
 | 
			
		||||
{% elif ansible_distribution == 'Debian' %}
 | 
			
		||||
deb http://security.debian.org/debian-security {{ ansible_distribution_release }}/updates main contrib non-free
 | 
			
		||||
{% endif %}
 | 
			
		||||
@@ -1,16 +1,6 @@
 | 
			
		||||
{% if ansible_distribution == 'Ubuntu' %}
 | 
			
		||||
{% set apt_mirror    = apt_mirror | default("ubuntu.mirror.ac.ke") %}
 | 
			
		||||
 | 
			
		||||
deb http://{{ apt_mirror }}/ubuntu/ {{ ansible_distribution_release }} main restricted universe multiverse
 | 
			
		||||
deb http://{{ apt_mirror }}/ubuntu/ {{ ansible_distribution_release }}-updates main restricted universe multiverse
 | 
			
		||||
deb http://security.ubuntu.com/ubuntu/ {{ ansible_distribution_release }}-security main restricted universe multiverse
 | 
			
		||||
 | 
			
		||||
{% else %}
 | 
			
		||||
{% set apt_mirror    = apt_mirror | default('deb.debian.org') %}
 | 
			
		||||
deb http://{{ apt_mirror }}/debian/ {{ ansible_distribution_release }} main contrib non-free
 | 
			
		||||
 | 
			
		||||
deb http://security.debian.org/debian-security {{ ansible_distribution_release }}/updates main contrib non-free
 | 
			
		||||
deb http://security.debian.org/debian-security {{ ansible_distribution_release }}-security main contrib non-free
 | 
			
		||||
 | 
			
		||||
deb http://{{ apt_mirror }}/debian/ {{ ansible_distribution_release }}-updates main contrib non-free
 | 
			
		||||
 | 
			
		||||
{% endif %} {# ansible_distribution #}
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,11 @@ AuthorizedKeysFile	.ssh/authorized_keys
 | 
			
		||||
#IgnoreRhosts yes
 | 
			
		||||
 | 
			
		||||
# To disable tunneled clear text passwords, change to no here!
 | 
			
		||||
#PasswordAuthentication yes
 | 
			
		||||
{% if ssh_password_authentication == 'disabled' %}
 | 
			
		||||
PasswordAuthentication no
 | 
			
		||||
{% else %}
 | 
			
		||||
PasswordAuthentication yes
 | 
			
		||||
{% endif %}
 | 
			
		||||
#PermitEmptyPasswords no
 | 
			
		||||
 | 
			
		||||
# Change to yes to enable challenge-response passwords (beware issues with
 | 
			
		||||
@@ -114,7 +118,7 @@ PrintMotd no
 | 
			
		||||
AcceptEnv LANG LC_*
 | 
			
		||||
 | 
			
		||||
# override default of no subsystems
 | 
			
		||||
Subsystem sftp	/usr/lib/openssh/sftp-server
 | 
			
		||||
Subsystem	sftp	/usr/lib/openssh/sftp-server
 | 
			
		||||
 | 
			
		||||
# Example of overriding settings on a per-user basis
 | 
			
		||||
#Match User anoncvs
 | 
			
		||||
@@ -122,14 +126,16 @@ Subsystem sftp	/usr/lib/openssh/sftp-server
 | 
			
		||||
#	AllowTcpForwarding no
 | 
			
		||||
#	PermitTTY no
 | 
			
		||||
#	ForceCommand cvs server
 | 
			
		||||
PasswordAuthentication yes
 | 
			
		||||
 | 
			
		||||
# Originally from: https://stribika.github.io/2015/01/04/secure-secure-shell.html
 | 
			
		||||
# ... but with ciphers and MACs with < 256 bits removed, as NSA's Suite B now
 | 
			
		||||
# does away with these! See: https://www.nsa.gov/ia/programs/suiteb_cryptography/index.shtml
 | 
			
		||||
# Based on the ssh-audit profile for OpenSSH 8.4, but with but with all algos
 | 
			
		||||
# with less than 256 bits removed, as NSA's Suite B removed them years ago and
 | 
			
		||||
# the new (2018) CNSA suite is 256 bits and up.
 | 
			
		||||
#
 | 
			
		||||
# See: https://github.com/jtesta/ssh-audit/blob/master/src/ssh_audit/policy.py
 | 
			
		||||
# See: https://en.wikipedia.org/wiki/Commercial_National_Security_Algorithm_Suite
 | 
			
		||||
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
 | 
			
		||||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
 | 
			
		||||
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
 | 
			
		||||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
 | 
			
		||||
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256
 | 
			
		||||
 | 
			
		||||
{% if ssh_allowed_users is defined and ssh_allowed_users %}
 | 
			
		||||
# Is there a list of allowed users?
 | 
			
		||||
@@ -1,21 +1,23 @@
 | 
			
		||||
#	$OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $
 | 
			
		||||
 | 
			
		||||
# This is the sshd server system-wide configuration file.  See
 | 
			
		||||
# sshd_config(5) for more information.
 | 
			
		||||
 | 
			
		||||
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
 | 
			
		||||
# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
 | 
			
		||||
 | 
			
		||||
# The strategy used for options in the default sshd_config shipped with
 | 
			
		||||
# OpenSSH is to specify options with their default value where
 | 
			
		||||
# possible, but leave them commented.  Uncommented options override the
 | 
			
		||||
# default value.
 | 
			
		||||
 | 
			
		||||
Include /etc/ssh/sshd_config.d/*.conf
 | 
			
		||||
 | 
			
		||||
#Port 22
 | 
			
		||||
#AddressFamily any
 | 
			
		||||
#ListenAddress 0.0.0.0
 | 
			
		||||
#ListenAddress ::
 | 
			
		||||
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_rsa_key
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_ecdsa_key
 | 
			
		||||
HostKey /etc/ssh/ssh_host_ed25519_key
 | 
			
		||||
 | 
			
		||||
# Ciphers and keying
 | 
			
		||||
@@ -54,12 +56,16 @@ AuthorizedKeysFile	.ssh/authorized_keys
 | 
			
		||||
#IgnoreRhosts yes
 | 
			
		||||
 | 
			
		||||
# To disable tunneled clear text passwords, change to no here!
 | 
			
		||||
#PasswordAuthentication yes
 | 
			
		||||
{% if ssh_password_authentication == 'disabled' %}
 | 
			
		||||
PasswordAuthentication no
 | 
			
		||||
{% else %}
 | 
			
		||||
PasswordAuthentication yes
 | 
			
		||||
{% endif %}
 | 
			
		||||
#PermitEmptyPasswords no
 | 
			
		||||
 | 
			
		||||
# Change to yes to enable challenge-response passwords (beware issues with
 | 
			
		||||
# some PAM modules and threads)
 | 
			
		||||
ChallengeResponseAuthentication no
 | 
			
		||||
KbdInteractiveAuthentication no
 | 
			
		||||
 | 
			
		||||
# Kerberos options
 | 
			
		||||
#KerberosAuthentication no
 | 
			
		||||
@@ -75,13 +81,13 @@ ChallengeResponseAuthentication no
 | 
			
		||||
 | 
			
		||||
# Set this to 'yes' to enable PAM authentication, account processing,
 | 
			
		||||
# and session processing. If this is enabled, PAM authentication will
 | 
			
		||||
# be allowed through the ChallengeResponseAuthentication and
 | 
			
		||||
# be allowed through the KbdInteractiveAuthentication and
 | 
			
		||||
# PasswordAuthentication.  Depending on your PAM configuration,
 | 
			
		||||
# PAM authentication via ChallengeResponseAuthentication may bypass
 | 
			
		||||
# the setting of "PermitRootLogin without-password".
 | 
			
		||||
# PAM authentication via KbdInteractiveAuthentication may bypass
 | 
			
		||||
# the setting of "PermitRootLogin prohibit-password".
 | 
			
		||||
# If you just want the PAM account and session checks to run without
 | 
			
		||||
# PAM authentication, then enable this but set PasswordAuthentication
 | 
			
		||||
# and ChallengeResponseAuthentication to 'no'.
 | 
			
		||||
# and KbdInteractiveAuthentication to 'no'.
 | 
			
		||||
UsePAM yes
 | 
			
		||||
 | 
			
		||||
#AllowAgentForwarding yes
 | 
			
		||||
@@ -94,13 +100,12 @@ X11Forwarding no
 | 
			
		||||
PrintMotd no
 | 
			
		||||
#PrintLastLog yes
 | 
			
		||||
#TCPKeepAlive yes
 | 
			
		||||
#UseLogin no
 | 
			
		||||
#PermitUserEnvironment no
 | 
			
		||||
#Compression delayed
 | 
			
		||||
#ClientAliveInterval 0
 | 
			
		||||
#ClientAliveCountMax 3
 | 
			
		||||
#UseDNS no
 | 
			
		||||
#PidFile /var/run/sshd.pid
 | 
			
		||||
#PidFile /run/sshd.pid
 | 
			
		||||
#MaxStartups 10:30:100
 | 
			
		||||
#PermitTunnel no
 | 
			
		||||
#ChrootDirectory none
 | 
			
		||||
@@ -122,12 +127,20 @@ Subsystem	sftp	/usr/lib/openssh/sftp-server
 | 
			
		||||
#	PermitTTY no
 | 
			
		||||
#	ForceCommand cvs server
 | 
			
		||||
 | 
			
		||||
# Originally from: https://stribika.github.io/2015/01/04/secure-secure-shell.html
 | 
			
		||||
# ... but with ciphers and MACs with < 256 bits removed, as NSA's Suite B now
 | 
			
		||||
# does away with these! See: https://www.nsa.gov/ia/programs/suiteb_cryptography/index.shtml
 | 
			
		||||
# Based on the ssh-audit profile for OpenSSH 9.2, but with but with all algos
 | 
			
		||||
# with less than 256 bits removed, as NSA's Suite B removed them years ago and
 | 
			
		||||
# the new (2018) CNSA suite is 256 bits and up.
 | 
			
		||||
#
 | 
			
		||||
# See: https://github.com/jtesta/ssh-audit/blob/master/src/ssh_audit/policy.py
 | 
			
		||||
# See: https://en.wikipedia.org/wiki/Commercial_National_Security_Algorithm_Suite
 | 
			
		||||
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
 | 
			
		||||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
 | 
			
		||||
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
 | 
			
		||||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
 | 
			
		||||
KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256
 | 
			
		||||
 | 
			
		||||
# only allow shell access by provisioning user
 | 
			
		||||
AllowUsers {{ provisioning_user.name }}
 | 
			
		||||
{% if ssh_allowed_users is defined and ssh_allowed_users %}
 | 
			
		||||
# Is there a list of allowed users?
 | 
			
		||||
# Is it populated? (An empty list is 'None', which evaluates as False in Python)
 | 
			
		||||
# merge the items of a list into one string using a space as a separator
 | 
			
		||||
# http://jinja.pocoo.org/docs/dev/templates/#join
 | 
			
		||||
AllowUsers {{ ssh_allowed_users|join(" ") }} {{ provisioning_user.name }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
@@ -1,100 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# /etc/sysctl.conf - Configuration file for setting system variables
 | 
			
		||||
# See /etc/sysctl.d/ for additional system variables
 | 
			
		||||
# See sysctl.conf (5) for information.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
#kernel.domainname = example.com
 | 
			
		||||
 | 
			
		||||
# Uncomment the following to stop low-level messages on console
 | 
			
		||||
#kernel.printk = 3 4 1 3
 | 
			
		||||
 | 
			
		||||
##############################################################3
 | 
			
		||||
# Functions previously found in netbase
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
 | 
			
		||||
# Turn on Source Address Verification in all interfaces to
 | 
			
		||||
# prevent some spoofing attacks
 | 
			
		||||
#net.ipv4.conf.default.rp_filter=1
 | 
			
		||||
#net.ipv4.conf.all.rp_filter=1
 | 
			
		||||
 | 
			
		||||
# Uncomment the next line to enable TCP/IP SYN cookies
 | 
			
		||||
# See http://lwn.net/Articles/277146/
 | 
			
		||||
# Note: This may impact IPv6 TCP sessions too
 | 
			
		||||
#net.ipv4.tcp_syncookies=1
 | 
			
		||||
 | 
			
		||||
# Uncomment the next line to enable packet forwarding for IPv4
 | 
			
		||||
#net.ipv4.ip_forward=1
 | 
			
		||||
 | 
			
		||||
# Uncomment the next line to enable packet forwarding for IPv6
 | 
			
		||||
#  Enabling this option disables Stateless Address Autoconfiguration
 | 
			
		||||
#  based on Router Advertisements for this host
 | 
			
		||||
#net.ipv6.conf.all.forwarding=1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
###################################################################
 | 
			
		||||
# Additional settings - these settings can improve the network
 | 
			
		||||
# security of the host and prevent against some network attacks
 | 
			
		||||
# including spoofing attacks and man in the middle attacks through
 | 
			
		||||
# redirection. Some network environments, however, require that these
 | 
			
		||||
# settings are disabled so review and enable them as needed.
 | 
			
		||||
#
 | 
			
		||||
# Do not accept ICMP redirects (prevent MITM attacks)
 | 
			
		||||
#net.ipv4.conf.all.accept_redirects = 0
 | 
			
		||||
#net.ipv6.conf.all.accept_redirects = 0
 | 
			
		||||
# _or_
 | 
			
		||||
# Accept ICMP redirects only for gateways listed in our default
 | 
			
		||||
# gateway list (enabled by default)
 | 
			
		||||
# net.ipv4.conf.all.secure_redirects = 1
 | 
			
		||||
#
 | 
			
		||||
# Do not send ICMP redirects (we are not a router)
 | 
			
		||||
#net.ipv4.conf.all.send_redirects = 0
 | 
			
		||||
#
 | 
			
		||||
# Do not accept IP source route packets (we are not a router)
 | 
			
		||||
#net.ipv4.conf.all.accept_source_route = 0
 | 
			
		||||
#net.ipv6.conf.all.accept_source_route = 0
 | 
			
		||||
#
 | 
			
		||||
# Log Martian Packets
 | 
			
		||||
#net.ipv4.conf.all.log_martians = 1
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# CIS Benchmark Adjustments
 | 
			
		||||
# See: https://github.com/alanorth/securekickstarts
 | 
			
		||||
kernel.randomize_va_space = 2 
 | 
			
		||||
net.ipv4.ip_forward = 0 
 | 
			
		||||
net.ipv4.conf.all.send_redirects = 0 
 | 
			
		||||
net.ipv4.conf.default.send_redirects = 0 
 | 
			
		||||
net.ipv4.conf.all.accept_source_route = 0 
 | 
			
		||||
net.ipv4.conf.default.accept_source_route = 0 
 | 
			
		||||
net.ipv4.conf.all.accept_redirects = 0 
 | 
			
		||||
net.ipv4.conf.default.accept_redirects = 0 
 | 
			
		||||
net.ipv4.conf.all.secure_redirects = 0 
 | 
			
		||||
net.ipv4.conf.default.secure_redirects = 0 
 | 
			
		||||
net.ipv4.conf.all.log_martians = 1 
 | 
			
		||||
net.ipv4.conf.default.log_martians = 1 
 | 
			
		||||
net.ipv4.icmp_echo_ignore_broadcasts = 1 
 | 
			
		||||
net.ipv4.icmp_ignore_bogus_error_responses = 1 
 | 
			
		||||
net.ipv4.conf.all.rp_filter = 1 
 | 
			
		||||
net.ipv4.conf.default.rp_filter = 1 
 | 
			
		||||
net.ipv4.tcp_syncookies = 1
 | 
			
		||||
 | 
			
		||||
# TCP stuff
 | 
			
		||||
# See: http://fasterdata.es.net/host-tuning/linux/
 | 
			
		||||
# increase TCP max buffer size settable using setsockopt()
 | 
			
		||||
net.core.rmem_max = 16777216 
 | 
			
		||||
net.core.wmem_max = 16777216 
 | 
			
		||||
# increase Linux autotuning TCP buffer limit 
 | 
			
		||||
net.ipv4.tcp_rmem = 4096 87380 16777216
 | 
			
		||||
net.ipv4.tcp_wmem = 4096 65536 16777216
 | 
			
		||||
# increase the length of the processor input queue
 | 
			
		||||
net.core.netdev_max_backlog = 30000
 | 
			
		||||
# recommended for hosts with jumbo frames enabled
 | 
			
		||||
#net.ipv4.tcp_mtu_probing=1
 | 
			
		||||
 | 
			
		||||
# increase quadruplets (src ip, src port, dest ip, dest port)
 | 
			
		||||
# see: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
 | 
			
		||||
net.ipv4.ip_local_port_range = 10240 65535
 | 
			
		||||
# recommended for web servers, especially if running SPDY
 | 
			
		||||
# see: http://www.chromium.org/spdy/spdy-best-practices
 | 
			
		||||
net.ipv4.tcp_slow_start_after_idle = 0
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
deb [arch=amd64] https://pkg.tarsnap.com/deb/{{ ansible_distribution_release }} ./
 | 
			
		||||
deb [arch=amd64 signed-by=/etc/apt/keyrings/tarsnap-deb-packaging-key.asc] https://pkg.tarsnap.com/deb/{{ ansible_distribution_release }} ./
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								roles/common/templates/update-firehol-nftables.sh.j2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										65
									
								
								roles/common/templates/update-firehol-nftables.sh.j2
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
#
 | 
			
		||||
# update-firehol-nftables.sh v0.0.1
 | 
			
		||||
#
 | 
			
		||||
# Download FireHOL lists and load them into nftables sets.
 | 
			
		||||
# 
 | 
			
		||||
# See: https://iplists.firehol.org/
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2025 Alan Orth
 | 
			
		||||
#
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
 | 
			
		||||
# Exit on first error
 | 
			
		||||
set -o errexit
 | 
			
		||||
 | 
			
		||||
firehol_level1_ipv4_set_path=/etc/nftables/firehol_level1-ipv4.nft
 | 
			
		||||
 | 
			
		||||
function download() {
 | 
			
		||||
    echo "Downloading $1"
 | 
			
		||||
    wget -q -O - "https://iplists.firehol.org/files/$1" > "$1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
download firehol_level1.netset
 | 
			
		||||
 | 
			
		||||
if [[ -f "firehol_level1.netset" ]]; then
 | 
			
		||||
    echo "Processing FireHOL Level 1 list"
 | 
			
		||||
 | 
			
		||||
    firehol_level1_ipv4_list_temp=$(mktemp)
 | 
			
		||||
    firehol_level1_ipv4_set_temp=$(mktemp)
 | 
			
		||||
 | 
			
		||||
    # Filter blank lines, comments, and bogons we use inside the LAN, DMZ, and
 | 
			
		||||
    # for local services like systemd-resolved and others on localhost. Ideally
 | 
			
		||||
    # these are blocked already at the WAN side by network administrators.
 | 
			
		||||
    cat firehol_level1.netset \
 | 
			
		||||
        | sed \
 | 
			
		||||
            -e '/^$/d' \
 | 
			
		||||
            -e '/^#.*/d' \
 | 
			
		||||
            -e '/^127\.0\.0\.0\/8/d' \
 | 
			
		||||
        > "$firehol_level1_ipv4_list_temp"
 | 
			
		||||
 | 
			
		||||
    echo "Building firehol_level1-ipv4 set"
 | 
			
		||||
    cat << NFT_HEAD > "$firehol_level1_ipv4_set_temp"
 | 
			
		||||
#!/usr/sbin/nft -f
 | 
			
		||||
 | 
			
		||||
define FIREHOL_LEVEL1_IPV4 = {
 | 
			
		||||
NFT_HEAD
 | 
			
		||||
 | 
			
		||||
    while read -r network; do
 | 
			
		||||
        # nftables doesn't mind if the last element in the set has a trailing
 | 
			
		||||
        # comma so we don't need to do anything special here.
 | 
			
		||||
        echo "$network," >> "$firehol_level1_ipv4_set_temp"
 | 
			
		||||
    done < $firehol_level1_ipv4_list_temp
 | 
			
		||||
 | 
			
		||||
    echo "}" >> "$firehol_level1_ipv4_set_temp"
 | 
			
		||||
 | 
			
		||||
    install -m 0600 "$firehol_level1_ipv4_set_temp" "$firehol_level1_ipv4_set_path"
 | 
			
		||||
 | 
			
		||||
    rm -f "$firehol_level1_ipv4_list_temp" "$firehol_level1_ipv4_set_temp"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "Restarting nftables"
 | 
			
		||||
 | 
			
		||||
/usr/bin/systemctl restart nftables.service
 | 
			
		||||
 | 
			
		||||
rm -v firehol_level1.netset
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/mariadb/defaults/main.yml
 | 
			
		||||
# ansible.builtin.file: roles/mariadb/defaults/main.yml
 | 
			
		||||
#
 | 
			
		||||
# Based on my running of mysqltuner.pl on a host with three WordPress databases
 | 
			
		||||
# and a Piwik instance monitoring three sites.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# default is 128MB but is a waste because it seems only the mysql table uses it
 | 
			
		||||
key_buffer_size: 32M
 | 
			
		||||
key_buffer_size: 8M
 | 
			
		||||
 | 
			
		||||
# default is 128MB but is a waste because it seems only information_schema uses
 | 
			
		||||
# AriaDB, see: https://mariadb.com/kb/en/mariadb/aria-system-variables
 | 
			
		||||
@@ -15,16 +14,20 @@ aria_pagecache_buffer_size: 8M
 | 
			
		||||
# default is 128M, but set to at least the size of your InnoDB data
 | 
			
		||||
innodb_buffer_pool_size: 256M
 | 
			
		||||
 | 
			
		||||
# Unless you have a pool size over 1GB, use a single instance
 | 
			
		||||
# See: https://mariadb.com/kb/en/mariadb/xtradbinnodb-server-system-variables
 | 
			
		||||
innodb_buffer_pool_instances: 1
 | 
			
		||||
 | 
			
		||||
# Ansible 2.7.x with PyMySQL seems to default to TCP connection so we should
 | 
			
		||||
# force it to use a Unix socket.
 | 
			
		||||
# See: https://github.com/ansible/ansible/issues/47736
 | 
			
		||||
mariadb_login_unix_socket: /var/run/mysqld/mysqld.sock
 | 
			
		||||
mariadb_login_unix_socket: /run/mysqld/mysqld.sock
 | 
			
		||||
 | 
			
		||||
# default is 100 but the max I've seen used is 5, so let's reduce it
 | 
			
		||||
max_connections: 33
 | 
			
		||||
 | 
			
		||||
# disable the query cache by default
 | 
			
		||||
query_cache_size: 0
 | 
			
		||||
query_cache_type: 0
 | 
			
		||||
 | 
			
		||||
# mysqltuner says we should use larger than 32M on our setup
 | 
			
		||||
tmp_table_size: 64M
 | 
			
		||||
max_heap_table_size: 64M
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
---
 | 
			
		||||
- name: restart mysql
 | 
			
		||||
  systemd: name=mysql state=restarted
 | 
			
		||||
- name: restart mariadb
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: mariadb
 | 
			
		||||
    state: restarted
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,59 +1,111 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Add GPG key for MariaDB repo
 | 
			
		||||
  apt_key: id=0x177F4010FE56CA3336300305F1656F24C74CD1D8 url=https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x177F4010FE56CA3336300305F1656F24C74CD1D8
 | 
			
		||||
  register: add_mariadb_apt_key
 | 
			
		||||
  tags: mariadb, packages
 | 
			
		||||
- name: Remove MariaDB key from apt-key
 | 
			
		||||
  ansible.builtin.apt_key:
 | 
			
		||||
    id: "013577200103762554506315430003013705453362230723150730"
 | 
			
		||||
    state: absent
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - mariadb
 | 
			
		||||
 | 
			
		||||
- name: Add MariaDB 10.4 repo
 | 
			
		||||
  template: src=mariadb.list.j2 dest=/etc/apt/sources.list.d/mariadb.list owner=root group=root mode=0644
 | 
			
		||||
- name: Check MariaDB package signing key
 | 
			
		||||
  ansible.builtin.stat:
 | 
			
		||||
    path: /etc/apt/keyrings/mariadb_release_signing_key.asc
 | 
			
		||||
  register: mariadb_signing_key_stat
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - mariadb
 | 
			
		||||
 | 
			
		||||
- name: Download MariaDB package signing key
 | 
			
		||||
  when: not mariadb_signing_key_stat.stat.exists
 | 
			
		||||
  ansible.builtin.get_url:
 | 
			
		||||
    url: https://mariadb.org/mariadb_release_signing_key.asc
 | 
			
		||||
    dest: /etc/apt/keyrings/mariadb_release_signing_key.asc
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  register: download_mariadb_signing_key
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - mariadb
 | 
			
		||||
 | 
			
		||||
- name: Add MariaDB 10.11 repo
 | 
			
		||||
  ansible.builtin.apt_repository:
 | 
			
		||||
    repo: deb [arch=amd64 signed-by=/etc/apt/keyrings/mariadb_release_signing_key.asc] https://dlm.mariadb.com/repo/mariadb-server/10.11/repo/debian {{ ansible_distribution_release
 | 
			
		||||
      }} main
 | 
			
		||||
    filename: mariadb
 | 
			
		||||
    state: present
 | 
			
		||||
  register: add_mariadb_apt_repository
 | 
			
		||||
  tags: mariadb, packages
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - mariadb
 | 
			
		||||
 | 
			
		||||
- name: Update apt cache
 | 
			
		||||
  apt:
 | 
			
		||||
    update_cache: yes
 | 
			
		||||
  when:
 | 
			
		||||
    add_mariadb_apt_key is changed or
 | 
			
		||||
    add_mariadb_apt_repository is changed
 | 
			
		||||
  when: (download_mariadb_signing_key.status_code is defined and download_mariadb_signing_key.status_code == 200) or add_mariadb_apt_repository is changed
 | 
			
		||||
  ansible.builtin.apt: # noqa no-handler
 | 
			
		||||
    update_cache: true
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - mariadb
 | 
			
		||||
 | 
			
		||||
- name: Install mariadb-server
 | 
			
		||||
  apt: name={{ item }} state=present cache_valid_time=3600
 | 
			
		||||
  loop:
 | 
			
		||||
    - mariadb-server
 | 
			
		||||
    - python3-pymysql # for ansible
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: [mariadb-server, python3-pymysql]
 | 
			
		||||
    state: present
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
  tags: mariadb, packages
 | 
			
		||||
 | 
			
		||||
- name: Create system my.cnf
 | 
			
		||||
  template: src=my.cnf.j2 dest=/etc/mysql/my.cnf owner=root group=root mode=0644
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: my.cnf.j2
 | 
			
		||||
    dest: /etc/mysql/my.cnf
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  notify:
 | 
			
		||||
    - restart mysql
 | 
			
		||||
    - restart mariadb
 | 
			
		||||
  tags: mariadb
 | 
			
		||||
 | 
			
		||||
# 'localhost' needs to be the last item for idempotency, see
 | 
			
		||||
# https://docs.ansible.com/ansible/latest/mysql_user_module.html
 | 
			
		||||
# See: https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_user_module.html
 | 
			
		||||
- name: Update MariaDB root password for all root accounts
 | 
			
		||||
  mysql_user: name=root host={{ item }} password={{ mariadb_root_password }} login_unix_socket={{ mariadb_login_unix_socket }}
 | 
			
		||||
  community.mysql.mysql_user:
 | 
			
		||||
    name: root
 | 
			
		||||
    host: "{{ item }}"
 | 
			
		||||
    password: "{{ mariadb_root_password }}"
 | 
			
		||||
    login_unix_socket: "{{ mariadb_login_unix_socket }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    - "{{ inventory_hostname }}"
 | 
			
		||||
    - 127.0.0.1
 | 
			
		||||
    - ::1
 | 
			
		||||
    - localhost
 | 
			
		||||
  tags: mariadb
 | 
			
		||||
 | 
			
		||||
- name: Create .my.conf file with root credentials
 | 
			
		||||
  template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: .my.cnf.j2
 | 
			
		||||
    dest: /root/.my.cnf
 | 
			
		||||
    owner: root
 | 
			
		||||
    mode: "0600"
 | 
			
		||||
  tags: mariadb
 | 
			
		||||
 | 
			
		||||
# See: https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_db_module.html
 | 
			
		||||
- name: Create MariaDB database(s)
 | 
			
		||||
  mysql_db: db={{ item.name }} state=present encoding=utf8mb4
 | 
			
		||||
  loop: "{{ mariadb_databases }}"
 | 
			
		||||
  when: mariadb_databases is defined
 | 
			
		||||
  community.mysql.mysql_db:
 | 
			
		||||
    db: "{{ item.name }}"
 | 
			
		||||
    state: present
 | 
			
		||||
    encoding: utf8mb4
 | 
			
		||||
    login_unix_socket: "{{ mariadb_login_unix_socket }}"
 | 
			
		||||
  loop: "{{ mariadb_databases }}"
 | 
			
		||||
  tags: mariadb
 | 
			
		||||
 | 
			
		||||
- name: Create MariaDB user(s)
 | 
			
		||||
  mysql_user: name={{ item.user }} password={{ item.pass }} priv={{ item.name }}.*:ALL state=present
 | 
			
		||||
  loop: "{{ mariadb_databases }}"
 | 
			
		||||
  when: mariadb_databases is defined
 | 
			
		||||
  community.mysql.mysql_user:
 | 
			
		||||
    name: "{{ item.user }}"
 | 
			
		||||
    password: "{{ item.pass }}"
 | 
			
		||||
    priv: "{{ item.name }}.*:ALL"
 | 
			
		||||
    host: 127.0.0.1
 | 
			
		||||
    state: present
 | 
			
		||||
    login_unix_socket: "{{ mariadb_login_unix_socket }}"
 | 
			
		||||
  loop: "{{ mariadb_databases }}"
 | 
			
		||||
  tags: mariadb
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
{{ ansible_managed | comment }}
 | 
			
		||||
 | 
			
		||||
deb [arch=amd64] http://mirror.23media.de/mariadb/repo/10.4/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} main
 | 
			
		||||
@@ -19,14 +19,14 @@
 | 
			
		||||
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
 | 
			
		||||
[client]
 | 
			
		||||
port		= 3306
 | 
			
		||||
socket		= /var/run/mysqld/mysqld.sock
 | 
			
		||||
socket		= /run/mysqld/mysqld.sock
 | 
			
		||||
 | 
			
		||||
# Here is entries for some specific programs
 | 
			
		||||
# The following values assume you have at least 32M ram
 | 
			
		||||
 | 
			
		||||
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
 | 
			
		||||
[mysqld_safe]
 | 
			
		||||
socket		= /var/run/mysqld/mysqld.sock
 | 
			
		||||
socket		= /run/mysqld/mysqld.sock
 | 
			
		||||
nice		= 0
 | 
			
		||||
 | 
			
		||||
[mysqld]
 | 
			
		||||
@@ -34,8 +34,8 @@ nice		= 0
 | 
			
		||||
# * Basic Settings
 | 
			
		||||
#
 | 
			
		||||
user		= mysql
 | 
			
		||||
pid-file	= /var/run/mysqld/mysqld.pid
 | 
			
		||||
socket		= /var/run/mysqld/mysqld.sock
 | 
			
		||||
pid-file	= /run/mysqld/mysqld.pid
 | 
			
		||||
socket		= /run/mysqld/mysqld.sock
 | 
			
		||||
port		= 3306
 | 
			
		||||
basedir		= /usr
 | 
			
		||||
datadir		= /var/lib/mysql
 | 
			
		||||
@@ -47,6 +47,10 @@ skip-external-locking
 | 
			
		||||
# Instead of skip-networking the default is now to listen only on
 | 
			
		||||
# localhost which is more compatible and is not less secure.
 | 
			
		||||
bind-address		= 127.0.0.1
 | 
			
		||||
 | 
			
		||||
# don't resolve connection IPs to hostnames (make sure user accounts are using
 | 
			
		||||
# IPs instead of "localhost")
 | 
			
		||||
skip-name-resolve=1
 | 
			
		||||
#
 | 
			
		||||
# * Fine Tuning
 | 
			
		||||
#
 | 
			
		||||
@@ -57,8 +61,8 @@ max_allowed_packet	= 16M
 | 
			
		||||
thread_cache_size       = 128
 | 
			
		||||
sort_buffer_size	= 4M
 | 
			
		||||
bulk_insert_buffer_size	= 16M
 | 
			
		||||
tmp_table_size		= 32M
 | 
			
		||||
max_heap_table_size	= 32M
 | 
			
		||||
tmp_table_size		= {{ tmp_table_size }}
 | 
			
		||||
max_heap_table_size	= {{ max_heap_table_size }}
 | 
			
		||||
#
 | 
			
		||||
# * MyISAM
 | 
			
		||||
#
 | 
			
		||||
@@ -75,11 +79,9 @@ read_rnd_buffer_size	= 1M
 | 
			
		||||
#
 | 
			
		||||
# * Query Cache Configuration
 | 
			
		||||
#
 | 
			
		||||
# Cache only tiny result sets, so we can fit more in the query cache.
 | 
			
		||||
query_cache_limit		= 128K
 | 
			
		||||
query_cache_size		= 64M
 | 
			
		||||
# for more write intensive setups, set to DEMAND or OFF
 | 
			
		||||
#query_cache_type		= DEMAND
 | 
			
		||||
query_cache_size		= {{ query_cache_size }}
 | 
			
		||||
query_cache_type		= {{ query_cache_type }}
 | 
			
		||||
#
 | 
			
		||||
# * Logging and Replication
 | 
			
		||||
#
 | 
			
		||||
@@ -141,7 +143,6 @@ innodb_file_per_table	= 1
 | 
			
		||||
innodb_open_files	= 400
 | 
			
		||||
innodb_io_capacity	= 400
 | 
			
		||||
innodb_flush_method	= O_DIRECT
 | 
			
		||||
innodb_buffer_pool_instances = {{ innodb_buffer_pool_instances }}
 | 
			
		||||
 | 
			
		||||
aria_pagecache_buffer_size = {{ aria_pagecache_buffer_size }}
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/munin/handlers/main.yml
 | 
			
		||||
# ansible.builtin.file: roles/munin/handlers/main.yml
 | 
			
		||||
- name: restart munin-node
 | 
			
		||||
  systemd: name=munin-node state=restarted
 | 
			
		||||
  ansible.builtin.systemd_service: name=munin-node state=restarted
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Configure munin scraper
 | 
			
		||||
  import_tasks: munin.yml
 | 
			
		||||
  ansible.builtin.import_tasks: munin.yml
 | 
			
		||||
  tags: munin
 | 
			
		||||
 | 
			
		||||
- name: Configure munin listener
 | 
			
		||||
  import_tasks: munin-node.yml
 | 
			
		||||
  ansible.builtin.import_tasks: munin-node.yml
 | 
			
		||||
  tags: munin-node
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,34 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Install munin-node
 | 
			
		||||
  apt: name=munin-node state=present
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: munin-node
 | 
			
		||||
    state: present
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
# some nice things to have for munin-node on Ubuntu
 | 
			
		||||
# libwww-perl: for munin's nginx_status check
 | 
			
		||||
- name: Install munin-node deps
 | 
			
		||||
  apt: name=libwww-perl state=present
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: libwww-perl
 | 
			
		||||
    state: present
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
- name: Create munin-node.conf
 | 
			
		||||
  template: src=munin-node.conf.j2 dest=/etc/munin/munin-node.conf
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: munin-node.conf.j2
 | 
			
		||||
    dest: /etc/munin/munin-node.conf
 | 
			
		||||
  notify:
 | 
			
		||||
    - restart munin-node
 | 
			
		||||
 | 
			
		||||
- name: Configure munin-node
 | 
			
		||||
  shell: munin-node-configure --shell --families=contrib,auto | sh -x
 | 
			
		||||
  ansible.builtin.shell: munin-node-configure --shell --families=contrib,auto | sh -x
 | 
			
		||||
  notify:
 | 
			
		||||
    - restart munin-node
 | 
			
		||||
 | 
			
		||||
- name: Start munin-node
 | 
			
		||||
  systemd: name=munin-node state=started enabled=true
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: munin-node
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,16 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Install munin package
 | 
			
		||||
  apt: name=munin state=present
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    name: munin
 | 
			
		||||
    state: present
 | 
			
		||||
  tags: packages
 | 
			
		||||
 | 
			
		||||
- name: Create munin configuration file
 | 
			
		||||
  template: src=munin.conf.j2 dest=/etc/munin/munin.conf owner=root group=root mode=0644
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: munin.conf.j2
 | 
			
		||||
    dest: /etc/munin/munin.conf
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,37 +1,44 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/nginx/defaults/main.yml
 | 
			
		||||
# ansible.builtin.file: roles/nginx/defaults/main.yml
 | 
			
		||||
 | 
			
		||||
# path config
 | 
			
		||||
nginx_confd_path: /etc/nginx/conf.d
 | 
			
		||||
 | 
			
		||||
# parent directory of vhost roots
 | 
			
		||||
nginx_root_prefix: /var/www
 | 
			
		||||
nginx_root_prefix: "{{ web_root_prefix }}"
 | 
			
		||||
 | 
			
		||||
# 1 hour timeout
 | 
			
		||||
nginx_ssl_session_timeout: 1h
 | 
			
		||||
# 1 day timeout
 | 
			
		||||
nginx_ssl_session_timeout: 1d
 | 
			
		||||
# 10MB -> 40,000 sessions
 | 
			
		||||
nginx_ssl_session_cache: shared:SSL:10m
 | 
			
		||||
# 1400 bytes to fit in one MTU (default is 16k!)
 | 
			
		||||
nginx_ssl_buffer_size: 1400
 | 
			
		||||
nginx_ssl_buffer_size: 4k
 | 
			
		||||
nginx_ssl_dhparam: /etc/ssl/certs/dhparam.pem
 | 
			
		||||
nginx_ssl_protocols: 'TLSv1.2 TLSv1.3'
 | 
			
		||||
nginx_ssl_protocols: TLSv1.2 TLSv1.3
 | 
			
		||||
nginx_ssl_ecdh_curve: X25519:prime256v1:secp384r1
 | 
			
		||||
 | 
			
		||||
# DNS resolvers for OCSP stapling (default to Cloudflare public DNS)
 | 
			
		||||
# See: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling
 | 
			
		||||
nginx_ssl_stapling_resolver: '1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001]'
 | 
			
		||||
nginx_ssl_stapling_resolver: 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001]
 | 
			
		||||
 | 
			
		||||
# install certbot + dependencies?
 | 
			
		||||
# True unless you're in development and using "localhost" + snakeoil certs
 | 
			
		||||
use_letsencrypt: True
 | 
			
		||||
# HTTP Strict-Transport-Security header, recommended by Google to be ~1 year
 | 
			
		||||
# in seconds, see: https://hstspreload.org/
 | 
			
		||||
nginx_hsts_max_age: 31536000
 | 
			
		||||
 | 
			
		||||
# install acme.sh?
 | 
			
		||||
# true unless you're in development and using "localhost" + snakeoil certs
 | 
			
		||||
use_letsencrypt: true
 | 
			
		||||
 | 
			
		||||
# Directory root for Let's Encrypt certs
 | 
			
		||||
letsencrypt_root: /etc/letsencrypt/live
 | 
			
		||||
letsencrypt_root: /etc/ssl
 | 
			
		||||
 | 
			
		||||
# Location of Let's Encrypt's certbot script
 | 
			
		||||
letsencrypt_certbot_dest: /opt/certbot-auto
 | 
			
		||||
# Location where to save initial acme.sh script. After installation the script
 | 
			
		||||
# will automatically create its home in the /root/.acme.sh directory (including
 | 
			
		||||
# a copy of the script itself). The initial script is not needed after.
 | 
			
		||||
letsencrypt_acme_script_temp: /root/acme.sh
 | 
			
		||||
letsencrypt_acme_home: /root/.acme.sh
 | 
			
		||||
 | 
			
		||||
# stable is 1.18.x
 | 
			
		||||
# mainline is 1.19.x
 | 
			
		||||
# stable is 1.26.x
 | 
			
		||||
# mainline is 1.27.x
 | 
			
		||||
nginx_version: mainline
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -15,3 +15,6 @@ add_header X-XSS-Protection "1; mode=block" always;
 | 
			
		||||
# CSP can be quite difficult to configure, and cause real issues if you get it wrong
 | 
			
		||||
# There is website that helps you generate a policy here http://cspisawesome.com/
 | 
			
		||||
# add_header Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' https://www.google-analytics.com;" always;
 | 
			
		||||
 | 
			
		||||
# Opt this site out of Google Chrome's Federated Learning of Cohorts (FLoC)
 | 
			
		||||
add_header Permissions-Policy interest-cohort=() always;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
/bin/systemctl start nginx
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
/bin/systemctl stop nginx
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
---
 | 
			
		||||
- name: reload nginx
 | 
			
		||||
  systemd: name=nginx state=reloaded
 | 
			
		||||
- name: Reload nginx
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: nginx
 | 
			
		||||
    state: reloaded
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,137 +1,91 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Copy systemd service to renew Let's Encrypt certs
 | 
			
		||||
    template: src=renew-letsencrypt.service.j2 dest=/etc/systemd/system/renew-letsencrypt.service mode=0644 owner=root group=root
 | 
			
		||||
 | 
			
		||||
  - name: Copy systemd timer to renew Let's Encrypt certs
 | 
			
		||||
    copy: src=renew-letsencrypt.timer dest=/etc/systemd/system/renew-letsencrypt.timer mode=0644 owner=root group=root
 | 
			
		||||
 | 
			
		||||
  # always issues daemon-reload just in case the server/timer changed
 | 
			
		||||
  - name: Start and enable systemd timer to renew Let's Encrypt certs
 | 
			
		||||
    systemd: name=renew-letsencrypt.timer state=started enabled=yes daemon_reload=yes
 | 
			
		||||
 | 
			
		||||
  - name: Download certbot
 | 
			
		||||
    get_url: dest={{ letsencrypt_certbot_dest }} url=https://dl.eff.org/certbot-auto mode=700
 | 
			
		||||
 | 
			
		||||
  # Dependencies certbot checks for on its first run. I set them in a fact so that
 | 
			
		||||
  # I can pass the list directly to the apt module to install in one transaction.
 | 
			
		||||
  - name: Set certbot dependencies (Debian 10)
 | 
			
		||||
    when: ansible_distribution == 'Debian' and ansible_distribution_major_version is version('10', '==')
 | 
			
		||||
    set_fact:
 | 
			
		||||
      certbot_dependencies:
 | 
			
		||||
        - augeas-lenses
 | 
			
		||||
        - binutils
 | 
			
		||||
        - binutils-common
 | 
			
		||||
        - binutils-x86-64-linux-gnu
 | 
			
		||||
        - cpp
 | 
			
		||||
        - cpp-8
 | 
			
		||||
        - gcc
 | 
			
		||||
        - gcc-8
 | 
			
		||||
        - libasan5
 | 
			
		||||
        - libatomic1
 | 
			
		||||
        - libaugeas0
 | 
			
		||||
        - libbinutils
 | 
			
		||||
        - libc-dev-bin
 | 
			
		||||
        - libc6-dev
 | 
			
		||||
        - libcc1-0
 | 
			
		||||
        - libexpat1-dev
 | 
			
		||||
        - libffi-dev
 | 
			
		||||
        - libgcc-8-dev
 | 
			
		||||
        - libgomp1
 | 
			
		||||
        - libisl19
 | 
			
		||||
        - libitm1
 | 
			
		||||
        - liblsan0
 | 
			
		||||
        - libmpc3
 | 
			
		||||
        - libmpfr6
 | 
			
		||||
        - libmpx2
 | 
			
		||||
        - libpython-dev
 | 
			
		||||
        - libpython2-dev
 | 
			
		||||
        - libpython2.7
 | 
			
		||||
        - libpython2.7-dev
 | 
			
		||||
        - libquadmath0
 | 
			
		||||
        - libssl-dev
 | 
			
		||||
        - libtsan0
 | 
			
		||||
        - libubsan1
 | 
			
		||||
        - linux-libc-dev
 | 
			
		||||
        - python-dev
 | 
			
		||||
        - python-pip-whl
 | 
			
		||||
        - python-pkg-resources
 | 
			
		||||
        - python-virtualenv
 | 
			
		||||
        - python2-dev
 | 
			
		||||
        - python2.7-dev
 | 
			
		||||
        - python3-distutils
 | 
			
		||||
        - python3-lib2to3
 | 
			
		||||
        - python3-virtualenv
 | 
			
		||||
        - virtualenv
 | 
			
		||||
 | 
			
		||||
  # Dependencies certbot checks for on its first run. I set them in a fact so that
 | 
			
		||||
  # I can pass the list directly to the apt module to install in one transaction.
 | 
			
		||||
  - name: Set certbot dependencies (Ubuntu 18.04)
 | 
			
		||||
    when: ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('18.04', '==')
 | 
			
		||||
    set_fact:
 | 
			
		||||
      certbot_dependencies:
 | 
			
		||||
        - augeas-lenses
 | 
			
		||||
        - binutils
 | 
			
		||||
        - binutils-common
 | 
			
		||||
        - binutils-x86-64-linux-gnu
 | 
			
		||||
        - cpp
 | 
			
		||||
        - cpp-7
 | 
			
		||||
        - gcc
 | 
			
		||||
        - gcc-7
 | 
			
		||||
        - gcc-7-base
 | 
			
		||||
        - libasan4
 | 
			
		||||
        - libatomic1
 | 
			
		||||
        - libaugeas0
 | 
			
		||||
        - libbinutils
 | 
			
		||||
        - libc-dev-bin
 | 
			
		||||
        - libc6-dev
 | 
			
		||||
        - libcc1-0
 | 
			
		||||
        - libcilkrts5
 | 
			
		||||
        - libexpat1-dev
 | 
			
		||||
        - libffi-dev
 | 
			
		||||
        - libgcc-7-dev
 | 
			
		||||
        - libgomp1
 | 
			
		||||
        - libisl19
 | 
			
		||||
        - libitm1
 | 
			
		||||
        - liblsan0
 | 
			
		||||
        - libmpc3
 | 
			
		||||
        - libmpx2
 | 
			
		||||
        - libpython-dev
 | 
			
		||||
        - libpython2.7
 | 
			
		||||
        - libpython2.7-dev
 | 
			
		||||
        - libquadmath0
 | 
			
		||||
        - libssl-dev
 | 
			
		||||
        - libtsan0
 | 
			
		||||
        - libubsan0
 | 
			
		||||
        - linux-libc-dev
 | 
			
		||||
        - python-dev
 | 
			
		||||
        - python-pip-whl
 | 
			
		||||
        - python-pkg-resources
 | 
			
		||||
        - python-virtualenv
 | 
			
		||||
        - python2.7-dev
 | 
			
		||||
        - python3-virtualenv
 | 
			
		||||
        - virtualenv
 | 
			
		||||
 | 
			
		||||
  - name: Install certbot dependencies
 | 
			
		||||
    apt: name={{ certbot_dependencies }} state=present update_cache=yes
 | 
			
		||||
 | 
			
		||||
  when: ansible_distribution != 'Ubuntu' and ansible_distribution_major_version is version('20.04', '!=')
 | 
			
		||||
# Use acme.sh instead of certbot because they only support installation via
 | 
			
		||||
# snap now.
 | 
			
		||||
- name: Install and configure Let's Encrypt
 | 
			
		||||
  tags: letsencrypt
 | 
			
		||||
  when:
 | 
			
		||||
    - ansible_distribution == 'Debian'
 | 
			
		||||
    - ansible_distribution_version is version('11', '>='))
 | 
			
		||||
  block:
 | 
			
		||||
    - name: Remove certbot
 | 
			
		||||
      ansible.builtin.apt:
 | 
			
		||||
        name: certbot
 | 
			
		||||
        state: absent
 | 
			
		||||
 | 
			
		||||
# On Ubuntu 20.04 it is no longer recommended/supported to use the standalone
 | 
			
		||||
# certbot-auto so I guess we need to use the one from the repositories.
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Install certbot (Ubuntu 20.04)
 | 
			
		||||
    apt: name=certbot state=present update_cache=yes
 | 
			
		||||
    - name: Remove old certbot post and pre hooks for nginx
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        dest: "{{ item }}"
 | 
			
		||||
        state: absent
 | 
			
		||||
      with_items:
 | 
			
		||||
        - /etc/letsencrypt/renewal-hooks/pre/stop-nginx.sh
 | 
			
		||||
        - /etc/letsencrypt/renewal-hooks/post/start-nginx.sh
 | 
			
		||||
 | 
			
		||||
  - name: Copy certbot post and pre hooks for nginx
 | 
			
		||||
    copy: src={{ item.src }} dest={{ item.dest }} owner=root group=root mode=0755
 | 
			
		||||
    with_items:
 | 
			
		||||
      - { src: 'stop-nginx.sh', dest: '/etc/letsencrypt/renewal-hooks/pre/stop-nginx.sh' }
 | 
			
		||||
      - { src: 'start-nginx.sh', dest: '/etc/letsencrypt/renewal-hooks/post/start-nginx.sh' }
 | 
			
		||||
    - name: Check if acme.sh is installed
 | 
			
		||||
      ansible.builtin.stat:
 | 
			
		||||
        path: "{{ letsencrypt_acme_home }}"
 | 
			
		||||
      register: acme_home
 | 
			
		||||
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
  tags: letsencrypt
 | 
			
		||||
    - name: Download acme.sh
 | 
			
		||||
      when: not acme_home.stat.exists
 | 
			
		||||
      ansible.builtin.get_url:
 | 
			
		||||
        url: https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh
 | 
			
		||||
        dest: "{{ letsencrypt_acme_script_temp }}"
 | 
			
		||||
        mode: "0700"
 | 
			
		||||
      register: acme_download
 | 
			
		||||
 | 
			
		||||
    # Run the "install" for acme.sh so it creates the .acme.sh dir (currently I
 | 
			
		||||
    # have to chdir to the /root directory where the script exists or else it
 | 
			
		||||
    # fails. Ansible runs it, but the script can't find itself...).
 | 
			
		||||
    - name: Install acme.sh
 | 
			
		||||
      when: acme_download is changed
 | 
			
		||||
      ansible.builtin.command:
 | 
			
		||||
        cmd: "{{ letsencrypt_acme_script_temp }} --install --no-profile --no-cron"
 | 
			
		||||
        creates: "{{ letsencrypt_acme_home }}/acme.sh"
 | 
			
		||||
        chdir: /root
 | 
			
		||||
      register: acme_install
 | 
			
		||||
 | 
			
		||||
    - name: Remove temporary acme.sh script
 | 
			
		||||
      when:
 | 
			
		||||
        - acme_install.rc is defined
 | 
			
		||||
        - acme_install.rc == 0
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        dest: "{{ letsencrypt_acme_script_temp }}"
 | 
			
		||||
        state: absent
 | 
			
		||||
 | 
			
		||||
    - name: Set default certificate authority for acme.sh
 | 
			
		||||
      ansible.builtin.command:
 | 
			
		||||
        cmd: "{{ letsencrypt_acme_home }}/acme.sh --set-default-ca --server letsencrypt"
 | 
			
		||||
 | 
			
		||||
    - name: Prepare Let's Encrypt well-known directory
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        state: directory
 | 
			
		||||
        path: /var/lib/letsencrypt/.well-known
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: nginx
 | 
			
		||||
        mode: g+s
 | 
			
		||||
 | 
			
		||||
    - name: Copy systemd service to renew Let's Encrypt certs
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: renew-letsencrypt.service.j2
 | 
			
		||||
        dest: /etc/systemd/system/renew-letsencrypt.service
 | 
			
		||||
        mode: "0644"
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: root
 | 
			
		||||
 | 
			
		||||
    - name: Copy systemd timer to renew Let's Encrypt certs
 | 
			
		||||
      ansible.builtin.copy:
 | 
			
		||||
        src: renew-letsencrypt.timer
 | 
			
		||||
        dest: /etc/systemd/system/renew-letsencrypt.timer
 | 
			
		||||
        mode: "0644"
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: root
 | 
			
		||||
 | 
			
		||||
    # always issues daemon-reload just in case the service/timer changed
 | 
			
		||||
    - name: Start and enable systemd timer to renew Let's Encrypt certs
 | 
			
		||||
      ansible.builtin.systemd_service:
 | 
			
		||||
        name: renew-letsencrypt.timer
 | 
			
		||||
        state: started
 | 
			
		||||
        enabled: true
 | 
			
		||||
        daemon_reload: true
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,77 +1,132 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Add nginx.org apt signing key
 | 
			
		||||
  apt_key: id=0x573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 url=https://nginx.org/keys/nginx_signing.key state=present
 | 
			
		||||
  register: add_nginx_apt_key
 | 
			
		||||
  tags: nginx, packages
 | 
			
		||||
- name: Remove nginx apt signing key from apt-key
 | 
			
		||||
  ansible.builtin.apt_key:
 | 
			
		||||
    id: "053473772654754373614404074646527257655730117366337542"
 | 
			
		||||
    state: absent
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - nginx
 | 
			
		||||
 | 
			
		||||
- name: Download nginx apt signing key
 | 
			
		||||
  ansible.builtin.get_url:
 | 
			
		||||
    url: https://nginx.org/keys/nginx_signing.key
 | 
			
		||||
    dest: /usr/share/keyrings/nginx_signing.key
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    checksum: sha256:55385da31d198fa6a5012d40ae98ecb272a6c4e8fffffba94719ffd3e87de37a
 | 
			
		||||
  register: download_nginx_signing_key
 | 
			
		||||
  tags:
 | 
			
		||||
    - packages
 | 
			
		||||
    - nginx
 | 
			
		||||
 | 
			
		||||
- name: Add nginx.org repo
 | 
			
		||||
  template: src=nginx_org_sources.list.j2 dest=/etc/apt/sources.list.d/nginx_org_sources.list owner=root group=root mode=0644
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: nginx_org_sources.list.j2
 | 
			
		||||
    dest: /etc/apt/sources.list.d/nginx_org_sources.list
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
  register: add_nginx_apt_repository
 | 
			
		||||
  tags: nginx, packages
 | 
			
		||||
  tags:
 | 
			
		||||
    - nginx
 | 
			
		||||
    - packages
 | 
			
		||||
 | 
			
		||||
- name: Update apt cache
 | 
			
		||||
  apt:
 | 
			
		||||
    update_cache: yes
 | 
			
		||||
  when:
 | 
			
		||||
    add_nginx_apt_key is changed or
 | 
			
		||||
    add_nginx_apt_repository is changed
 | 
			
		||||
  when: (download_nginx_signing_key.status_code is defined and download_nginx_signing_key.status_code == 200) or add_nginx_apt_repository is changed
 | 
			
		||||
  ansible.builtin.apt: # noqa no-handler
 | 
			
		||||
    update_cache: true
 | 
			
		||||
 | 
			
		||||
- name: Install nginx
 | 
			
		||||
  apt: pkg=nginx cache_valid_time=3600 state=present
 | 
			
		||||
  tags: nginx, packages
 | 
			
		||||
  ansible.builtin.apt:
 | 
			
		||||
    pkg: nginx
 | 
			
		||||
    cache_valid_time: 3600
 | 
			
		||||
    state: present
 | 
			
		||||
  tags:
 | 
			
		||||
    - nginx
 | 
			
		||||
    - packages
 | 
			
		||||
 | 
			
		||||
- name: Copy nginx.conf
 | 
			
		||||
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf mode=0644 owner=root group=root
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: nginx.conf.j2
 | 
			
		||||
    dest: /etc/nginx/nginx.conf
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload nginx
 | 
			
		||||
    - Reload nginx
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Copy extra nginx configs
 | 
			
		||||
  copy: src={{ item }} dest=/etc/nginx/{{ item }} mode=0644 owner=root group=root
 | 
			
		||||
  ansible.builtin.copy:
 | 
			
		||||
    src: "{{ item }}"
 | 
			
		||||
    dest: /etc/nginx/{{ item }}
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  loop:
 | 
			
		||||
    - extra-security.conf
 | 
			
		||||
    - fastcgi_cache
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload nginx
 | 
			
		||||
    - Reload nginx
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Remove default nginx vhost
 | 
			
		||||
  file: path=/etc/nginx/conf.d/default.conf state=absent
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: /etc/nginx/conf.d/default.conf
 | 
			
		||||
    state: absent
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Create fastcgi cache dir
 | 
			
		||||
  file: path=/var/cache/nginx/cached/fastcgi state=directory owner=nginx group=nginx mode=0755
 | 
			
		||||
  ansible.builtin.file:
 | 
			
		||||
    path: /var/cache/nginx/cached/fastcgi
 | 
			
		||||
    state: directory
 | 
			
		||||
    owner: nginx
 | 
			
		||||
    group: nginx
 | 
			
		||||
    mode: "0755"
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Configure nginx virtual hosts
 | 
			
		||||
  include_tasks: vhosts.yml
 | 
			
		||||
  when: nginx_vhosts is defined
 | 
			
		||||
  ansible.builtin.include_tasks: vhosts.yml
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Configure WordPress
 | 
			
		||||
  include_tasks: wordpress.yml
 | 
			
		||||
  when: nginx_vhosts is defined
 | 
			
		||||
  ansible.builtin.include_tasks: wordpress.yml
 | 
			
		||||
  tags: wordpress
 | 
			
		||||
 | 
			
		||||
- name: Configure blank nginx vhost
 | 
			
		||||
  template: src=blank-vhost.conf.j2 dest={{ nginx_confd_path }}/blank-vhost.conf  mode=0644 owner=root group=root
 | 
			
		||||
  ansible.builtin.template:
 | 
			
		||||
    src: blank-vhost.conf.j2
 | 
			
		||||
    dest: "{{ nginx_confd_path }}/blank-vhost.conf"
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload nginx
 | 
			
		||||
    - Reload nginx
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Configure munin vhost
 | 
			
		||||
  copy: src=munin.conf dest=/etc/nginx/conf.d/munin.conf mode=0644 owner=root group=root
 | 
			
		||||
  ansible.builtin.copy:
 | 
			
		||||
    src: munin.conf
 | 
			
		||||
    dest: /etc/nginx/conf.d/munin.conf
 | 
			
		||||
    mode: "0644"
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
  notify:
 | 
			
		||||
    - reload nginx
 | 
			
		||||
    - Reload nginx
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Start and enable nginx service
 | 
			
		||||
  systemd: name=nginx state=started enabled=yes
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: nginx
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
  tags: nginx
 | 
			
		||||
 | 
			
		||||
- name: Configure Let's Encrypt
 | 
			
		||||
  include_tasks: letsencrypt.yml
 | 
			
		||||
  when: use_letsencrypt is defined and use_letsencrypt
 | 
			
		||||
  ansible.builtin.include_tasks: letsencrypt.yml
 | 
			
		||||
  tags: letsencrypt
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,40 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Configure https vhosts
 | 
			
		||||
    template: src=vhost.conf.j2 dest={{ nginx_confd_path }}/{{ item.domain_name }}.conf mode=0644 owner=root group=root
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
    notify:
 | 
			
		||||
      - reload nginx
 | 
			
		||||
 | 
			
		||||
  - name: Generate self-signed TLS cert
 | 
			
		||||
    command: openssl req -x509 -nodes -sha256 -days 365 -subj "/C=SO/ST=SO/L=snakeoil/O=snakeoil/CN=snakeoil" -newkey rsa:2048 -keyout /etc/ssl/private/nginx-snakeoil.key -out /etc/ssl/certs/nginx-snakeoil.crt -extensions v3_ca creates=/etc/ssl/certs/nginx-snakeoil.crt
 | 
			
		||||
    notify:
 | 
			
		||||
      - reload nginx
 | 
			
		||||
 | 
			
		||||
  - name: Generate 2048-bit dhparam
 | 
			
		||||
    command: openssl dhparam -out dhparam.pem 2048 chdir=/etc/ssl/certs creates=dhparam.pem
 | 
			
		||||
    notify:
 | 
			
		||||
      - reload nginx
 | 
			
		||||
 | 
			
		||||
  - name: Create vhost document roots
 | 
			
		||||
    file: path={{ nginx_root_prefix }}/{{ item.domain_name }} state=directory mode=0755 owner=nginx group=nginx
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
- name: Configure https vhosts
 | 
			
		||||
  tags: nginx
 | 
			
		||||
  block:
 | 
			
		||||
    - name: Configure https vhosts
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: vhost.conf.j2
 | 
			
		||||
        dest: "{{ nginx_confd_path }}/{{ item.domain_name }}.conf"
 | 
			
		||||
        mode: "0644"
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: root
 | 
			
		||||
      loop: "{{ nginx_vhosts }}"
 | 
			
		||||
      notify:
 | 
			
		||||
        - Reload nginx
 | 
			
		||||
 | 
			
		||||
    - name: Generate self-signed TLS cert
 | 
			
		||||
      ansible.builtin.command: openssl req -x509 -nodes -sha256 -days 365 -subj "/C=SO/ST=SO/L=snakeoil/O=snakeoil/CN=snakeoil" -newkey rsa:2048 -keyout /etc/ssl/private/nginx-snakeoil.key
 | 
			
		||||
        -out /etc/ssl/certs/nginx-snakeoil.crt -extensions v3_ca creates=/etc/ssl/certs/nginx-snakeoil.crt
 | 
			
		||||
      notify:
 | 
			
		||||
        - Reload nginx
 | 
			
		||||
 | 
			
		||||
    - name: Download 4096-bit RFC 7919 dhparams
 | 
			
		||||
      ansible.builtin.get_url:
 | 
			
		||||
        url: https://raw.githubusercontent.com/internetstandards/dhe_groups/master/ffdhe4096.pem
 | 
			
		||||
        checksum: sha256:64852d6890ff9e62eecd1ee89c72af9af244dfef5b853bcedea3dfd7aade22b3
 | 
			
		||||
        dest: "{{ nginx_ssl_dhparam }}"
 | 
			
		||||
      notify:
 | 
			
		||||
        - Reload nginx
 | 
			
		||||
 | 
			
		||||
    # TODO: this could break because we can override the document root in host vars
 | 
			
		||||
    - name: Create vhost document roots
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        path: "{{ nginx_root_prefix }}/{{ item.domain_name }}"
 | 
			
		||||
        state: directory
 | 
			
		||||
        mode: "0755"
 | 
			
		||||
        owner: nginx
 | 
			
		||||
        group: nginx
 | 
			
		||||
      loop: "{{ nginx_vhosts }}"
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,29 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Install WordPress
 | 
			
		||||
    git: repo=https://github.com/WordPress/WordPress.git dest={{ nginx_root_prefix }}/{{ item.domain_name }}/wordpress version={{ item.wordpress_version }} depth=1 force=yes
 | 
			
		||||
    when: item.has_wordpress is defined and item.has_wordpress
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
 | 
			
		||||
  - name: Fix WordPress directory permissions
 | 
			
		||||
    file: path={{ nginx_root_prefix }}/{{ item.domain_name }} state=directory owner=nginx group=nginx recurse=yes
 | 
			
		||||
    when: item.has_wordpress is defined and item.has_wordpress
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
- name: Install and configure WordPress
 | 
			
		||||
  tags: wordpress
 | 
			
		||||
  block:
 | 
			
		||||
    - name: Install WordPress
 | 
			
		||||
      when:
 | 
			
		||||
        - item.has_wordpress is defined
 | 
			
		||||
        - item.has_wordpress
 | 
			
		||||
      ansible.builtin.git:
 | 
			
		||||
        repo: https://github.com/WordPress/WordPress.git
 | 
			
		||||
        dest: "{{ nginx_root_prefix }}/{{ item.domain_name }}/wordpress"
 | 
			
		||||
        version: "{{ item.wordpress_version }}"
 | 
			
		||||
        depth: 1
 | 
			
		||||
        force: true
 | 
			
		||||
      loop: "{{ nginx_vhosts }}"
 | 
			
		||||
 | 
			
		||||
    - name: Fix WordPress directory permissions
 | 
			
		||||
      when:
 | 
			
		||||
        - item.has_wordpress is defined
 | 
			
		||||
        - item.has_wordpress
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        path: "{{ nginx_root_prefix }}/{{ item.domain_name }}"
 | 
			
		||||
        state: directory
 | 
			
		||||
        owner: nginx
 | 
			
		||||
        group: nginx
 | 
			
		||||
        recurse: true
 | 
			
		||||
      loop: "{{ nginx_vhosts }}"
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
 
 | 
			
		||||
@@ -11,12 +11,14 @@ server {
 | 
			
		||||
 | 
			
		||||
    return 444;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
server {
 | 
			
		||||
    listen 443 ssl http2 default_server;
 | 
			
		||||
    listen [::]:443 ssl http2 default_server;
 | 
			
		||||
    listen 443 ssl default_server;
 | 
			
		||||
    listen [::]:443 ssl default_server;
 | 
			
		||||
    http2 on;
 | 
			
		||||
    server_name _;
 | 
			
		||||
 | 
			
		||||
    # "snakeoil" certificate (self signed!)
 | 
			
		||||
    # self-signed "snakeoil" certificate
 | 
			
		||||
    ssl_certificate /etc/ssl/certs/nginx-snakeoil.crt;
 | 
			
		||||
    ssl_certificate_key /etc/ssl/private/nginx-snakeoil.key;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								roles/nginx/templates/gitea.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								roles/nginx/templates/gitea.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
 | 
			
		||||
    location / {
 | 
			
		||||
        proxy_pass http://localhost:3000;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
{# helper variables and per-site defaults that we can't set in role defaults #}
 | 
			
		||||
{% set domain_name       = item.domain_name %}
 | 
			
		||||
{# assume HSTS is off unless a vhost explicitly sets it to True #}
 | 
			
		||||
{% set enable_hsts       = item.enable_hsts | default(False) %}
 | 
			
		||||
{# assume HSTS is off unless a vhost explicitly sets it to true #}
 | 
			
		||||
{% set enable_hsts       = item.enable_hsts | default(false) %}
 | 
			
		||||
 | 
			
		||||
    {# first, check if the current vhost has a custom cert (perhaps self-signed) #}
 | 
			
		||||
    {% if item.tls_certificate_path is defined and item.tls_key_path is defined %}
 | 
			
		||||
@@ -16,8 +16,8 @@
 | 
			
		||||
 | 
			
		||||
    # concatenated key + cert
 | 
			
		||||
    # See: http://nginx.org/en/docs/http/configuring_https_servers.html
 | 
			
		||||
    ssl_certificate {{ letsencrypt_root }}/{{ domain_name }}/fullchain.pem;
 | 
			
		||||
    ssl_certificate_key {{ letsencrypt_root }}/{{ domain_name }}/privkey.pem;
 | 
			
		||||
    ssl_certificate {{ letsencrypt_root }}/certs/{{ domain_name }}.fullchain.pem;
 | 
			
		||||
    ssl_certificate_key {{ letsencrypt_root }}/private/{{ domain_name }}.key.pem;
 | 
			
		||||
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
@@ -27,29 +27,21 @@
 | 
			
		||||
 | 
			
		||||
    ssl_dhparam {{ nginx_ssl_dhparam }};
 | 
			
		||||
    ssl_protocols {{ nginx_ssl_protocols }};
 | 
			
		||||
    ssl_ecdh_curve {{ nginx_ssl_ecdh_curve }};
 | 
			
		||||
    ssl_ciphers "{{ tls_cipher_suite }}";
 | 
			
		||||
    ssl_prefer_server_ciphers on;
 | 
			
		||||
    ssl_prefer_server_ciphers off;
 | 
			
		||||
 | 
			
		||||
    {# OSCP stapling only works with real certs #}
 | 
			
		||||
    {% if use_letsencrypt == True or item.tls_certificate_path %}
 | 
			
		||||
    {% if use_letsencrypt == true or item.tls_certificate_path %}
 | 
			
		||||
    # OCSP stapling...
 | 
			
		||||
    ssl_stapling on;
 | 
			
		||||
    ssl_stapling_verify on;
 | 
			
		||||
    resolver {{ nginx_ssl_stapling_resolver }};
 | 
			
		||||
    {% endif %} {# end: use_letsencrypt #}
 | 
			
		||||
 | 
			
		||||
    # nginx does not auto-rotate session ticket keys: only a HUP / restart will do so and
 | 
			
		||||
    # when a restart is performed the previous key is lost, which resets all previous
 | 
			
		||||
    # sessions. The fix for this is to setup a manual rotation mechanism:
 | 
			
		||||
    # http://trac.nginx.org/nginx/changeset/1356a3b9692441e163b4e78be4e9f5a46c7479e9/nginx
 | 
			
		||||
    #
 | 
			
		||||
    # Note that you'll have to define and rotate the keys securely by yourself. In absence
 | 
			
		||||
    # of such infrastructure, consider turning off session tickets:
 | 
			
		||||
    ssl_session_tickets off;
 | 
			
		||||
 | 
			
		||||
    {% if enable_hsts == True %}
 | 
			
		||||
    {% if enable_hsts == true %}
 | 
			
		||||
    # Enable this if you want HSTS (recommended, but be careful)
 | 
			
		||||
    # Include all subdomains and indicate to Google that we want this pre-loaded in Chrome's HSTS store
 | 
			
		||||
    # See: https://hstspreload.appspot.com/
 | 
			
		||||
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
 | 
			
		||||
    add_header Strict-Transport-Security "max-age={{ nginx_hsts_max_age }}; includeSubDomains; preload" always;
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,7 @@
 | 
			
		||||
{{ ansible_managed | comment }}
 | 
			
		||||
 | 
			
		||||
{% if ansible_distribution == 'Ubuntu' %}
 | 
			
		||||
 | 
			
		||||
{% if nginx_version == "stable" %}
 | 
			
		||||
deb [arch=amd64] https://nginx.org/packages/ubuntu/ {{ ansible_distribution_release }} nginx
 | 
			
		||||
deb [arch=amd64 signed-by=/usr/share/keyrings/nginx_signing.key] https://nginx.org/packages/debian/ {{ ansible_distribution_release }} nginx
 | 
			
		||||
{% elif nginx_version == "mainline" %}
 | 
			
		||||
deb [arch=amd64] https://nginx.org/packages/mainline/ubuntu/ {{ ansible_distribution_release }} nginx
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% elif ansible_distribution == 'Debian' %}
 | 
			
		||||
 | 
			
		||||
{% if nginx_version == "stable" %}
 | 
			
		||||
deb [arch=amd64] https://nginx.org/packages/debian/ {{ ansible_distribution_release }} nginx
 | 
			
		||||
{% elif nginx_version == "mainline" %}
 | 
			
		||||
deb [arch=amd64] https://nginx.org/packages/mainline/debian/ {{ ansible_distribution_release }} nginx
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
deb [arch=amd64 signed-by=/usr/share/keyrings/nginx_signing.key] https://nginx.org/packages/mainline/debian/ {{ ansible_distribution_release }} nginx
 | 
			
		||||
{% endif %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Renew Let's Encrypt certificates
 | 
			
		||||
ConditionFileIsExecutable={{ letsencrypt_certbot_dest }}
 | 
			
		||||
ConditionFileIsExecutable={{ letsencrypt_acme_home }}/acme.sh
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=oneshot
 | 
			
		||||
ExecStart={{ letsencrypt_certbot_dest }} renew --standalone --pre-hook "/bin/systemctl stop nginx" --post-hook "/bin/systemctl start nginx"
 | 
			
		||||
ExecStart={{ letsencrypt_acme_home }}/acme.sh --cron --home {{ letsencrypt_acme_home }} --reloadcmd "/bin/systemctl reload nginx" -w /var/lib/letsencrypt
 | 
			
		||||
 | 
			
		||||
SuccessExitStatus=0 2
 | 
			
		||||
 
 | 
			
		||||
@@ -4,9 +4,16 @@
 | 
			
		||||
{% set domain_name    = item.domain_name %}
 | 
			
		||||
{% set domain_aliases = item.domain_aliases | default("") %}
 | 
			
		||||
{# assume optional features are off unless a vhost explicitly sets them #}
 | 
			
		||||
{% set enable_hsts    = item.enable_hsts | default(False) %}
 | 
			
		||||
{% set has_wordpress  = item.has_wordpress | default(False) %}
 | 
			
		||||
{% set needs_php      = item.needs_php | default(False) %}
 | 
			
		||||
{% set enable_hsts    = item.enable_hsts | default(false) %}
 | 
			
		||||
{% set has_wordpress  = item.has_wordpress | default(false) %}
 | 
			
		||||
{% set needs_php      = item.needs_php | default(false) %}
 | 
			
		||||
{% set has_gitea      = item.has_gitea | default(false) %}
 | 
			
		||||
{# Allow sites to override the document root #}
 | 
			
		||||
{% if item.document_root is defined %}
 | 
			
		||||
{%   set document_root = item.document_root %}
 | 
			
		||||
{% else %}
 | 
			
		||||
{%   set document_root = (nginx_root_prefix, domain_name) | ansible.builtin.path_join %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
# http -> https vhost
 | 
			
		||||
server {
 | 
			
		||||
@@ -14,6 +21,8 @@ server {
 | 
			
		||||
    listen [::]:80;
 | 
			
		||||
    server_name {{ domain_name }} {{ domain_aliases }};
 | 
			
		||||
 | 
			
		||||
    {% include 'well-known.j2' %}
 | 
			
		||||
 | 
			
		||||
    # redirect http -> https
 | 
			
		||||
    location / {
 | 
			
		||||
        # ? in rewrite makes sure nginx doesn't append query string again
 | 
			
		||||
@@ -23,31 +32,36 @@ server {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
server {
 | 
			
		||||
    listen 443 ssl http2;
 | 
			
		||||
    listen [::]:443 ssl http2;
 | 
			
		||||
    listen 443 ssl;
 | 
			
		||||
    listen [::]:443 ssl;
 | 
			
		||||
    http2 on;
 | 
			
		||||
 | 
			
		||||
    root {{ nginx_root_prefix }}/{{ domain_name }};
 | 
			
		||||
    root {{ document_root }};
 | 
			
		||||
 | 
			
		||||
    {# will only work if the TLS cert covers the domain + aliases, like example.com and www.example.com #}
 | 
			
		||||
    server_name {{ domain_name }} {{ domain_aliases }};
 | 
			
		||||
 | 
			
		||||
    index {% if has_wordpress == True or needs_php == True %}index.php{% else %}index.html{% endif %};
 | 
			
		||||
    index {% if has_wordpress == true or needs_php == true %}index.php{% else %}index.html{% endif %};
 | 
			
		||||
 | 
			
		||||
    access_log  /var/log/nginx/{{ domain_name }}-access.log;
 | 
			
		||||
    error_log   /var/log/nginx/{{ domain_name }}-error.log;
 | 
			
		||||
 | 
			
		||||
    {% include 'https.j2' %}
 | 
			
		||||
 | 
			
		||||
    {% if has_wordpress == True %}
 | 
			
		||||
    {% if has_wordpress == true %}
 | 
			
		||||
        {% include 'wordpress.j2' %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    {% if has_gitea == true %}
 | 
			
		||||
        {% include 'gitea.j2' %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    error_page 500 502 503 504 /50x.html;
 | 
			
		||||
    location = /50x.html {
 | 
			
		||||
        root /usr/share/nginx/html;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {% if has_wordpress == True or needs_php == True %}
 | 
			
		||||
    {% if has_wordpress == true or needs_php == true %}
 | 
			
		||||
    location ~ [^/]\.php(/|$) {
 | 
			
		||||
        # Zero-day exploit defense.
 | 
			
		||||
        # http://forum.nginx.org/read.php?2,88845,page=3
 | 
			
		||||
@@ -63,17 +77,8 @@ server {
 | 
			
		||||
        # See: https://httpoxy.org/
 | 
			
		||||
        fastcgi_param HTTP_PROXY "";
 | 
			
		||||
 | 
			
		||||
        {# As of Ubuntu 16.04 and Debian 9, the PHP-FPM configs are the same #}
 | 
			
		||||
        {% if (ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('16.04', '==')) or (ansible_distribution == 'Debian' and ansible_distribution_major_version is version('9', '==')) %}
 | 
			
		||||
        fastcgi_pass unix:/run/php/php7.0-fpm-{{ domain_name }}.sock;
 | 
			
		||||
        {% elif ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('18.04', '==') %}
 | 
			
		||||
        fastcgi_pass unix:/run/php/php7.2-fpm-{{ domain_name }}.sock;
 | 
			
		||||
        {% elif ansible_distribution == 'Debian' and ansible_distribution_version is version('10', '==') %}
 | 
			
		||||
        fastcgi_pass unix:/run/php/php7.3-fpm-{{ domain_name }}.sock;
 | 
			
		||||
        {% elif ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('20.04', '==') %}
 | 
			
		||||
        fastcgi_pass unix:/run/php/php7.4-fpm-{{ domain_name }}.sock;
 | 
			
		||||
        {% else %}
 | 
			
		||||
        fastcgi_pass unix:/var/run/php5-fpm-{{ domain_name }}.sock;
 | 
			
		||||
        {% if ansible_distribution_major_version is version('12', '==') %}
 | 
			
		||||
        fastcgi_pass unix:/run/php/php8.2-fpm-{{ domain_name }}.sock;
 | 
			
		||||
        {% endif %}
 | 
			
		||||
        fastcgi_index index.php;
 | 
			
		||||
        # set script path relative to document root in server block
 | 
			
		||||
@@ -87,11 +92,11 @@ server {
 | 
			
		||||
        fastcgi_cache_bypass $http_pragma $wordpress_logged_in;
 | 
			
		||||
        fastcgi_no_cache $http_pragma $wordpress_logged_in;
 | 
			
		||||
 | 
			
		||||
        {% if enable_hsts == True %}
 | 
			
		||||
        {% if enable_hsts == true %}
 | 
			
		||||
        # Enable this if you want HSTS (recommended, but be careful)
 | 
			
		||||
        # Include all subdomains and indicate to Google that we want this pre-loaded in Chrome's HSTS store
 | 
			
		||||
        # See: https://hstspreload.appspot.com/
 | 
			
		||||
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
 | 
			
		||||
        add_header Strict-Transport-Security "max-age={{ nginx_hsts_max_age }}; includeSubDomains; preload" always;
 | 
			
		||||
        {% endif %}
 | 
			
		||||
 | 
			
		||||
        include extra-security.conf;
 | 
			
		||||
@@ -101,7 +106,7 @@ server {
 | 
			
		||||
    include extra-security.conf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{% if has_wordpress == True %}
 | 
			
		||||
{% if has_wordpress == true %}
 | 
			
		||||
# Check if a user is logged in
 | 
			
		||||
# if so, set $wordpress_logged_in = 1
 | 
			
		||||
# otherwise, set $wordpress_logged_in = 0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								roles/nginx/templates/well-known.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								roles/nginx/templates/well-known.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
location ^~ /.well-known/acme-challenge/ {
 | 
			
		||||
  allow all;
 | 
			
		||||
  root /var/lib/letsencrypt/;
 | 
			
		||||
  default_type "text/plain";
 | 
			
		||||
  try_files $uri =404;
 | 
			
		||||
}
 | 
			
		||||
@@ -5,22 +5,22 @@
 | 
			
		||||
    location / {
 | 
			
		||||
        try_files $uri $uri/ /index.php?$args;
 | 
			
		||||
 | 
			
		||||
        {% if enable_hsts == True %}
 | 
			
		||||
        {% if enable_hsts == true %}
 | 
			
		||||
        # Enable this if you want HSTS (recommended, but be careful)
 | 
			
		||||
        # Include all subdomains and indicate to Google that we want this pre-loaded in Chrome's HSTS store
 | 
			
		||||
        # See: https://hstspreload.appspot.com/
 | 
			
		||||
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
 | 
			
		||||
        add_header Strict-Transport-Security "max-age={{ nginx_hsts_max_age }}; includeSubDomains; preload" always;
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    location ~* \.(?:ico|css|js|gif|jpe?g|png|svg)$ {
 | 
			
		||||
        add_header Cache-Control "max-age=604800";
 | 
			
		||||
 | 
			
		||||
        {% if enable_hsts == True %}
 | 
			
		||||
        {% if enable_hsts == true %}
 | 
			
		||||
        # Enable this if you want HSTS (recommended, but be careful)
 | 
			
		||||
        # Include all subdomains and indicate to Google that we want this pre-loaded in Chrome's HSTS store
 | 
			
		||||
        # See: https://hstspreload.appspot.com/
 | 
			
		||||
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
 | 
			
		||||
        add_header Strict-Transport-Security "max-age={{ nginx_hsts_max_age }}; includeSubDomains; preload" always;
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    }   
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
# For Ubuntu 18.04
 | 
			
		||||
- name: reload php7.2-fpm
 | 
			
		||||
  systemd: name=php7.2-fpm state=reloaded
 | 
			
		||||
 | 
			
		||||
# For Debian 10
 | 
			
		||||
- name: reload php7.3-fpm
 | 
			
		||||
  systemd: name=php7.3-fpm state=reloaded
 | 
			
		||||
 | 
			
		||||
# For Ubuntu 20.04
 | 
			
		||||
- name: reload php7.4-fpm
 | 
			
		||||
  systemd: name=php7.4-fpm state=reloaded
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Set php-fpm packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      php_fpm_packages:
 | 
			
		||||
        - php-fpm
 | 
			
		||||
        # for WordPress
 | 
			
		||||
        - php-mysql
 | 
			
		||||
        - php-gd
 | 
			
		||||
        - php-curl
 | 
			
		||||
        # for Piwik
 | 
			
		||||
        - php-mbstring
 | 
			
		||||
        - php-xml
 | 
			
		||||
 | 
			
		||||
  - name: Install php-fpm and deps
 | 
			
		||||
    apt: name={{ php_fpm_packages }} state=present update_cache=yes
 | 
			
		||||
 | 
			
		||||
  # only copy php-fpm config for vhosts that need WordPress or PHP
 | 
			
		||||
  - name: Copy php-fpm pool config
 | 
			
		||||
    template: src=php7.3-pool.conf.j2 dest=/etc/php/7.3/fpm/pool.d/{{ item.domain_name }}.conf owner=root group=root mode=0644
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
    when: (item.has_wordpress is defined and item.has_wordpress) or (item.needs_php is defined and item.needs_php)
 | 
			
		||||
    notify: reload php7.3-fpm
 | 
			
		||||
 | 
			
		||||
  - name: Remove default www pool
 | 
			
		||||
    file: path=/etc/php/7.3/fpm/pool.d/www.conf state=absent
 | 
			
		||||
    notify: reload php7.3-fpm
 | 
			
		||||
 | 
			
		||||
  # re-configure php.ini
 | 
			
		||||
  - name: Update php.ini
 | 
			
		||||
    template: src=php7.3-php.ini.j2 dest=/etc/php/7.3/fpm/php.ini owner=root group=root mode=0644
 | 
			
		||||
    notify: reload php7.3-fpm
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Set php-fpm packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      php_fpm_packages:
 | 
			
		||||
        - php-fpm
 | 
			
		||||
        # for WordPress
 | 
			
		||||
        - php-mysql
 | 
			
		||||
        - php-gd
 | 
			
		||||
        - php-curl
 | 
			
		||||
        # for Piwik
 | 
			
		||||
        - php-mbstring
 | 
			
		||||
        - php-xml
 | 
			
		||||
 | 
			
		||||
  - name: Install php-fpm and deps
 | 
			
		||||
    apt: name={{ php_fpm_packages }} state=present update_cache=yes
 | 
			
		||||
 | 
			
		||||
  # only copy php-fpm config for vhosts that need WordPress or PHP
 | 
			
		||||
  - name: Copy php-fpm pool config
 | 
			
		||||
    template: src=php7.2-pool.conf.j2 dest=/etc/php/7.2/fpm/pool.d/{{ item.domain_name }}.conf owner=root group=root mode=0644
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
    when: (item.has_wordpress is defined and item.has_wordpress) or (item.needs_php is defined and item.needs_php)
 | 
			
		||||
    notify: reload php7.2-fpm
 | 
			
		||||
 | 
			
		||||
  - name: Remove default www pool
 | 
			
		||||
    file: path=/etc/php/7.2/fpm/pool.d/www.conf state=absent
 | 
			
		||||
    notify: reload php7.2-fpm
 | 
			
		||||
 | 
			
		||||
  # re-configure php.ini
 | 
			
		||||
  - name: Update php.ini
 | 
			
		||||
    template: src=php7.2-php.ini.j2 dest=/etc/php/7.2/fpm/php.ini owner=root group=root mode=0644
 | 
			
		||||
    notify: reload php7.2-fpm
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- block:
 | 
			
		||||
  - name: Set php-fpm packages
 | 
			
		||||
    set_fact:
 | 
			
		||||
      php_fpm_packages:
 | 
			
		||||
        - php-fpm
 | 
			
		||||
        # for WordPress
 | 
			
		||||
        - php-mysql
 | 
			
		||||
        - php-gd
 | 
			
		||||
        - php-curl
 | 
			
		||||
        # for Piwik
 | 
			
		||||
        - php-mbstring
 | 
			
		||||
        - php-xml
 | 
			
		||||
 | 
			
		||||
  - name: Install php-fpm and deps
 | 
			
		||||
    apt: name={{ php_fpm_packages }} state=present update_cache=yes
 | 
			
		||||
 | 
			
		||||
  # only copy php-fpm config for vhosts that need WordPress or PHP
 | 
			
		||||
  - name: Copy php-fpm pool config
 | 
			
		||||
    template: src=php7.4-pool.conf.j2 dest=/etc/php/7.4/fpm/pool.d/{{ item.domain_name }}.conf owner=root group=root mode=0644
 | 
			
		||||
    loop: "{{ nginx_vhosts }}"
 | 
			
		||||
    when: (item.has_wordpress is defined and item.has_wordpress) or (item.needs_php is defined and item.needs_php)
 | 
			
		||||
    notify: reload php7.4-fpm
 | 
			
		||||
 | 
			
		||||
  - name: Remove default www pool
 | 
			
		||||
    file: path=/etc/php/7.4/fpm/pool.d/www.conf state=absent
 | 
			
		||||
    notify: reload php7.4-fpm
 | 
			
		||||
 | 
			
		||||
  # re-configure php.ini
 | 
			
		||||
  - name: Update php.ini
 | 
			
		||||
    template: src=php7.4-php.ini.j2 dest=/etc/php/7.4/fpm/php.ini owner=root group=root mode=0644
 | 
			
		||||
    notify: reload php7.4-fpm
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
# Ubuntu 18.04 uses php-fpm 7.2
 | 
			
		||||
# Debian 10 uses php-fpm 7.3
 | 
			
		||||
# Ubuntu 20.04 uses PHP 7.4
 | 
			
		||||
 | 
			
		||||
- name: Configure php-fpm on Ubuntu 18.04
 | 
			
		||||
  include_tasks: Ubuntu_18.04.yml
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('18.04', '==')
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
- name: Configure php-fpm on Debian 10
 | 
			
		||||
  include_tasks: Debian_10.yml
 | 
			
		||||
  when: ansible_distribution == 'Debian' and ansible_distribution_version is version('10', '==')
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
- name: Configure php-fpm on Ubuntu 20.04
 | 
			
		||||
  include_tasks: Ubuntu_20.04.yml
 | 
			
		||||
  when: ansible_distribution == 'Ubuntu' and ansible_distribution_version is version('20.04', '==')
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,415 +0,0 @@
 | 
			
		||||
{% set domain_name  = item.domain_name %}
 | 
			
		||||
 | 
			
		||||
; Start a new pool named '{{ domain_name }}'.
 | 
			
		||||
; the variable $pool can we used in any directive and will be replaced by the
 | 
			
		||||
; pool name ('{{ domain_name }}' here)
 | 
			
		||||
[{{ domain_name }}]
 | 
			
		||||
 | 
			
		||||
; Per pool prefix
 | 
			
		||||
; It only applies on the following directives:
 | 
			
		||||
; - 'access.log'
 | 
			
		||||
; - 'slowlog'
 | 
			
		||||
; - 'listen' (unixsocket)
 | 
			
		||||
; - 'chroot'
 | 
			
		||||
; - 'chdir'
 | 
			
		||||
; - 'php_values'
 | 
			
		||||
; - 'php_admin_values'
 | 
			
		||||
; When not set, the global prefix (or /usr) applies instead.
 | 
			
		||||
; Note: This directive can also be relative to the global prefix.
 | 
			
		||||
; Default Value: none
 | 
			
		||||
;prefix = /path/to/pools/$pool
 | 
			
		||||
 | 
			
		||||
; Unix user/group of processes
 | 
			
		||||
; Note: The user is mandatory. If the group is not set, the default user's group
 | 
			
		||||
;       will be used.
 | 
			
		||||
user = nginx
 | 
			
		||||
group = nginx
 | 
			
		||||
 | 
			
		||||
; The address on which to accept FastCGI requests.
 | 
			
		||||
; Valid syntaxes are:
 | 
			
		||||
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
 | 
			
		||||
;                            a specific port;
 | 
			
		||||
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
 | 
			
		||||
;                            a specific port;
 | 
			
		||||
;   'port'                 - to listen on a TCP socket to all addresses
 | 
			
		||||
;                            (IPv6 and IPv4-mapped) on a specific port;
 | 
			
		||||
;   '/path/to/unix/socket' - to listen on a unix socket.
 | 
			
		||||
; Note: This value is mandatory.
 | 
			
		||||
listen = /run/php/php7.2-fpm-{{ domain_name }}.sock
 | 
			
		||||
 | 
			
		||||
; Set listen(2) backlog.
 | 
			
		||||
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
 | 
			
		||||
;listen.backlog = 511
 | 
			
		||||
 | 
			
		||||
; Set permissions for unix socket, if one is used. In Linux, read/write
 | 
			
		||||
; permissions must be set in order to allow connections from a web server. Many
 | 
			
		||||
; BSD-derived systems allow connections regardless of permissions.
 | 
			
		||||
; Default Values: user and group are set as the running user
 | 
			
		||||
;                 mode is set to 0660
 | 
			
		||||
listen.owner = nginx
 | 
			
		||||
listen.group = nginx
 | 
			
		||||
;listen.mode = 0660
 | 
			
		||||
; When POSIX Access Control Lists are supported you can set them using
 | 
			
		||||
; these options, value is a comma separated list of user/group names.
 | 
			
		||||
; When set, listen.owner and listen.group are ignored
 | 
			
		||||
;listen.acl_users =
 | 
			
		||||
;listen.acl_groups =
 | 
			
		||||
 | 
			
		||||
; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
 | 
			
		||||
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
 | 
			
		||||
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
 | 
			
		||||
; must be separated by a comma. If this value is left blank, connections will be
 | 
			
		||||
; accepted from any ip address.
 | 
			
		||||
; Default Value: any
 | 
			
		||||
;listen.allowed_clients = 127.0.0.1
 | 
			
		||||
 | 
			
		||||
; Specify the nice(2) priority to apply to the pool processes (only if set)
 | 
			
		||||
; The value can vary from -19 (highest priority) to 20 (lower priority)
 | 
			
		||||
; Note: - It will only work if the FPM master process is launched as root
 | 
			
		||||
;       - The pool processes will inherit the master process priority
 | 
			
		||||
;         unless it specified otherwise
 | 
			
		||||
; Default Value: no set
 | 
			
		||||
; process.priority = -19
 | 
			
		||||
 | 
			
		||||
; Choose how the process manager will control the number of child processes.
 | 
			
		||||
; Possible Values:
 | 
			
		||||
;   static  - a fixed number (pm.max_children) of child processes;
 | 
			
		||||
;   dynamic - the number of child processes are set dynamically based on the
 | 
			
		||||
;             following directives. With this process management, there will be
 | 
			
		||||
;             always at least 1 children.
 | 
			
		||||
;             pm.max_children      - the maximum number of children that can
 | 
			
		||||
;                                    be alive at the same time.
 | 
			
		||||
;             pm.start_servers     - the number of children created on startup.
 | 
			
		||||
;             pm.min_spare_servers - the minimum number of children in 'idle'
 | 
			
		||||
;                                    state (waiting to process). If the number
 | 
			
		||||
;                                    of 'idle' processes is less than this
 | 
			
		||||
;                                    number then some children will be created.
 | 
			
		||||
;             pm.max_spare_servers - the maximum number of children in 'idle'
 | 
			
		||||
;                                    state (waiting to process). If the number
 | 
			
		||||
;                                    of 'idle' processes is greater than this
 | 
			
		||||
;                                    number then some children will be killed.
 | 
			
		||||
;  ondemand - no children are created at startup. Children will be forked when
 | 
			
		||||
;             new requests will connect. The following parameter are used:
 | 
			
		||||
;             pm.max_children           - the maximum number of children that
 | 
			
		||||
;                                         can be alive at the same time.
 | 
			
		||||
;             pm.process_idle_timeout   - The number of seconds after which
 | 
			
		||||
;                                         an idle process will be killed.
 | 
			
		||||
; Note: This value is mandatory.
 | 
			
		||||
pm = dynamic
 | 
			
		||||
 | 
			
		||||
; The number of child processes to be created when pm is set to 'static' and the
 | 
			
		||||
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
 | 
			
		||||
; This value sets the limit on the number of simultaneous requests that will be
 | 
			
		||||
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
 | 
			
		||||
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
 | 
			
		||||
; CGI. The below defaults are based on a server without much resources. Don't
 | 
			
		||||
; forget to tweak pm.* to fit your needs.
 | 
			
		||||
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
 | 
			
		||||
; Note: This value is mandatory.
 | 
			
		||||
pm.max_children = 5
 | 
			
		||||
 | 
			
		||||
; The number of child processes created on startup.
 | 
			
		||||
; Note: Used only when pm is set to 'dynamic'
 | 
			
		||||
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
 | 
			
		||||
pm.start_servers = 2
 | 
			
		||||
 | 
			
		||||
; The desired minimum number of idle server processes.
 | 
			
		||||
; Note: Used only when pm is set to 'dynamic'
 | 
			
		||||
; Note: Mandatory when pm is set to 'dynamic'
 | 
			
		||||
pm.min_spare_servers = 1
 | 
			
		||||
 | 
			
		||||
; The desired maximum number of idle server processes.
 | 
			
		||||
; Note: Used only when pm is set to 'dynamic'
 | 
			
		||||
; Note: Mandatory when pm is set to 'dynamic'
 | 
			
		||||
pm.max_spare_servers = 3
 | 
			
		||||
 | 
			
		||||
; The number of seconds after which an idle process will be killed.
 | 
			
		||||
; Note: Used only when pm is set to 'ondemand'
 | 
			
		||||
; Default Value: 10s
 | 
			
		||||
;pm.process_idle_timeout = 10s;
 | 
			
		||||
 | 
			
		||||
; The number of requests each child process should execute before respawning.
 | 
			
		||||
; This can be useful to work around memory leaks in 3rd party libraries. For
 | 
			
		||||
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
 | 
			
		||||
; Default Value: 0
 | 
			
		||||
;pm.max_requests = 500
 | 
			
		||||
 | 
			
		||||
; The URI to view the FPM status page. If this value is not set, no URI will be
 | 
			
		||||
; recognized as a status page. It shows the following informations:
 | 
			
		||||
;   pool                 - the name of the pool;
 | 
			
		||||
;   process manager      - static, dynamic or ondemand;
 | 
			
		||||
;   start time           - the date and time FPM has started;
 | 
			
		||||
;   start since          - number of seconds since FPM has started;
 | 
			
		||||
;   accepted conn        - the number of request accepted by the pool;
 | 
			
		||||
;   listen queue         - the number of request in the queue of pending
 | 
			
		||||
;                          connections (see backlog in listen(2));
 | 
			
		||||
;   max listen queue     - the maximum number of requests in the queue
 | 
			
		||||
;                          of pending connections since FPM has started;
 | 
			
		||||
;   listen queue len     - the size of the socket queue of pending connections;
 | 
			
		||||
;   idle processes       - the number of idle processes;
 | 
			
		||||
;   active processes     - the number of active processes;
 | 
			
		||||
;   total processes      - the number of idle + active processes;
 | 
			
		||||
;   max active processes - the maximum number of active processes since FPM
 | 
			
		||||
;                          has started;
 | 
			
		||||
;   max children reached - number of times, the process limit has been reached,
 | 
			
		||||
;                          when pm tries to start more children (works only for
 | 
			
		||||
;                          pm 'dynamic' and 'ondemand');
 | 
			
		||||
; Value are updated in real time.
 | 
			
		||||
; Example output:
 | 
			
		||||
;   pool:                 www
 | 
			
		||||
;   process manager:      static
 | 
			
		||||
;   start time:           01/Jul/2011:17:53:49 +0200
 | 
			
		||||
;   start since:          62636
 | 
			
		||||
;   accepted conn:        190460
 | 
			
		||||
;   listen queue:         0
 | 
			
		||||
;   max listen queue:     1
 | 
			
		||||
;   listen queue len:     42
 | 
			
		||||
;   idle processes:       4
 | 
			
		||||
;   active processes:     11
 | 
			
		||||
;   total processes:      15
 | 
			
		||||
;   max active processes: 12
 | 
			
		||||
;   max children reached: 0
 | 
			
		||||
;
 | 
			
		||||
; By default the status page output is formatted as text/plain. Passing either
 | 
			
		||||
; 'html', 'xml' or 'json' in the query string will return the corresponding
 | 
			
		||||
; output syntax. Example:
 | 
			
		||||
;   http://www.foo.bar/status
 | 
			
		||||
;   http://www.foo.bar/status?json
 | 
			
		||||
;   http://www.foo.bar/status?html
 | 
			
		||||
;   http://www.foo.bar/status?xml
 | 
			
		||||
;
 | 
			
		||||
; By default the status page only outputs short status. Passing 'full' in the
 | 
			
		||||
; query string will also return status for each pool process.
 | 
			
		||||
; Example:
 | 
			
		||||
;   http://www.foo.bar/status?full
 | 
			
		||||
;   http://www.foo.bar/status?json&full
 | 
			
		||||
;   http://www.foo.bar/status?html&full
 | 
			
		||||
;   http://www.foo.bar/status?xml&full
 | 
			
		||||
; The Full status returns for each process:
 | 
			
		||||
;   pid                  - the PID of the process;
 | 
			
		||||
;   state                - the state of the process (Idle, Running, ...);
 | 
			
		||||
;   start time           - the date and time the process has started;
 | 
			
		||||
;   start since          - the number of seconds since the process has started;
 | 
			
		||||
;   requests             - the number of requests the process has served;
 | 
			
		||||
;   request duration     - the duration in µs of the requests;
 | 
			
		||||
;   request method       - the request method (GET, POST, ...);
 | 
			
		||||
;   request URI          - the request URI with the query string;
 | 
			
		||||
;   content length       - the content length of the request (only with POST);
 | 
			
		||||
;   user                 - the user (PHP_AUTH_USER) (or '-' if not set);
 | 
			
		||||
;   script               - the main script called (or '-' if not set);
 | 
			
		||||
;   last request cpu     - the %cpu the last request consumed
 | 
			
		||||
;                          it's always 0 if the process is not in Idle state
 | 
			
		||||
;                          because CPU calculation is done when the request
 | 
			
		||||
;                          processing has terminated;
 | 
			
		||||
;   last request memory  - the max amount of memory the last request consumed
 | 
			
		||||
;                          it's always 0 if the process is not in Idle state
 | 
			
		||||
;                          because memory calculation is done when the request
 | 
			
		||||
;                          processing has terminated;
 | 
			
		||||
; If the process is in Idle state, then informations are related to the
 | 
			
		||||
; last request the process has served. Otherwise informations are related to
 | 
			
		||||
; the current request being served.
 | 
			
		||||
; Example output:
 | 
			
		||||
;   ************************
 | 
			
		||||
;   pid:                  31330
 | 
			
		||||
;   state:                Running
 | 
			
		||||
;   start time:           01/Jul/2011:17:53:49 +0200
 | 
			
		||||
;   start since:          63087
 | 
			
		||||
;   requests:             12808
 | 
			
		||||
;   request duration:     1250261
 | 
			
		||||
;   request method:       GET
 | 
			
		||||
;   request URI:          /test_mem.php?N=10000
 | 
			
		||||
;   content length:       0
 | 
			
		||||
;   user:                 -
 | 
			
		||||
;   script:               /home/fat/web/docs/php/test_mem.php
 | 
			
		||||
;   last request cpu:     0.00
 | 
			
		||||
;   last request memory:  0
 | 
			
		||||
;
 | 
			
		||||
; Note: There is a real-time FPM status monitoring sample web page available
 | 
			
		||||
;       It's available in: /usr/share/php/7.2/fpm/status.html
 | 
			
		||||
;
 | 
			
		||||
; Note: The value must start with a leading slash (/). The value can be
 | 
			
		||||
;       anything, but it may not be a good idea to use the .php extension or it
 | 
			
		||||
;       may conflict with a real PHP file.
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
;pm.status_path = /status
 | 
			
		||||
 | 
			
		||||
; The ping URI to call the monitoring page of FPM. If this value is not set, no
 | 
			
		||||
; URI will be recognized as a ping page. This could be used to test from outside
 | 
			
		||||
; that FPM is alive and responding, or to
 | 
			
		||||
; - create a graph of FPM availability (rrd or such);
 | 
			
		||||
; - remove a server from a group if it is not responding (load balancing);
 | 
			
		||||
; - trigger alerts for the operating team (24/7).
 | 
			
		||||
; Note: The value must start with a leading slash (/). The value can be
 | 
			
		||||
;       anything, but it may not be a good idea to use the .php extension or it
 | 
			
		||||
;       may conflict with a real PHP file.
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
;ping.path = /ping
 | 
			
		||||
 | 
			
		||||
; This directive may be used to customize the response of a ping request. The
 | 
			
		||||
; response is formatted as text/plain with a 200 response code.
 | 
			
		||||
; Default Value: pong
 | 
			
		||||
;ping.response = pong
 | 
			
		||||
 | 
			
		||||
; The access log file
 | 
			
		||||
; Default: not set
 | 
			
		||||
;access.log = log/$pool.access.log
 | 
			
		||||
 | 
			
		||||
; The access log format.
 | 
			
		||||
; The following syntax is allowed
 | 
			
		||||
;  %%: the '%' character
 | 
			
		||||
;  %C: %CPU used by the request
 | 
			
		||||
;      it can accept the following format:
 | 
			
		||||
;      - %{user}C for user CPU only
 | 
			
		||||
;      - %{system}C for system CPU only
 | 
			
		||||
;      - %{total}C  for user + system CPU (default)
 | 
			
		||||
;  %d: time taken to serve the request
 | 
			
		||||
;      it can accept the following format:
 | 
			
		||||
;      - %{seconds}d (default)
 | 
			
		||||
;      - %{miliseconds}d
 | 
			
		||||
;      - %{mili}d
 | 
			
		||||
;      - %{microseconds}d
 | 
			
		||||
;      - %{micro}d
 | 
			
		||||
;  %e: an environment variable (same as $_ENV or $_SERVER)
 | 
			
		||||
;      it must be associated with embraces to specify the name of the env
 | 
			
		||||
;      variable. Some exemples:
 | 
			
		||||
;      - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
 | 
			
		||||
;      - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
 | 
			
		||||
;  %f: script filename
 | 
			
		||||
;  %l: content-length of the request (for POST request only)
 | 
			
		||||
;  %m: request method
 | 
			
		||||
;  %M: peak of memory allocated by PHP
 | 
			
		||||
;      it can accept the following format:
 | 
			
		||||
;      - %{bytes}M (default)
 | 
			
		||||
;      - %{kilobytes}M
 | 
			
		||||
;      - %{kilo}M
 | 
			
		||||
;      - %{megabytes}M
 | 
			
		||||
;      - %{mega}M
 | 
			
		||||
;  %n: pool name
 | 
			
		||||
;  %o: output header
 | 
			
		||||
;      it must be associated with embraces to specify the name of the header:
 | 
			
		||||
;      - %{Content-Type}o
 | 
			
		||||
;      - %{X-Powered-By}o
 | 
			
		||||
;      - %{Transfert-Encoding}o
 | 
			
		||||
;      - ....
 | 
			
		||||
;  %p: PID of the child that serviced the request
 | 
			
		||||
;  %P: PID of the parent of the child that serviced the request
 | 
			
		||||
;  %q: the query string
 | 
			
		||||
;  %Q: the '?' character if query string exists
 | 
			
		||||
;  %r: the request URI (without the query string, see %q and %Q)
 | 
			
		||||
;  %R: remote IP address
 | 
			
		||||
;  %s: status (response code)
 | 
			
		||||
;  %t: server time the request was received
 | 
			
		||||
;      it can accept a strftime(3) format:
 | 
			
		||||
;      %d/%b/%Y:%H:%M:%S %z (default)
 | 
			
		||||
;  %T: time the log has been written (the request has finished)
 | 
			
		||||
;      it can accept a strftime(3) format:
 | 
			
		||||
;      %d/%b/%Y:%H:%M:%S %z (default)
 | 
			
		||||
;  %u: remote user
 | 
			
		||||
;
 | 
			
		||||
; Default: "%R - %u %t \"%m %r\" %s"
 | 
			
		||||
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
 | 
			
		||||
 | 
			
		||||
; The log file for slow requests
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
; Note: slowlog is mandatory if request_slowlog_timeout is set
 | 
			
		||||
;slowlog = log/$pool.log.slow
 | 
			
		||||
 | 
			
		||||
; The timeout for serving a single request after which a PHP backtrace will be
 | 
			
		||||
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
 | 
			
		||||
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
 | 
			
		||||
; Default Value: 0
 | 
			
		||||
;request_slowlog_timeout = 0
 | 
			
		||||
 | 
			
		||||
; Depth of slow log stack trace.
 | 
			
		||||
; Default Value: 20
 | 
			
		||||
;request_slowlog_trace_depth = 20
 | 
			
		||||
 | 
			
		||||
; The timeout for serving a single request after which the worker process will
 | 
			
		||||
; be killed. This option should be used when the 'max_execution_time' ini option
 | 
			
		||||
; does not stop script execution for some reason. A value of '0' means 'off'.
 | 
			
		||||
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
 | 
			
		||||
; Default Value: 0
 | 
			
		||||
;request_terminate_timeout = 0
 | 
			
		||||
 | 
			
		||||
; Set open file descriptor rlimit.
 | 
			
		||||
; Default Value: system defined value
 | 
			
		||||
;rlimit_files = 1024
 | 
			
		||||
 | 
			
		||||
; Set max core size rlimit.
 | 
			
		||||
; Possible Values: 'unlimited' or an integer greater or equal to 0
 | 
			
		||||
; Default Value: system defined value
 | 
			
		||||
;rlimit_core = 0
 | 
			
		||||
 | 
			
		||||
; Chroot to this directory at the start. This value must be defined as an
 | 
			
		||||
; absolute path. When this value is not set, chroot is not used.
 | 
			
		||||
; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
 | 
			
		||||
; of its subdirectories. If the pool prefix is not set, the global prefix
 | 
			
		||||
; will be used instead.
 | 
			
		||||
; Note: chrooting is a great security feature and should be used whenever
 | 
			
		||||
;       possible. However, all PHP paths will be relative to the chroot
 | 
			
		||||
;       (error_log, sessions.save_path, ...).
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
;chroot =
 | 
			
		||||
 | 
			
		||||
; Chdir to this directory at the start.
 | 
			
		||||
; Note: relative path can be used.
 | 
			
		||||
; Default Value: current directory or / when chroot
 | 
			
		||||
;chdir = /var/www
 | 
			
		||||
 | 
			
		||||
; Redirect worker stdout and stderr into main error log. If not set, stdout and
 | 
			
		||||
; stderr will be redirected to /dev/null according to FastCGI specs.
 | 
			
		||||
; Note: on highloaded environement, this can cause some delay in the page
 | 
			
		||||
; process time (several ms).
 | 
			
		||||
; Default Value: no
 | 
			
		||||
catch_workers_output = yes
 | 
			
		||||
 | 
			
		||||
; Clear environment in FPM workers
 | 
			
		||||
; Prevents arbitrary environment variables from reaching FPM worker processes
 | 
			
		||||
; by clearing the environment in workers before env vars specified in this
 | 
			
		||||
; pool configuration are added.
 | 
			
		||||
; Setting to "no" will make all environment variables available to PHP code
 | 
			
		||||
; via getenv(), $_ENV and $_SERVER.
 | 
			
		||||
; Default Value: yes
 | 
			
		||||
;clear_env = no
 | 
			
		||||
 | 
			
		||||
; Limits the extensions of the main script FPM will allow to parse. This can
 | 
			
		||||
; prevent configuration mistakes on the web server side. You should only limit
 | 
			
		||||
; FPM to .php extensions to prevent malicious users to use other extensions to
 | 
			
		||||
; execute php code.
 | 
			
		||||
; Note: set an empty value to allow all extensions.
 | 
			
		||||
; Default Value: .php
 | 
			
		||||
;security.limit_extensions = .php .php3 .php4 .php5 .php7
 | 
			
		||||
 | 
			
		||||
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
 | 
			
		||||
; the current environment.
 | 
			
		||||
; Default Value: clean env
 | 
			
		||||
;env[HOSTNAME] = $HOSTNAME
 | 
			
		||||
;env[PATH] = /usr/local/bin:/usr/bin:/bin
 | 
			
		||||
;env[TMP] = /tmp
 | 
			
		||||
;env[TMPDIR] = /tmp
 | 
			
		||||
;env[TEMP] = /tmp
 | 
			
		||||
 | 
			
		||||
; Additional php.ini defines, specific to this pool of workers. These settings
 | 
			
		||||
; overwrite the values previously defined in the php.ini. The directives are the
 | 
			
		||||
; same as the PHP SAPI:
 | 
			
		||||
;   php_value/php_flag             - you can set classic ini defines which can
 | 
			
		||||
;                                    be overwritten from PHP call 'ini_set'.
 | 
			
		||||
;   php_admin_value/php_admin_flag - these directives won't be overwritten by
 | 
			
		||||
;                                     PHP call 'ini_set'
 | 
			
		||||
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
 | 
			
		||||
 | 
			
		||||
; Defining 'extension' will load the corresponding shared extension from
 | 
			
		||||
; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
 | 
			
		||||
; overwrite previously defined php.ini values, but will append the new value
 | 
			
		||||
; instead.
 | 
			
		||||
 | 
			
		||||
; Note: path INI options can be relative and will be expanded with the prefix
 | 
			
		||||
; (pool, global or /usr)
 | 
			
		||||
 | 
			
		||||
; Default Value: nothing is defined by default except the values in php.ini and
 | 
			
		||||
;                specified at startup with the -d argument
 | 
			
		||||
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
 | 
			
		||||
;php_flag[display_errors] = off
 | 
			
		||||
;php_admin_value[error_log] = /var/log/fpm-php.www.log
 | 
			
		||||
;php_admin_flag[log_errors] = on
 | 
			
		||||
;php_admin_value[memory_limit] = 32M
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,428 +0,0 @@
 | 
			
		||||
{% set domain_name  = item.domain_name %}
 | 
			
		||||
 | 
			
		||||
; Start a new pool named '{{ domain_name }}'.
 | 
			
		||||
; the variable $pool can be used in any directive and will be replaced by the
 | 
			
		||||
; pool name ('{{ domain_name }}' here)
 | 
			
		||||
[{{ domain_name }}]
 | 
			
		||||
 | 
			
		||||
; Per pool prefix
 | 
			
		||||
; It only applies on the following directives:
 | 
			
		||||
; - 'access.log'
 | 
			
		||||
; - 'slowlog'
 | 
			
		||||
; - 'listen' (unixsocket)
 | 
			
		||||
; - 'chroot'
 | 
			
		||||
; - 'chdir'
 | 
			
		||||
; - 'php_values'
 | 
			
		||||
; - 'php_admin_values'
 | 
			
		||||
; When not set, the global prefix (or /usr) applies instead.
 | 
			
		||||
; Note: This directive can also be relative to the global prefix.
 | 
			
		||||
; Default Value: none
 | 
			
		||||
;prefix = /path/to/pools/$pool
 | 
			
		||||
 | 
			
		||||
; Unix user/group of processes
 | 
			
		||||
; Note: The user is mandatory. If the group is not set, the default user's group
 | 
			
		||||
;       will be used.
 | 
			
		||||
user = nginx
 | 
			
		||||
group = nginx
 | 
			
		||||
 | 
			
		||||
; The address on which to accept FastCGI requests.
 | 
			
		||||
; Valid syntaxes are:
 | 
			
		||||
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
 | 
			
		||||
;                            a specific port;
 | 
			
		||||
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
 | 
			
		||||
;                            a specific port;
 | 
			
		||||
;   'port'                 - to listen on a TCP socket to all addresses
 | 
			
		||||
;                            (IPv6 and IPv4-mapped) on a specific port;
 | 
			
		||||
;   '/path/to/unix/socket' - to listen on a unix socket.
 | 
			
		||||
; Note: This value is mandatory.
 | 
			
		||||
listen = /run/php/php7.3-fpm-{{ domain_name }}.sock
 | 
			
		||||
 | 
			
		||||
; Set listen(2) backlog.
 | 
			
		||||
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
 | 
			
		||||
;listen.backlog = 511
 | 
			
		||||
 | 
			
		||||
; Set permissions for unix socket, if one is used. In Linux, read/write
 | 
			
		||||
; permissions must be set in order to allow connections from a web server. Many
 | 
			
		||||
; BSD-derived systems allow connections regardless of permissions.
 | 
			
		||||
; Default Values: user and group are set as the running user
 | 
			
		||||
;                 mode is set to 0660
 | 
			
		||||
listen.owner = nginx
 | 
			
		||||
listen.group = nginx
 | 
			
		||||
;listen.mode = 0660
 | 
			
		||||
; When POSIX Access Control Lists are supported you can set them using
 | 
			
		||||
; these options, value is a comma separated list of user/group names.
 | 
			
		||||
; When set, listen.owner and listen.group are ignored
 | 
			
		||||
;listen.acl_users =
 | 
			
		||||
;listen.acl_groups =
 | 
			
		||||
 | 
			
		||||
; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
 | 
			
		||||
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
 | 
			
		||||
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
 | 
			
		||||
; must be separated by a comma. If this value is left blank, connections will be
 | 
			
		||||
; accepted from any ip address.
 | 
			
		||||
; Default Value: any
 | 
			
		||||
;listen.allowed_clients = 127.0.0.1
 | 
			
		||||
 | 
			
		||||
; Specify the nice(2) priority to apply to the pool processes (only if set)
 | 
			
		||||
; The value can vary from -19 (highest priority) to 20 (lower priority)
 | 
			
		||||
; Note: - It will only work if the FPM master process is launched as root
 | 
			
		||||
;       - The pool processes will inherit the master process priority
 | 
			
		||||
;         unless it specified otherwise
 | 
			
		||||
; Default Value: no set
 | 
			
		||||
; process.priority = -19
 | 
			
		||||
 | 
			
		||||
; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user
 | 
			
		||||
; or group is differrent than the master process user. It allows to create process
 | 
			
		||||
; core dump and ptrace the process for the pool user.
 | 
			
		||||
; Default Value: no
 | 
			
		||||
; process.dumpable = yes
 | 
			
		||||
 | 
			
		||||
; Choose how the process manager will control the number of child processes.
 | 
			
		||||
; Possible Values:
 | 
			
		||||
;   static  - a fixed number (pm.max_children) of child processes;
 | 
			
		||||
;   dynamic - the number of child processes are set dynamically based on the
 | 
			
		||||
;             following directives. With this process management, there will be
 | 
			
		||||
;             always at least 1 children.
 | 
			
		||||
;             pm.max_children      - the maximum number of children that can
 | 
			
		||||
;                                    be alive at the same time.
 | 
			
		||||
;             pm.start_servers     - the number of children created on startup.
 | 
			
		||||
;             pm.min_spare_servers - the minimum number of children in 'idle'
 | 
			
		||||
;                                    state (waiting to process). If the number
 | 
			
		||||
;                                    of 'idle' processes is less than this
 | 
			
		||||
;                                    number then some children will be created.
 | 
			
		||||
;             pm.max_spare_servers - the maximum number of children in 'idle'
 | 
			
		||||
;                                    state (waiting to process). If the number
 | 
			
		||||
;                                    of 'idle' processes is greater than this
 | 
			
		||||
;                                    number then some children will be killed.
 | 
			
		||||
;  ondemand - no children are created at startup. Children will be forked when
 | 
			
		||||
;             new requests will connect. The following parameter are used:
 | 
			
		||||
;             pm.max_children           - the maximum number of children that
 | 
			
		||||
;                                         can be alive at the same time.
 | 
			
		||||
;             pm.process_idle_timeout   - The number of seconds after which
 | 
			
		||||
;                                         an idle process will be killed.
 | 
			
		||||
; Note: This value is mandatory.
 | 
			
		||||
pm = dynamic
 | 
			
		||||
 | 
			
		||||
; The number of child processes to be created when pm is set to 'static' and the
 | 
			
		||||
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
 | 
			
		||||
; This value sets the limit on the number of simultaneous requests that will be
 | 
			
		||||
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
 | 
			
		||||
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
 | 
			
		||||
; CGI. The below defaults are based on a server without much resources. Don't
 | 
			
		||||
; forget to tweak pm.* to fit your needs.
 | 
			
		||||
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
 | 
			
		||||
; Note: This value is mandatory.
 | 
			
		||||
pm.max_children = 5
 | 
			
		||||
 | 
			
		||||
; The number of child processes created on startup.
 | 
			
		||||
; Note: Used only when pm is set to 'dynamic'
 | 
			
		||||
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
 | 
			
		||||
pm.start_servers = 2
 | 
			
		||||
 | 
			
		||||
; The desired minimum number of idle server processes.
 | 
			
		||||
; Note: Used only when pm is set to 'dynamic'
 | 
			
		||||
; Note: Mandatory when pm is set to 'dynamic'
 | 
			
		||||
pm.min_spare_servers = 1
 | 
			
		||||
 | 
			
		||||
; The desired maximum number of idle server processes.
 | 
			
		||||
; Note: Used only when pm is set to 'dynamic'
 | 
			
		||||
; Note: Mandatory when pm is set to 'dynamic'
 | 
			
		||||
pm.max_spare_servers = 3
 | 
			
		||||
 | 
			
		||||
; The number of seconds after which an idle process will be killed.
 | 
			
		||||
; Note: Used only when pm is set to 'ondemand'
 | 
			
		||||
; Default Value: 10s
 | 
			
		||||
;pm.process_idle_timeout = 10s;
 | 
			
		||||
 | 
			
		||||
; The number of requests each child process should execute before respawning.
 | 
			
		||||
; This can be useful to work around memory leaks in 3rd party libraries. For
 | 
			
		||||
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
 | 
			
		||||
; Default Value: 0
 | 
			
		||||
;pm.max_requests = 500
 | 
			
		||||
 | 
			
		||||
; The URI to view the FPM status page. If this value is not set, no URI will be
 | 
			
		||||
; recognized as a status page. It shows the following informations:
 | 
			
		||||
;   pool                 - the name of the pool;
 | 
			
		||||
;   process manager      - static, dynamic or ondemand;
 | 
			
		||||
;   start time           - the date and time FPM has started;
 | 
			
		||||
;   start since          - number of seconds since FPM has started;
 | 
			
		||||
;   accepted conn        - the number of request accepted by the pool;
 | 
			
		||||
;   listen queue         - the number of request in the queue of pending
 | 
			
		||||
;                          connections (see backlog in listen(2));
 | 
			
		||||
;   max listen queue     - the maximum number of requests in the queue
 | 
			
		||||
;                          of pending connections since FPM has started;
 | 
			
		||||
;   listen queue len     - the size of the socket queue of pending connections;
 | 
			
		||||
;   idle processes       - the number of idle processes;
 | 
			
		||||
;   active processes     - the number of active processes;
 | 
			
		||||
;   total processes      - the number of idle + active processes;
 | 
			
		||||
;   max active processes - the maximum number of active processes since FPM
 | 
			
		||||
;                          has started;
 | 
			
		||||
;   max children reached - number of times, the process limit has been reached,
 | 
			
		||||
;                          when pm tries to start more children (works only for
 | 
			
		||||
;                          pm 'dynamic' and 'ondemand');
 | 
			
		||||
; Value are updated in real time.
 | 
			
		||||
; Example output:
 | 
			
		||||
;   pool:                 www
 | 
			
		||||
;   process manager:      static
 | 
			
		||||
;   start time:           01/Jul/2011:17:53:49 +0200
 | 
			
		||||
;   start since:          62636
 | 
			
		||||
;   accepted conn:        190460
 | 
			
		||||
;   listen queue:         0
 | 
			
		||||
;   max listen queue:     1
 | 
			
		||||
;   listen queue len:     42
 | 
			
		||||
;   idle processes:       4
 | 
			
		||||
;   active processes:     11
 | 
			
		||||
;   total processes:      15
 | 
			
		||||
;   max active processes: 12
 | 
			
		||||
;   max children reached: 0
 | 
			
		||||
;
 | 
			
		||||
; By default the status page output is formatted as text/plain. Passing either
 | 
			
		||||
; 'html', 'xml' or 'json' in the query string will return the corresponding
 | 
			
		||||
; output syntax. Example:
 | 
			
		||||
;   http://www.foo.bar/status
 | 
			
		||||
;   http://www.foo.bar/status?json
 | 
			
		||||
;   http://www.foo.bar/status?html
 | 
			
		||||
;   http://www.foo.bar/status?xml
 | 
			
		||||
;
 | 
			
		||||
; By default the status page only outputs short status. Passing 'full' in the
 | 
			
		||||
; query string will also return status for each pool process.
 | 
			
		||||
; Example:
 | 
			
		||||
;   http://www.foo.bar/status?full
 | 
			
		||||
;   http://www.foo.bar/status?json&full
 | 
			
		||||
;   http://www.foo.bar/status?html&full
 | 
			
		||||
;   http://www.foo.bar/status?xml&full
 | 
			
		||||
; The Full status returns for each process:
 | 
			
		||||
;   pid                  - the PID of the process;
 | 
			
		||||
;   state                - the state of the process (Idle, Running, ...);
 | 
			
		||||
;   start time           - the date and time the process has started;
 | 
			
		||||
;   start since          - the number of seconds since the process has started;
 | 
			
		||||
;   requests             - the number of requests the process has served;
 | 
			
		||||
;   request duration     - the duration in µs of the requests;
 | 
			
		||||
;   request method       - the request method (GET, POST, ...);
 | 
			
		||||
;   request URI          - the request URI with the query string;
 | 
			
		||||
;   content length       - the content length of the request (only with POST);
 | 
			
		||||
;   user                 - the user (PHP_AUTH_USER) (or '-' if not set);
 | 
			
		||||
;   script               - the main script called (or '-' if not set);
 | 
			
		||||
;   last request cpu     - the %cpu the last request consumed
 | 
			
		||||
;                          it's always 0 if the process is not in Idle state
 | 
			
		||||
;                          because CPU calculation is done when the request
 | 
			
		||||
;                          processing has terminated;
 | 
			
		||||
;   last request memory  - the max amount of memory the last request consumed
 | 
			
		||||
;                          it's always 0 if the process is not in Idle state
 | 
			
		||||
;                          because memory calculation is done when the request
 | 
			
		||||
;                          processing has terminated;
 | 
			
		||||
; If the process is in Idle state, then informations are related to the
 | 
			
		||||
; last request the process has served. Otherwise informations are related to
 | 
			
		||||
; the current request being served.
 | 
			
		||||
; Example output:
 | 
			
		||||
;   ************************
 | 
			
		||||
;   pid:                  31330
 | 
			
		||||
;   state:                Running
 | 
			
		||||
;   start time:           01/Jul/2011:17:53:49 +0200
 | 
			
		||||
;   start since:          63087
 | 
			
		||||
;   requests:             12808
 | 
			
		||||
;   request duration:     1250261
 | 
			
		||||
;   request method:       GET
 | 
			
		||||
;   request URI:          /test_mem.php?N=10000
 | 
			
		||||
;   content length:       0
 | 
			
		||||
;   user:                 -
 | 
			
		||||
;   script:               /home/fat/web/docs/php/test_mem.php
 | 
			
		||||
;   last request cpu:     0.00
 | 
			
		||||
;   last request memory:  0
 | 
			
		||||
;
 | 
			
		||||
; Note: There is a real-time FPM status monitoring sample web page available
 | 
			
		||||
;       It's available in: /usr/share/php/7.3/fpm/status.html
 | 
			
		||||
;
 | 
			
		||||
; Note: The value must start with a leading slash (/). The value can be
 | 
			
		||||
;       anything, but it may not be a good idea to use the .php extension or it
 | 
			
		||||
;       may conflict with a real PHP file.
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
;pm.status_path = /status
 | 
			
		||||
 | 
			
		||||
; The ping URI to call the monitoring page of FPM. If this value is not set, no
 | 
			
		||||
; URI will be recognized as a ping page. This could be used to test from outside
 | 
			
		||||
; that FPM is alive and responding, or to
 | 
			
		||||
; - create a graph of FPM availability (rrd or such);
 | 
			
		||||
; - remove a server from a group if it is not responding (load balancing);
 | 
			
		||||
; - trigger alerts for the operating team (24/7).
 | 
			
		||||
; Note: The value must start with a leading slash (/). The value can be
 | 
			
		||||
;       anything, but it may not be a good idea to use the .php extension or it
 | 
			
		||||
;       may conflict with a real PHP file.
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
;ping.path = /ping
 | 
			
		||||
 | 
			
		||||
; This directive may be used to customize the response of a ping request. The
 | 
			
		||||
; response is formatted as text/plain with a 200 response code.
 | 
			
		||||
; Default Value: pong
 | 
			
		||||
;ping.response = pong
 | 
			
		||||
 | 
			
		||||
; The access log file
 | 
			
		||||
; Default: not set
 | 
			
		||||
;access.log = log/$pool.access.log
 | 
			
		||||
 | 
			
		||||
; The access log format.
 | 
			
		||||
; The following syntax is allowed
 | 
			
		||||
;  %%: the '%' character
 | 
			
		||||
;  %C: %CPU used by the request
 | 
			
		||||
;      it can accept the following format:
 | 
			
		||||
;      - %{user}C for user CPU only
 | 
			
		||||
;      - %{system}C for system CPU only
 | 
			
		||||
;      - %{total}C  for user + system CPU (default)
 | 
			
		||||
;  %d: time taken to serve the request
 | 
			
		||||
;      it can accept the following format:
 | 
			
		||||
;      - %{seconds}d (default)
 | 
			
		||||
;      - %{miliseconds}d
 | 
			
		||||
;      - %{mili}d
 | 
			
		||||
;      - %{microseconds}d
 | 
			
		||||
;      - %{micro}d
 | 
			
		||||
;  %e: an environment variable (same as $_ENV or $_SERVER)
 | 
			
		||||
;      it must be associated with embraces to specify the name of the env
 | 
			
		||||
;      variable. Some exemples:
 | 
			
		||||
;      - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
 | 
			
		||||
;      - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
 | 
			
		||||
;  %f: script filename
 | 
			
		||||
;  %l: content-length of the request (for POST request only)
 | 
			
		||||
;  %m: request method
 | 
			
		||||
;  %M: peak of memory allocated by PHP
 | 
			
		||||
;      it can accept the following format:
 | 
			
		||||
;      - %{bytes}M (default)
 | 
			
		||||
;      - %{kilobytes}M
 | 
			
		||||
;      - %{kilo}M
 | 
			
		||||
;      - %{megabytes}M
 | 
			
		||||
;      - %{mega}M
 | 
			
		||||
;  %n: pool name
 | 
			
		||||
;  %o: output header
 | 
			
		||||
;      it must be associated with embraces to specify the name of the header:
 | 
			
		||||
;      - %{Content-Type}o
 | 
			
		||||
;      - %{X-Powered-By}o
 | 
			
		||||
;      - %{Transfert-Encoding}o
 | 
			
		||||
;      - ....
 | 
			
		||||
;  %p: PID of the child that serviced the request
 | 
			
		||||
;  %P: PID of the parent of the child that serviced the request
 | 
			
		||||
;  %q: the query string
 | 
			
		||||
;  %Q: the '?' character if query string exists
 | 
			
		||||
;  %r: the request URI (without the query string, see %q and %Q)
 | 
			
		||||
;  %R: remote IP address
 | 
			
		||||
;  %s: status (response code)
 | 
			
		||||
;  %t: server time the request was received
 | 
			
		||||
;      it can accept a strftime(3) format:
 | 
			
		||||
;      The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
 | 
			
		||||
;  %T: time the log has been written (the request has finished)
 | 
			
		||||
;      it can accept a strftime(3) format:
 | 
			
		||||
;      The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
 | 
			
		||||
;  %u: remote user
 | 
			
		||||
;
 | 
			
		||||
; Default: "%R - %u %t \"%m %r\" %s"
 | 
			
		||||
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
 | 
			
		||||
 | 
			
		||||
; The log file for slow requests
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
; Note: slowlog is mandatory if request_slowlog_timeout is set
 | 
			
		||||
;slowlog = log/$pool.log.slow
 | 
			
		||||
 | 
			
		||||
; The timeout for serving a single request after which a PHP backtrace will be
 | 
			
		||||
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
 | 
			
		||||
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
 | 
			
		||||
; Default Value: 0
 | 
			
		||||
;request_slowlog_timeout = 0
 | 
			
		||||
 | 
			
		||||
; Depth of slow log stack trace.
 | 
			
		||||
; Default Value: 20
 | 
			
		||||
;request_slowlog_trace_depth = 20
 | 
			
		||||
 | 
			
		||||
; The timeout for serving a single request after which the worker process will
 | 
			
		||||
; be killed. This option should be used when the 'max_execution_time' ini option
 | 
			
		||||
; does not stop script execution for some reason. A value of '0' means 'off'.
 | 
			
		||||
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
 | 
			
		||||
; Default Value: 0
 | 
			
		||||
;request_terminate_timeout = 0
 | 
			
		||||
 | 
			
		||||
; Set open file descriptor rlimit.
 | 
			
		||||
; Default Value: system defined value
 | 
			
		||||
;rlimit_files = 1024
 | 
			
		||||
 | 
			
		||||
; Set max core size rlimit.
 | 
			
		||||
; Possible Values: 'unlimited' or an integer greater or equal to 0
 | 
			
		||||
; Default Value: system defined value
 | 
			
		||||
;rlimit_core = 0
 | 
			
		||||
 | 
			
		||||
; Chroot to this directory at the start. This value must be defined as an
 | 
			
		||||
; absolute path. When this value is not set, chroot is not used.
 | 
			
		||||
; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
 | 
			
		||||
; of its subdirectories. If the pool prefix is not set, the global prefix
 | 
			
		||||
; will be used instead.
 | 
			
		||||
; Note: chrooting is a great security feature and should be used whenever
 | 
			
		||||
;       possible. However, all PHP paths will be relative to the chroot
 | 
			
		||||
;       (error_log, sessions.save_path, ...).
 | 
			
		||||
; Default Value: not set
 | 
			
		||||
;chroot =
 | 
			
		||||
 | 
			
		||||
; Chdir to this directory at the start.
 | 
			
		||||
; Note: relative path can be used.
 | 
			
		||||
; Default Value: current directory or / when chroot
 | 
			
		||||
;chdir = /var/www
 | 
			
		||||
 | 
			
		||||
; Redirect worker stdout and stderr into main error log. If not set, stdout and
 | 
			
		||||
; stderr will be redirected to /dev/null according to FastCGI specs.
 | 
			
		||||
; Note: on highloaded environement, this can cause some delay in the page
 | 
			
		||||
; process time (several ms).
 | 
			
		||||
; Default Value: no
 | 
			
		||||
;catch_workers_output = yes
 | 
			
		||||
 | 
			
		||||
; Decorate worker output with prefix and suffix containing information about
 | 
			
		||||
; the child that writes to the log and if stdout or stderr is used as well as
 | 
			
		||||
; log level and time. This options is used only if catch_workers_output is yes.
 | 
			
		||||
; Settings to "no" will output data as written to the stdout or stderr.
 | 
			
		||||
; Default value: yes
 | 
			
		||||
;decorate_workers_output = no
 | 
			
		||||
 | 
			
		||||
; Clear environment in FPM workers
 | 
			
		||||
; Prevents arbitrary environment variables from reaching FPM worker processes
 | 
			
		||||
; by clearing the environment in workers before env vars specified in this
 | 
			
		||||
; pool configuration are added.
 | 
			
		||||
; Setting to "no" will make all environment variables available to PHP code
 | 
			
		||||
; via getenv(), $_ENV and $_SERVER.
 | 
			
		||||
; Default Value: yes
 | 
			
		||||
;clear_env = no
 | 
			
		||||
 | 
			
		||||
; Limits the extensions of the main script FPM will allow to parse. This can
 | 
			
		||||
; prevent configuration mistakes on the web server side. You should only limit
 | 
			
		||||
; FPM to .php extensions to prevent malicious users to use other extensions to
 | 
			
		||||
; execute php code.
 | 
			
		||||
; Note: set an empty value to allow all extensions.
 | 
			
		||||
; Default Value: .php
 | 
			
		||||
;security.limit_extensions = .php .php3 .php4 .php5 .php7
 | 
			
		||||
 | 
			
		||||
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
 | 
			
		||||
; the current environment.
 | 
			
		||||
; Default Value: clean env
 | 
			
		||||
;env[HOSTNAME] = $HOSTNAME
 | 
			
		||||
;env[PATH] = /usr/local/bin:/usr/bin:/bin
 | 
			
		||||
;env[TMP] = /tmp
 | 
			
		||||
;env[TMPDIR] = /tmp
 | 
			
		||||
;env[TEMP] = /tmp
 | 
			
		||||
 | 
			
		||||
; Additional php.ini defines, specific to this pool of workers. These settings
 | 
			
		||||
; overwrite the values previously defined in the php.ini. The directives are the
 | 
			
		||||
; same as the PHP SAPI:
 | 
			
		||||
;   php_value/php_flag             - you can set classic ini defines which can
 | 
			
		||||
;                                    be overwritten from PHP call 'ini_set'.
 | 
			
		||||
;   php_admin_value/php_admin_flag - these directives won't be overwritten by
 | 
			
		||||
;                                     PHP call 'ini_set'
 | 
			
		||||
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
 | 
			
		||||
 | 
			
		||||
; Defining 'extension' will load the corresponding shared extension from
 | 
			
		||||
; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
 | 
			
		||||
; overwrite previously defined php.ini values, but will append the new value
 | 
			
		||||
; instead.
 | 
			
		||||
 | 
			
		||||
; Note: path INI options can be relative and will be expanded with the prefix
 | 
			
		||||
; (pool, global or /usr)
 | 
			
		||||
 | 
			
		||||
; Default Value: nothing is defined by default except the values in php.ini and
 | 
			
		||||
;                specified at startup with the -d argument
 | 
			
		||||
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
 | 
			
		||||
;php_flag[display_errors] = off
 | 
			
		||||
;php_admin_value[error_log] = /var/log/fpm-php.www.log
 | 
			
		||||
;php_admin_flag[log_errors] = on
 | 
			
		||||
;php_admin_value[memory_limit] = 32M
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
---
 | 
			
		||||
# file: roles/php-fpm/defaults/main.yml
 | 
			
		||||
# ansible.builtin.file: roles/php-fpm/defaults/main.yml
 | 
			
		||||
 | 
			
		||||
# default is on, but turn it off because of protection in nginx vhosts
 | 
			
		||||
cgi_fix_pathinfo: 0
 | 
			
		||||
							
								
								
									
										8
									
								
								roles/php_fpm/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								roles/php_fpm/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
---
 | 
			
		||||
# For Debian 12
 | 
			
		||||
- name: Reload php8.2-fpm
 | 
			
		||||
  ansible.builtin.systemd_service:
 | 
			
		||||
    name: php8.2-fpm
 | 
			
		||||
    state: reloaded
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
							
								
								
									
										50
									
								
								roles/php_fpm/tasks/Debian_12.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								roles/php_fpm/tasks/Debian_12.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
---
 | 
			
		||||
- name: Install and configure php-fpm
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
  when: install_php
 | 
			
		||||
  block:
 | 
			
		||||
    - name: Set php-fpm packages
 | 
			
		||||
      ansible.builtin.set_fact:
 | 
			
		||||
        php_fpm_packages:
 | 
			
		||||
          - php8.2-fpm
 | 
			
		||||
          # for WordPress
 | 
			
		||||
          - php8.2-mysql
 | 
			
		||||
          - php8.2-gd
 | 
			
		||||
          - php8.2-curl
 | 
			
		||||
          - php8.2-xml
 | 
			
		||||
 | 
			
		||||
    - name: Install php-fpm and deps
 | 
			
		||||
      ansible.builtin.apt:
 | 
			
		||||
        name: "{{ php_fpm_packages }}"
 | 
			
		||||
        state: present
 | 
			
		||||
        update_cache: true
 | 
			
		||||
 | 
			
		||||
    # only copy php-fpm config for vhosts that need WordPress or PHP
 | 
			
		||||
    - name: Copy php-fpm pool config
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: php8.2-pool.conf.j2
 | 
			
		||||
        dest: /etc/php/8.2/fpm/pool.d/{{ item.domain_name }}.conf
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: root
 | 
			
		||||
        mode: "0644"
 | 
			
		||||
      loop: "{{ nginx_vhosts }}"
 | 
			
		||||
      when: (item.has_wordpress is defined and item.has_wordpress) or (item.needs_php is defined and item.needs_php)
 | 
			
		||||
      notify: Reload php8.2-fpm
 | 
			
		||||
 | 
			
		||||
    - name: Remove default www pool
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        path: /etc/php/8.2/fpm/pool.d/www.conf
 | 
			
		||||
        state: absent
 | 
			
		||||
      notify: Reload php8.2-fpm
 | 
			
		||||
 | 
			
		||||
    # re-configure php.ini
 | 
			
		||||
    - name: Update php.ini
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: php8.2-php.ini.j2
 | 
			
		||||
        dest: /etc/php/8.2/fpm/php.ini
 | 
			
		||||
        owner: root
 | 
			
		||||
        group: root
 | 
			
		||||
        mode: "0644"
 | 
			
		||||
      notify: Reload php8.2-fpm
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
							
								
								
									
										35
									
								
								roles/php_fpm/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								roles/php_fpm/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
---
 | 
			
		||||
# Debian 12 uses PHP 8.2
 | 
			
		||||
 | 
			
		||||
# If any of the vhosts on this host need WordPress then we need to install PHP.
 | 
			
		||||
# This uses selectattr to filter the list of dicts in nginx_vhosts, selecting
 | 
			
		||||
# any that have has_wordpress defined, and has_wordpress set to true.
 | 
			
		||||
#
 | 
			
		||||
# See: https://stackoverflow.com/a/31896249
 | 
			
		||||
- name: Check if any vhost needs WordPress
 | 
			
		||||
  ansible.builtin.set_fact:
 | 
			
		||||
    install_php: true
 | 
			
		||||
  when: nginx_vhosts | selectattr('has_wordpress', 'defined') | selectattr('has_wordpress', 'equalto', true) | list | length > 0
 | 
			
		||||
 | 
			
		||||
# Legacy, was only for Piwik, but leaving for now.
 | 
			
		||||
- name: Check if any vhost needs PHP
 | 
			
		||||
  ansible.builtin.set_fact:
 | 
			
		||||
    install_php: true
 | 
			
		||||
  when: nginx_vhosts | selectattr('needs_php', 'defined') | selectattr('needs_php', 'equalto', true) | list | length > 0
 | 
			
		||||
 | 
			
		||||
# If install_php has not been set, then we assume no vhosts need PHP. This is
 | 
			
		||||
# a bit hacky, but it's the closest we come to an if/then/else.
 | 
			
		||||
- name: Set install_php to false
 | 
			
		||||
  ansible.builtin.set_fact:
 | 
			
		||||
    install_php: false
 | 
			
		||||
  when: install_php is not defined
 | 
			
		||||
 | 
			
		||||
- name: Configure php-fpm on Debian 12
 | 
			
		||||
  ansible.builtin.include_tasks: Debian_12.yml
 | 
			
		||||
  when:
 | 
			
		||||
    - ansible_distribution == 'Debian'
 | 
			
		||||
    - ansible_distribution_major_version is version('12', '==')
 | 
			
		||||
    - install_php
 | 
			
		||||
  tags: php-fpm
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2:
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user