30
30
type: str
31
31
choices:
32
32
- present
33
- - update
34
33
- absent
35
- force:
34
+ default: present
35
+ update:
36
36
description:
37
- - If state is present and if 1 or more rule already exists at given pos force will update them
38
- - If state is update and if 1 or more rule doesn't exist force will create
37
+ - If O(state=present) and if 1 or more rule/alias already exists it will update them
39
38
type: bool
40
- default: false
39
+ default: truw
41
40
level:
42
41
description:
43
42
- Level at which the firewall rule applies.
239
238
api_host: "{{ pc.proxmox.api_host }}"
240
239
validate_certs: no
241
240
level: cluster
242
- state: update
241
+ state: present
242
+ update: True
243
243
rules:
244
244
- type: out
245
245
action: ACCEPT
307
307
api_token_secret: "{{ vault.proxmox.api_token_secret }}"
308
308
api_host: "{{ pc.proxmox.api_host }}"
309
309
validate_certs: no
310
- state: update
310
+ state: present
311
+ update: True
311
312
aliases:
312
313
- name: test1
313
314
cidr: '10.10.1.0/28'
347
348
348
349
def get_proxmox_args ():
349
350
return dict (
350
- state = dict (type = "str" , choices = ["present" , "absent" , "update" ], required = False ),
351
- force = dict (type = "bool" , default = False ),
351
+ state = dict (type = "str" , choices = ["present" , "absent" ], default = "present" ),
352
+ update = dict (type = "bool" , default = True ),
352
353
level = dict (type = "str" , choices = ["cluster" , "node" , "vm" , "vnet" , "group" ], default = "cluster" , required = False ),
353
354
node = dict (type = "str" , required = False ),
354
355
vmid = dict (type = "int" , required = False ),
@@ -419,7 +420,7 @@ def __init__(self, module):
419
420
self .params = module .params
420
421
421
422
def validate_params (self ):
422
- if self .params .get ('state' ) in [ 'present' , 'update' ] :
423
+ if self .params .get ('state' ) == 'present' :
423
424
if self .params .get ('group_conf' ) != bool (self .params .get ('rules' ) or self .params .get ('aliases' )):
424
425
return True
425
426
else :
@@ -433,14 +434,12 @@ def validate_params(self):
433
434
self .module .fail_json (
434
435
msg = "When State is absent either group_conf should be true or pos/aliases must be present but not both"
435
436
)
436
- else :
437
- return True
438
437
439
438
def run (self ):
440
439
self .validate_params ()
441
440
442
441
state = self .params .get ("state" )
443
- force = self .params .get ("force " )
442
+ update = self .params .get ("update " )
444
443
level = self .params .get ("level" )
445
444
aliases = self .params .get ("aliases" )
446
445
rules = self .params .get ("rules" )
@@ -478,48 +477,38 @@ def run(self):
478
477
479
478
if state == "present" :
480
479
if group_conf :
481
- self .create_group (group = group , comment = self .params .get ('comment' ))
482
- if rules is not None :
483
- self .create_fw_rules (rules_obj = rules_obj , rules = rules , force = force )
484
- if aliases is not None :
485
- self .create_aliases (firewall_obj = firewall_obj , level = level , aliases = aliases , force = force )
486
- elif state == "update" :
487
- if group_conf :
488
- self .create_group (group = group , comment = self .params .get ('comment' ))
480
+ self .group_present (group = group , comment = self .params .get ('comment' ))
489
481
if rules is not None :
490
- self .update_fw_rules (rules_obj = rules_obj , rules = rules , force = force )
482
+ self .fw_rules_present (rules_obj = rules_obj , rules = rules , update = update )
491
483
if aliases is not None :
492
- self .update_aliases (firewall_obj = firewall_obj , level = level , aliases = aliases , force = force )
484
+ self .aliases_present (firewall_obj = firewall_obj , level = level , aliases = aliases , update = update )
493
485
elif state == "absent" :
494
486
if self .params .get ('pos' ):
495
- self .delete_fw_rule (rules_obj = rules_obj , pos = self .params .get ('pos' ))
487
+ self .fw_rule_absent (rules_obj = rules_obj , pos = self .params .get ('pos' ))
496
488
if group_conf :
497
- self .delete_group (group_name = group )
489
+ self .group_absent (group_name = group )
498
490
if aliases is not None :
499
- self .delete_aliases (firewall_obj = firewall_obj , level = level , aliases = aliases )
491
+ self .aliases_absent (firewall_obj = firewall_obj , aliases = aliases )
500
492
501
493
502
- def create_aliases (self , firewall_obj , level , aliases , force = False ):
494
+ def aliases_present (self , firewall_obj , level , aliases , update ):
503
495
if firewall_obj is None or level not in ['cluster' , 'vm' ]:
504
496
self .module .fail_json (
505
497
msg = 'Aliases can only be created at cluster or VM level'
506
498
)
507
499
508
500
aliases_to_create , aliases_to_update = compare_list_of_dicts (
509
- existing_list = self .get_aliases (firewall_obj = firewall_obj , level = level ),
501
+ existing_list = self .get_aliases (firewall_obj = firewall_obj ),
510
502
new_list = aliases ,
511
503
uid = 'name' ,
512
504
params_to_ignore = ['digest' , 'ipversion' ]
513
505
)
514
506
515
507
if len (aliases_to_create ) == 0 and len (aliases_to_update ) == 0 :
516
- self .module .exit_json (
517
- changed = False ,
518
- msg = 'No need to create/update any aliases'
519
- )
520
- elif len (aliases_to_update ) > 0 and not force :
508
+ self .module .exit_json (changed = False , msg = 'No need to create/update any aliases' )
509
+ elif len (aliases_to_update ) > 0 and not update :
521
510
self .module .fail_json (
522
- msg = f"Need to update aliases - { [x ['name' ] for x in aliases_to_update ]} but force is false"
511
+ msg = f"Need to update aliases - { [x ['name' ] for x in aliases_to_update ]} but update is false"
523
512
)
524
513
525
514
for alias in aliases_to_create :
@@ -529,51 +518,18 @@ def create_aliases(self, firewall_obj, level, aliases, force=False):
529
518
self .module .fail_json (
530
519
msg = f"Failed to create Alias { alias ['name' ]} - { e } "
531
520
)
532
- if len (aliases_to_update ) > 0 and force :
533
- self .update_aliases (firewall_obj = firewall_obj , level = level , aliases = aliases_to_update , force = False )
534
- else :
535
- self .module .exit_json (
536
- changed = True ,
537
- msg = "Aliases created"
538
- )
539
-
540
- def update_aliases (self , firewall_obj , level , aliases , force = False ):
541
- aliases_to_create , aliases_to_update = compare_list_of_dicts (
542
- existing_list = self .get_aliases (firewall_obj = firewall_obj , level = level ),
543
- new_list = aliases ,
544
- uid = 'name' ,
545
- params_to_ignore = ['digest' , 'ipversion' ]
546
- )
547
-
548
- if len (aliases_to_update ) == 0 and len (aliases_to_create ) == 0 :
549
- self .module .exit_json (
550
- changed = False ,
551
- msg = 'No need to create/update any alias.'
552
-
553
- )
554
- elif len (aliases_to_create ) > 0 and not force :
555
- self .module .fail_json (
556
- msg = f"Need to create new alias - { [x ['name' ] for x in aliases_to_create ]} But force is false"
557
- )
558
-
559
521
for alias in aliases_to_update :
560
522
try :
561
- alias_obj = getattr (firewall_obj ().aliases (), alias ['name' ])
562
- alias_obj ().put (** alias )
523
+ firewall_obj ().aliases (alias ['name' ]).put (** alias )
563
524
except Exception as e :
564
525
self .module .fail_json (
565
526
msg = f"Failed to update Alias { alias ['name' ]} - { e } "
566
527
)
567
- if len (aliases_to_update ) > 0 and force :
568
- self .update_aliases (firewall_obj = firewall_obj , level = level , aliases = aliases_to_update , force = False )
569
- else :
570
- self .module .exit_json (
571
- changed = True ,
572
- msg = "Aliases updated"
573
- )
574
528
575
- def delete_aliases (self , firewall_obj , level , aliases ):
576
- existing_aliases = set ([x .get ('name' ) for x in self .get_aliases (firewall_obj = firewall_obj , level = level )])
529
+ self .module .exit_json (changed = True , msg = "Aliases created/updated" )
530
+
531
+ def aliases_absent (self , firewall_obj , aliases ):
532
+ existing_aliases = set ([x .get ('name' ) for x in self .get_aliases (firewall_obj = firewall_obj )])
577
533
aliases = set ([x .get ('name' ) for x in aliases ])
578
534
aliases_to_delete = list (existing_aliases .intersection (aliases ))
579
535
@@ -595,7 +551,7 @@ def delete_aliases(self, firewall_obj, level, aliases):
595
551
msg = "Successfully deleted aliases"
596
552
)
597
553
598
- def create_group (self , group , comment = None ):
554
+ def group_present (self , group , comment = None ):
599
555
if group in self .get_groups ():
600
556
self .module .exit_json (
601
557
changed = False , group = group , msg = f"security group { group } already exists"
@@ -610,7 +566,7 @@ def create_group(self, group, comment=None):
610
566
msg = f'Failed to create security group: { e } '
611
567
)
612
568
613
- def delete_group (self , group_name ):
569
+ def group_absent (self , group_name ):
614
570
if group_name not in self .get_groups ():
615
571
self .module .exit_json (
616
572
changed = False , group = group_name , msg = f"security group { group_name } already doesn't exists"
@@ -626,7 +582,7 @@ def delete_group(self, group_name):
626
582
msg = f'Failed to delete security group { group_name } : { e } '
627
583
)
628
584
629
- def delete_fw_rule (self , rules_obj , pos ):
585
+ def fw_rule_absent (self , rules_obj , pos ):
630
586
try :
631
587
for item in self .get_fw_rules (rules_obj ):
632
588
if item .get ('pos' ) == pos :
@@ -647,24 +603,20 @@ def delete_fw_rule(self, rules_obj, pos):
647
603
msg = f'Failed to delete firewall rule at pos { pos } : { e } '
648
604
)
649
605
650
- def update_fw_rules (self , rules_obj , rules , force ):
651
- existing_rules = self .get_fw_rules (rules_obj )
606
+ def fw_rules_present (self , rules_obj , rules , update ):
607
+ existing_rules = self .get_fw_rules (rules_obj = rules_obj )
652
608
rules_to_create , rules_to_update = compare_list_of_dicts (
653
609
existing_list = existing_rules ,
654
610
new_list = rules ,
655
611
uid = 'pos' ,
656
612
params_to_ignore = ['digest' , 'ipversion' ]
657
613
)
658
614
659
- if len (rules_to_update ) == 0 and len (rules_to_create ) == 0 :
660
- self .module .exit_json (
661
- changed = False ,
662
- msg = 'No need to update any FW rules.'
663
-
664
- )
665
- elif len (rules_to_create ) > 0 and not force :
615
+ if len (rules_to_create ) == 0 and len (rules_to_update ) == 0 :
616
+ self .module .exit_json (changed = False , msg = 'No need to create/update any rule' )
617
+ elif len (rules_to_update ) > 0 and not update :
666
618
self .module .fail_json (
667
- msg = f"Need to create new rules for pos - { [x ['pos' ] for x in rules_to_create ]} But force is false"
619
+ msg = f"Need to update rules at pos - { [x ['pos' ] for x in rules_to_update ]} but update is false"
668
620
)
669
621
670
622
for rule in rules_to_update :
@@ -677,32 +629,6 @@ def update_fw_rules(self, rules_obj, rules, force):
677
629
self .module .fail_json (
678
630
msg = f'Failed to update firewall rule at pos { rule ["pos" ]} : { e } '
679
631
)
680
-
681
- if len (rules_to_create ) > 0 :
682
- self .create_fw_rules (rules_obj = rules_obj , rules = rules_to_create , force = False )
683
- self .module .exit_json (
684
- changed = True , msg = 'successfully updated firewall rules'
685
- )
686
-
687
- def create_fw_rules (self , rules_obj , rules , force ):
688
- existing_rules = self .get_fw_rules (rules_obj = rules_obj )
689
- rules_to_create , rules_to_update = compare_list_of_dicts (
690
- existing_list = existing_rules ,
691
- new_list = rules ,
692
- uid = 'pos' ,
693
- params_to_ignore = ['digest' , 'ipversion' ]
694
- )
695
-
696
- if len (rules_to_create ) == 0 and len (rules_to_update ) == 0 :
697
- self .module .exit_json (
698
- changed = False ,
699
- msg = 'No need to create/update any rule'
700
- )
701
- elif len (rules_to_update ) > 0 and not force :
702
- self .module .fail_json (
703
- msg = f"Need to update rules at pos - { [x ['pos' ] for x in rules_to_update ]} but force is false"
704
- )
705
-
706
632
for rule in rules_to_create :
707
633
try :
708
634
rules_obj ().post (** rule )
@@ -712,10 +638,8 @@ def create_fw_rules(self, rules_obj, rules, force):
712
638
self .module .fail_json (
713
639
msg = f'Failed to create firewall rule { rule } : { e } '
714
640
)
715
- if len (rules_to_update ) > 0 and force :
716
- self .update_fw_rules (rules_obj = rules_obj , rules = rules_to_update , force = False )
717
641
self .module .exit_json (
718
- changed = True , msg = 'successfully created firewall rules'
642
+ changed = True , msg = 'successfully created/updated firewall rules'
719
643
)
720
644
721
645
def move_rule_to_correct_pos (self , rules_obj , rule ):
0 commit comments