1

我正在运行一个 Molecule v2.22,我想使用分子启动一个 ec2 实例,以测试我的 ansible 剧本。
但是当分子到达 Detroy 并创建实例阶段时,我遇到了错误。

我也不明白为什么molecule 会跳过/usr/lib/python2.7/site-packages/molecule/provisioner/ansible/plugins/filters/molecule_core.py插件,我相信它可能负责名为molecule_from_yaml的过滤器

请参阅以下错误:

 [WARNING]: Skipping plugin (/usr/lib/python2.7/site-
packages/molecule/provisioner/ansible/plugins/filters/molecule_core.py) as it
seems to be invalid: cannot import name py31compat


    PLAY [Destroy] *****************************************************************

    TASK [Populate instance config] ************************************************
    fatal: [localhost]: FAILED! => {"msg": "template error while templating string: no filter named 'molecule_from_yaml'. String: {{ lookup('file', molecule_instance_config) | molecule_from_yaml }}"}


--> Action: 'create'
 [WARNING]: Skipping plugin (/usr/lib/python2.7/site-
packages/molecule/provisioner/ansible/plugins/filters/molecule_core.py) as it
seems to be invalid: cannot import name py31compat


    PLAY [Create] ******************************************************************

    TASK [Get the ec2 ami(s) by owner and name, if image not set] ******************
    fatal: [localhost]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ lookup('file', molecule_file) | molecule_from_yaml }}'. Error was a <class 'ansible.errors.AnsibleError'>, original   
    message: template error while templating string: no filter named 'molecule_from_yaml'. String: {{ lookup('file', molecule_file) | molecule_from_yaml }}"}

下面是销毁先前创建的实例(如果有的话)的 destroy.yml 文件。

- name: Destroy
  hosts: localhost
  connection: local
  gather_facts: false
  tasks:
    - block:
        - name: Populate instance config
          set_fact:
            instance_conf: "{{ lookup('file', molecule_instance_config) | molecule_from_yaml }}"
            skip_instances: false
      rescue:
        - name: Populate instance config when file missing
          set_fact:
            instance_conf: {}
            skip_instances: true

    - name: Destroy molecule instance(s)
      ec2:
        state: absent
        instance_ids: "{{ item.instance_ids }}"
      register: server
      with_items: "{{ instance_conf }}"
      when: not skip_instances
      async: 7200
      poll: 0

    - name: Wait for instance(s) deletion to complete
      async_status:
        jid: "{{ item.ansible_job_id }}"
      register: ec2_jobs
      until: ec2_jobs.finished
      retries: 300
      with_items: "{{ server.results }}"

    # Mandatory configuration for Molecule to function.

    - name: Populate instance config
      set_fact:
        instance_conf: {}

    - 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

下面是create.yml

---
- name: Create
  hosts: localhost
  connection: local
  gather_facts: false
  no_log: "{{ molecule_no_log }}"
  vars:
    ssh_user: ubuntu
    ssh_port: 22
    keypair_name: mpho_csosecuritydev.pem
    keypair_path: /home/ec2-user/mpho_csosecuritydev.pem
    security_group_name: euw1-cso_securitydev_run_ansible-sg
  tasks:
    - name: Get the ec2 ami(s) by owner and name, if image not set
      ec2_ami_facts:
        owners:
        filters:
          name: "{{ item.image_name }}"
      loop: "{{ molecule_yml.platforms }}"
      when: item.image is not defined
      register: ami_facts

    - name: Create molecule instance(s)
      ec2:
        key_name: "{{ keypair_name }}"
        image: ami-08cb423ed619f
        instance_type: t2.micro
        vpc_subnet_id: subnet-07b35
        group: "{{ security_group_name }}"
        instance_tags:
          Name: seceng-molecule-test-amz2
        wait: true
        assign_public_ip: false
        instance_profile_name: euw1-ansible_run-instance_profile
        exact_count: 1
        count_tag:
          instance: seceng-molecule-test-amz2
      register: server
      #      loop: '{{ lookup("file", molecule.yml) | molecule_from_yaml }}'
      loop_control:
        index_var: index
      async: 7200
      poll: 0

    - name: Wait for instance(s) creation to complete
      async_status:
        jid: "{{ item.ansible_job_id }}"
      register: ec2_jobs
      until: ec2_jobs.finished
      retries: 300
      with_items: "{{ server.results }}"

    # Mandatory configuration for Molecule to function.

    - name: Populate instance config dict
      set_fact:
        instance_conf_dict: {
          'instance': "{{ item.instances[0].tags.instance }}",
          'address': "{{ item.instances[0].public_ip }}",
          'user': "{{ ssh_user }}",
          'port': "{{ ssh_port }}",
          'identity_file': "{{ keypair_path }}",
          'instance_ids': "{{ item.instance_ids }}", }
      with_items: "{{ ec2_jobs.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

    - name: Wait for SSH
      wait_for:
        port: "{{ ssh_port }}"
        host: "{{ item.address }}"
        search_regex: SSH
        delay: 10
        timeout: 320
      with_items: "{{ lookup('file', molecule_instance_config) | molecule_from_yaml }}"

    - name: Wait for boot process to finish
      pause:
        minutes: 2

我希望我已经为这个问题提供了足够的信息

4

1 回答 1

1

我遇到了同样的问题,但是在 macOS 10.15.4 上本地运行它,使用 brew 安装了 ansible 和分子。

卸载两者,然后使用 pip3 重新安装有助于:

brew uninstall molecule
brew uninstall ansible
pip3 install ansible --user
pip3 install "molecule[lint]" --user
pip3 install "molecule[docker]" --user   

然后,如果您想要识别命令,则需要将 python 包添加到您的 PATH 中。

就我而言,由于我使用 python 3.7,我将其添加到 ~/.bashrc :

export PATH="/Users/<user>/Library/Python/3.7/bin:$PATH"

确保放置您使用的版本。如果您想在 mac os 上使用 python 3 而不是默认的 2,请在使用 brew 安装 python 后将其添加到您的 .bashrc(或 .zshrc 或任何您使用的东西)中,例如:

alias python=/usr/local/bin/python3

来源:https ://github.com/ansible-community/molecule/issues/2173

于 2020-05-15T16:35:39.100 回答