Comprobación de roles de Ansible a través del controlador delegado de moléculas







Molecule es una herramienta excelente para probar roles de Ansible, sigue un proceso de validación robusto y flexible para garantizar un buen nivel de calidad de rol. Casi toda la documentación de Molecule se centra en el controlador de la ventana acoplable donde se ejecutan las pruebas en el servidor de contenedor, pero si bien es una buena opción en la mayoría de los casos de uso, puede haber casos en los que podría ser útil cambiar a un backend de nube externo usando un controlador delegado .







Desafortunadamente, la documentación del controlador delegado consta principalmente de unas pocas líneas en el documento oficial, mientras que una explicación más clara y unos pocos ejemplos pueden ser de gran ayuda para aquellos desarrolladores que quieran usar Molecule de esta manera.







Ansible 0 galaxy , Google Cloud Platform. :









: Molecule?







, , — Molecule:







instance-config API. instance-config, instance-config.







: instance-config ?







Instance-config — Ansible, YAML Molecule ( $HOME/.cache/molecule/<role-name>/<scenario-name>/instance_config.yml



), :







- address: 10.10.15.17
 identity_file: /home/fabio/.ssh/id_rsa # mutually exclusive with
                                        # password
 instance: millennium_falcon
 port: 22
 user: hansolo
# password: ssh_password # mutually exclusive with identity_file
 become_method: sudo # optional
# become_pass: password_if_required # optional
      
      





, Windows, WinRM.







create.yml







, , instance-config, . , Molecule , molecule init



, :







molecule init scenario -driver-name=delegated
      
      





:







.
├── INSTALL.rst
├── converge.yml
├── create.yml
├── destroy.yml
├── molecule.yml
└── verify.yml
      
      





  • molecule.yml



    — Molecule, , .
  • create.yml



    — Ansible instance-config.
  • destroy.yml



    Ansible instance-config
  • converge.yml



  • verify.yml



  • INSTALL.rst



    Molecule


create.yml



, Molecule:







---
- name: Create
 hosts: localhost
 connection: local
 gather_facts: false
 no_log: "{{ molecule_no_log }}"
 tasks:

 # Developer must implement.
 # Developer must map instance config.
 # Mandatory configuration for Molecule to function.

 — name: Populate instance config dict
 set_fact:
 instance_conf_dict: {
 'instance': "{{ }}",
 'address': "{{ }}",
 'user': "{{ }}",
 'port': "{{ }}",
 'identity_file': "{{ }}", }
 with_items: "{{ server.results }}"
 register: instance_config_dict
 when: server.changed | bool

 — name: Convert instance config dict to a list
 set_fact:
 instance_conf: {{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}"
 when: server.changed | bool

 — name: Dump instance config
 copy:
 content: "{{ instance_conf | to_json | from_json | molecule_to_yaml | molecule_header }}"
 dest: "{{ molecule_instance_config }}"
 when: server.changed | bool
      
      





: , , instance-config.yml



. Ansible, ( ) . , github, , VMWare:








 7     - name: Create molecule instance(s)
 8      vmware_guest:
 9        hostname: "{{ molecule_yml.driver.hostname }}"
10        esxi_hostname: "{{ molecule_yml.driver.esxi_hostname }}"
11        username: "{{ molecule_yml.driver.username }}"
12        password: "{{ molecule_yml.driver.password }}"
13        datacenter: "{{ molecule_yml.driver.datacenter }}"
14        validate_certs: "{{ molecule_yml.driver.validate_certs }}"
15        resource_pool: "{{ molecule_yml.driver.resource_pool }}"
16         folder: "{{ molecule_yml.driver.folder }}"
17         name: "{{ item.name }}"
18         template: "{{ item.template }}"
19         hardware:
20           memory_mb: "{{ item.memory | default(omit) }}"
21           num_cpus: "{{ item.cpu | default(omit) }}"
22         wait_for_ip_address: "yes"
23         state: poweredon
24       register: server
25       with_items: "{{ molecule_yml.platforms }}"
26     
27     - name: Populate instance config dict
28       set_fact:
29         instance_conf_dict: {
30           'instance': "{{ item.instance.hw_name }}",
31           'address': "{{ item.instance.ipv4 }}",
32           'user': "vagrant",
33           'port': "22",
34           'identity_file': 'identity_file': "{{
                     molecule_yml.driver.ssh_identity_file }}"
35         }
36       with_items: "{{ server.results }}"
37       register: instance_config_dict
38       when: server is changed
      
      





vmware_guest



( 7–23) VMWare. , molecule.yml



( 25). , , molecule.yml



, molecule_yml



.







, vmware_guest



, ( 24), , , (instance-config



) ( 27 ). , , .







Google Cloud Platform (GCP)







, , , , docker-secured Ansible. GCP . Ansible GCP , , , .







:







  • python 2.7
  • ansible 2.9.6
  • molecule 3.0.2
  • ansible-lint 4.2.0
  • yamllint 1.20.0
  • flake8 3.7.9 (mccabe: 0.6.1, pycodestyle: 2.5.0, pyflakes: 2.1.1) CPython 2.7.17 Linux


yamllint, ansible-lint flake8 — , .







docker-secured







, API- ssl. , , Docker:









ssl , , .







, GitHub:







git clone https://github.com/fabiomarinetti/fmarinetti.docker-secured.git
      
      





GCP







, GCP, . , GCP . , Ansible GCP.







ansible-272015



service



, secret.json



.







molecule.yml







molecule.yml



.







, molecule.yml



driver



. , , , , GCP, ssh , , , , ad-hoc . molecule_yml



(, molecule_yml.driver.region



).







20 driver:
21   name: delegated
22   gcp_service_account_key: ${GOOGLE_APPLICATION_CREDENTIALS}
23   gcp_project_id: ansible-272015
24   region: us-east1
25   zone: us-east1-c
26   ssh_user: ${SSH_USER}
27   ssh_pub_key_file: "${SSH_ID_FILE}.pub"
28   ssh_key_file: "${SSH_ID_FILE}"
29   network_name: ansible-network
30   subnet_name: ansible-subnet
31   firewall_name: ansible-firewall
32   ip_cidr_range: 172.16.0.0/28
      
      





molecule.yml



, (, , , …) , . CentOS 7, Ubuntu Xenial 16.04 Ubuntu Bionic 18.04. (, CentOS Ubuntu), Ansible.







41 platforms:
42   - name: "ds-centos7-${TRAVIS_BUILD_ID}"
43     image_family: projects/centos-cloud/global/images/family
                     /centos-7
44     machine_type: n1-standard-1
45     size_gb: 200
46     groups:
47       - centos
48   - name: "ds-ubuntu-bionic-${TRAVIS_BUILD_ID}"
49     image_family: projects/ubuntu-os-cloud/global/images/family
                     /ubuntu-1804-lts
50     machine_type: n1-standard-1
51     size_gb: 200
52     groups:
53       - ubuntu
54   - name:  "ds-ubuntu-xenial-${TRAVIS_BUILD_ID}"
55     image_family: projects/ubuntu-os-cloud/global/images/family
                     /ubuntu-1604-lts
56     machine_type: n1-standard-1
57     size_gb: 200
58     groups:
59       - ubuntu
      
      





molecule.yml



, .







create.yml







, create.yml



— , . gcp (GCP). GCP - , , , , , module_defaults



gcp.







 7   module_defaults:
 8     group/gcp:
 9       project: "{{ molecule_yml.driver.gcp_project_id }}"
10       auth_kind: serviceaccount
11       service_account_file: "{{ 
              molecule_yml.driver.gcp_service_account_key }}"
      
      





, VMWare, GCP — , , : , IP- . , :







16 — name: create instances
17   include_tasks: tasks/create_instance.yml
18   loop: "{{ molecule_yml.platforms }}"
      
      





create_instance.yml



IP-, . , , , , , , instance-config.







7 - name: initialize instance facts
 8   set_fact:
 9     instance_created:
10       instances: []
11   when: instance_created is not defined
... create the instance and return instance variable ...
56 - name: update instance facts
57   set_fact:
58     instance_created:
59       changed: instance.changed | bool
60       instances: "{{ instance_created.instances + [ instance ]}}"
      
      





isntance-config instance_create



:







20     - name: Populate instance config dict
21       set_fact:
22         instance_conf_dict: {
23           'instance': "{{ item.name }}",
24           'address': "{{
               item.networkInterfaces[0].accessConfigs[0].natIP }}",
25           'user': "{{ molecule_yml.driver.ssh_user }}",
26           'port': "22",
27           'identity_file': "{{ molecule_yml.driver.ssh_key_file
               }}", }
28       with_items: "{{ instance_created.instances }}"
29       register: instance_config_dict
30       when: instance_created.changed
      
      





, , VMWare, servers is changed









, , :







molecule create --scenario-name=gcp
      
      





, , / :







  • lint,
  • prepare, . ubuntu.
  • converge,
  • idempotence,
  • verify, ,


molecule <phase> --scenario-name=gcp
      
      





, , , .







destroy.yml



( ). , , . , :







molecule destroy --scenario-name=gcp
      
      





, :







molecule test --scenario-test=gcp
      
      











, Molecule, , GCP. : AWS, Azure, Digital Ocean… , Molecule. , .








All Articles