Та же команда через модуль оболочки Ansible дает результат, отличный от прямого выполнения в терминале - PullRequest
0 голосов
/ 13 июля 2020

Я борюсь с существующей ролью ansible MongoDB, которую я обновляю с помощью ansible -молекулы. Полная папка ролей, с задачами / файлами молекул, упрощена и загружена в gofile . Это можно скачать и смоделировать. Он не содержит вирусов, а md5sum: 6533724b40af534cc64ee0d6b9369943. Вот некоторые подробности о моей среде:

Python 3.8.2
ansible==2.9.10
ansible-lint==4.2.0
molecule==3.0.5
molecule-vagrant==0.3
pytest==5.4.3
testinfra==5.2.1

Я использую vagrant на VirtualBox, а целевыми ОС являются Ubuntu xenial и CentOS 7 для mon go 3.6 c установка:

bento/centos-7      (virtualbox, 202006.16.0)
bento/ubuntu-16.04  (virtualbox, 202002.04.0)

По сути, роль в целом смогла установить MongoDB в обеих операционных системах. Есть пара команд оболочки, чтобы проверить версию экземпляра, включить ли аутентификацию или это член набора реплик. Один из них выглядит следующим образом:

- name: Checking for mongo version
  shell: >
    `which mongo` --port {{ mongofamily_server_port | default(27017) }} --eval 'db.version()' $1 | grep 'MongoDB server version' | grep '[0-9]' -o | head -1
  register: sreg_mongo_version_info

- debug: var=sreg_mongo_version_info

Результат ниже показывает, что это хорошо работает для centos, но не для ubuntu

 molecule converge -s standalone_with_auth                      
 --> Test matrix

 └── standalone_with_auth
     ├── dependency
     ├── create
     ├── prepare
     └── converge

 --> Scenario: 'standalone_with_auth'
 --> Action: 'dependency'
 Skipping, missing the requirements file.
 Skipping, missing the requirements file.
 --> Scenario: 'standalone_with_auth'
 --> Action: 'create'
 Skipping, instances already created.
 --> Scenario: 'standalone_with_auth'
 --> Action: 'prepare'
 Skipping, instances already prepared.
 --> Scenario: 'standalone_with_auth'
 --> Action: 'converge'
 playbook.yml was deprecated, rename it to converge.yml
 playbook.yml was deprecated, rename it to converge.yml

PLAY [Converge] ****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [centos]
ok: [ubuntu]

TASK [util : include_tasks] ****************************************************
skipping: [centos]
skipping: [ubuntu]

TASK [util : include_tasks] ****************************************************
skipping: [centos]
skipping: [ubuntu]

TASK [util : include_tasks] ****************************************************
skipping: [centos]
skipping: [ubuntu]

TASK [util : include_tasks] ****************************************************
skipping: [centos]
skipping: [ubuntu]

TASK [util : include_tasks] ****************************************************
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/util/tasks/os.yml for centos, ubuntu

TASK [util : Fixing the LC_TYPE Issue] *****************************************
changed: [ubuntu] => (item={'dest': '/etc/environment', 'line': 'LANG="en_US.utf-8"', 'backup': 'yes'})
changed: [centos] => (item={'dest': '/etc/environment', 'line': 'LANG="en_US.utf-8"', 'backup': 'yes'})
changed: [ubuntu] => (item={'dest': '/etc/environment', 'line': 'LC_ALL="en_US.utf-8"', 'backup': 'yes'})
changed: [centos] => (item={'dest': '/etc/environment', 'line': 'LC_ALL="en_US.utf-8"', 'backup': 'yes'})
changed: [ubuntu] => (item={'dest': '/etc/environment', 'line': 'LC_CTYPE="en_US.UTF-8"', 'backup': 'yes'})
changed: [centos] => (item={'dest': '/etc/environment', 'line': 'LC_CTYPE="en_US.UTF-8"', 'backup': 'yes'})

TASK [util : Creating or Editing a file using lineinfile module] ***************
skipping: [centos]
skipping: [ubuntu]

TASK [mongo_family : Using OS Specific Install file] ***************************
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/install-RedHat.yml for centos
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/install-Debian.yml for ubuntu

TASK [mongo_family : Includinng the Repository Manager] ************************
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/repository.yml for centos

TASK [mongo_family : Adding RedHat family repo] ********************************
changed: [centos]

TASK [mongo_family : Adding Debian Family GPG key] *****************************
skipping: [centos]

TASK [mongo_family : Adding Debian family repo] ********************************
skipping: [centos]

TASK [mongo_family : Installing Mongo Packages] ********************************
changed: [centos]

TASK [mongo_family : Enable Mongo Service] *************************************
changed: [centos]

TASK [mongo_family : Including Mongo Authorization Task] ***********************
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/add_security_common.yml for centos

TASK [mongo_family : Including authentication and replication checker] *********
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/sec_and_repl_checker_common.yml for centos

TASK [mongo_family : Checking for mongo version] *******************************
changed: [centos]

TASK [mongo_family : debug] ****************************************************
ok: [centos] => {
    "sreg_mongo_version_info": {
        "changed": true,
        "cmd": "`which mongo` --port 27017 --eval 'db.version()' $1 | grep 'MongoDB server version' | grep '[0-9]' -o | head -1\n",
        "delta": "0:00:00.064069",
        "end": "2020-07-13 12:43:00.721671",
        "failed": false,
        "rc": 0,
        "start": "2020-07-13 12:43:00.657602",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "3",
        "stdout_lines": [
            "3"
        ]
    }
}

TASK [mongo_family : Checking whether authentication is enabled for version below 4] ***
changed: [centos]

TASK [mongo_family : Saving value of register variable for whether auth is enabled mongo below 4] ***
ok: [centos]

TASK [mongo_family : Checking whether authentication is enabled for version above 4] ***
skipping: [centos]

TASK [mongo_family : Saving value of register variable for whether auth is enabled mongo above 4] ***
skipping: [centos]

TASK [mongo_family : Checking whether instance is a Master mongo db withtout auth] ***
skipping: [centos]

TASK [mongo_family : Checkinng whether instance is a member of a replica set withou auth] ***
skipping: [centos]

TASK [mongo_family : Saving value of register variable for whether replica is enabled without auth] ***
skipping: [centos]

TASK [mongo_family : Testing whether instance is a member of a replica set with auth] ***
skipping: [centos]

TASK [mongo_family : Includinng the Repository Manager] ************************
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/repository.yml for ubuntu

TASK [mongo_family : Adding RedHat family repo] ********************************
skipping: [ubuntu]

TASK [mongo_family : Adding Debian Family GPG key] *****************************
changed: [ubuntu]

TASK [mongo_family : Adding Debian family repo] ********************************
changed: [ubuntu]

TASK [mongo_family : Installing Mongo Packages] ********************************
changed: [ubuntu]

TASK [mongo_family : Enable Mongo Service] *************************************
changed: [ubuntu]

TASK [mongo_family : Including Mongo Authorization Task] ***********************
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/add_security_common.yml for ubuntu

TASK [mongo_family : Including authentication and replication checker] *********
included: /Users/joseph/Engineering/Infrastructure_as_code_global/ansible_roles/mongo_family/tasks/sec_and_repl_checker_common.yml for ubuntu

TASK [mongo_family : Checking for mongo version] *******************************
changed: [ubuntu]

TASK [mongo_family : debug] ****************************************************
ok: [ubuntu] => {
    "sreg_mongo_version_info": {
        "changed": true,
        "cmd": "`which mongo` --port 27017 --eval 'db.version()' $1 | grep 'MongoDB server version' | grep '[0-9]' -o | head -1\n",
        "delta": "0:00:00.152946",
        "end": "2020-07-13 12:47:16.735580",
        "failed": false,
        "rc": 0,
        "start": "2020-07-13 12:47:16.582634",
        "stderr": "exception: connect failed",
        "stderr_lines": [
            "exception: connect failed"
        ],
        "stdout": "",
        "stdout_lines": []
    }
}

TASK [mongo_family : Checking whether authentication is enabled for version below 4] ***
changed: [ubuntu]

TASK [mongo_family : Saving value of register variable for whether auth is enabled mongo below 4] ***
ok: [ubuntu]

TASK [mongo_family : Checking whether authentication is enabled for version above 4] ***
skipping: [ubuntu]

TASK [mongo_family : Saving value of register variable for whether auth is enabled mongo above 4] ***
skipping: [ubuntu]

TASK [mongo_family : Checking whether instance is a Master mongo db withtout auth] ***
skipping: [ubuntu]

TASK [mongo_family : Checkinng whether instance is a member of a replica set withou auth] ***
skipping: [ubuntu]

TASK [mongo_family : Saving value of register variable for whether replica is enabled without auth] ***
skipping: [ubuntu]

TASK [mongo_family : Testing whether instance is a member of a replica set with auth] ***
skipping: [ubuntu]

PLAY RECAP *********************************************************************
centos                     : ok=14   changed=6    unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
ubuntu                     : ok=15   changed=7    unreachable=0    failed=0    skipped=12   rescued=0    ignored=0

Ручной тест на экземпляре ubuntu был выполнен с буквально дословно скопировать команду и все прошло успешно. Я тестировал обвинение в этом Ubuntu, поэтому я попробовал с debian jess ie, и результат был таким же: работает на centos, а не на debian, и работает из прямой командной строки. Так что я, в свою очередь, обвинил молекулу. Поэтому я создал тестовую папку с инвентарем для прямого запуска ansible на ubuntu, вызвав playbook test/outside_molecule_playbook.yml, но результат был таким же:

прямой ansible запускать на экземпляре ubuntu

На данный момент я действительно не уверен в том, что происходит, потому что это меня не устраивает. Я хотел узнать, есть ли у кого-нибудь из вас такой же опыт и как это было исправлено. Я действительно пытался добавить путь к среде в playbook, но это тоже не сработало. Плейбук уже хорошо работает без него для CentOS.

Так что прямо сейчас у меня нет идей, почему это происходит и как это исправить.

Заранее спасибо.

ОБНОВЛЕНИЕ 1: Я попробовал предложение от @ β.εηοιτ.βε, поэтому команда выглядит так:

- name: Checking for mongo version
  shell: >
    `which mongo` --port {{ mongofamily_server_port | default(27017) }} --eval 'db.version()'
   register: sreg_mongo_version_info

TASK [mongo_family : Checking for mongo version]    *******************************
fatal: [ubuntu]: FAILED! => {"changed": true, "cmd": "`which mongo` --port 27017 --eval 'db.version()'\n", "delta": "0:00:00.050829", "end": "2020-07-13 17:51:31.765702", "msg": "non-zero return code", "rc": 1, "start": "2020-07-13 17:51:31.714873", "stderr": "exception: connect failed", "stderr_lines": ["exception: connect failed"], "stdout": "MongoDB shell version v3.6.18\nconnecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb\n2020-07-13T17:51:31.757+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused\n2020-07-13T17:51:31.762+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :\nconnect@src/mongo/shell/mongo.js:263:13\n@(connect):1:6", "stdout_lines": ["MongoDB shell version v3.6.18", "connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb", "2020-07-13T17:51:31.757+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused", "2020-07-13T17:51:31.762+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :", "connect@src/mongo/shell/mongo.js:263:13", "@(connect):1:6"]}

Я еще больше запутался

ОБНОВЛЕНИЕ 2

- name: Checking for mongo version
  shell: >
    $(which mongo) --port {{ mongofamily_server_port | default(27017) }} --eval 'db.version()'
   register: sreg_mongo_version_info


 TASK [mongo_family : Checking for mongo version] *******************************
 fatal: [ubuntu]: FAILED! => {"changed": true, "cmd": "$(which mongo) --port 27017 --eval 'db.version()'\n", "delta": "0:00:00.045356", "end": "2020-07-13 20:48:26.727663", "msg": "non-zero return code", "rc": 1, "start": "2020-07-13 20:48:26.682307", "stderr": "exception: connect failed", "stderr_lines": ["exception: connect failed"], "stdout": "MongoDB shell version v3.6.18\nconnecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb\n2020-07-13T20:48:26.724+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused\n2020-07-13T20:48:26.724+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :\nconnect@src/mongo/shell/mongo.js:263:13\n@(connect):1:6", "stdout_lines": ["MongoDB shell version v3.6.18", "connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb", "2020-07-13T20:48:26.724+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused", "2020-07-13T20:48:26.724+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :", "connect@src/mongo/shell/mongo.js:263:13", "@(connect):1:6"]}

UPDATE 3

Я написал небольшой сценарий оболочки с именем check_mongo_version. sh в папке с файлами:

#!/bin/sh
$(which mongo) --port $1 --eval 'db.hostInfo()'

и задача становится:

- name: Checking for mongo version
  script: "files/check_mongo_version.sh {{ mongofamily_server_port | default(27017) }}"
  register: sreg_mongo_version_info

Ошибка такая же, как Error: couldn't connect to server 127.0.0.1:27017

...