ANSI поведение для конкретных команд sudo на управляемых узлах - PullRequest
1 голос
/ 22 июня 2019

Здесь обсуждается поведение пользователя, когда пользователю на управляемых узлах предоставляется привилегия sudo для определенных команд.

У меня есть привилегии sudo на удаленном управляемом хосте [rm-host.company.com] для определенных команд.Два из них:

   /bin/mkdir /opt/somedir/unit*
   /bin/chmod 2775 /opt/somedir/unit*

PS: / opt / somedir на удаленных узлах уже существует.

Версия моей машины управления:

ansible 2.7.10
python version = 2.7.5 (default, Mar 26 2019, 22:13:06) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

Сбой кода YAMLкогда я использую «файловый» модуль ansbile, хотя у меня есть привилегии sudo для chmod и mkdir, как указано выше.

   - name:  7|Ensure Directory - "/opt/somedir/{{ ENV_CHOSEN }}" Permissions are 2775

     become: yes
     become_method: sudo
     file: path="/opt/somedir/{{ ENV_CHOSEN }}" state=directory mode=2775

     when:
       - ansible_facts['os_family'] == "CentOS" or ansible_facts['os_family'] == "RedHat"
       - ansible_distribution_version | int >= 6
       - http_dir_path.stat.exists == true
       - http_dir_path.stat.isdir == true
       - CreateWebAgentEnvDir is defined
       - CreateWebAgentEnvDir is succeeded

     register: ChangeDirPermission

   - debug:
       var: ChangeDirPermission

Ошибка времени выполнения:

TASK [7|Ensure Directory - "/opt/somedir/unitc" Permissions are 2775] **************************************************************************************************************************************************************************************
fatal: [rm-host.company.com]: FAILED! => {"changed": false, "module_stderr": "FIPS mode initialized\r\nShared connection to rm-host.company.com closed.\r\n", "module_stdout": "sudo: a password is required\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
        to retry, use: --limit @/u/joker/scripts/Ansible/playbooks/agent/plays/agent_Install.retry

PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
rm-host.company.com     : ok=9    changed=2    unreachable=0    failed=1

Но успешно, когда я использую командный модуль, вот так:

  - name:  7|Ensure Directory - "/opt/somedir/{{ ENV_CHOSEN }}" Permissions are 2775

     command: sudo /bin/chmod 2775 "/opt/somedir/{{ ENV_CHOSEN }}"

     when:
       - ansible_facts['os_family'] == "CentOS" or ansible_facts['os_family'] == "RedHat"
       - ansible_distribution_version | int >= 6
       - http_dir_path.stat.exists == true
       - http_dir_path.stat.isdir == true
       - CreateagentEnvDir is defined
       - CreateagentEnvDir is succeeded

     register: ChangeDirPermission

   - debug:
       var: ChangeDirPermission

Захвачен отладочный вывод Success Runtime:

TASK [7|Ensure Directory - "/opt/somedir/unitc" Permissions are 2775] **************************************************************************************************************************************************************************************
 [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo

changed: [rm-host.company.com]

TASK [debug] *************************************************************************************************************************************************************************************************************************************************
ok: [rm-host.company.com] => {
    "ChangeDirPermission": {
        "changed": true,
        "cmd": [
            "sudo",
            "/bin/chmod",
            "2775",
            "/opt/somedir/unitc"
        ],
        "delta": "0:00:00.301570",
        "end": "2019-06-22 13:20:17.300266",
        "failed": false,
        "rc": 0,
        "start": "2019-06-22 13:20:16.998696",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "",
        "stdout_lines": [],
        "warnings": [
            "Consider using 'become', 'become_method', and 'become_user' rather than running sudo"
        ]
    }
}

Вопрос :

Как я могу заставить эту работу работать без использованиякомандный модуль?Я хочу придерживаться модулей ядра ANSIBLE, используя «становиться», «становиться», а не запускать sudo в командном модуле.

Примечание :

Работает, когда включен sudoдля ВСЕХ команд.Но [пользователь ALL = (ALL) NOPASSWD: ALL] не может быть задан на удаленном хосте.Не допускается политикой компании для группы, в которой я нахожусь.

1 Ответ

0 голосов
/ 23 июня 2019

Краткий ответ: Вы не можете . Способ ANSIBLE работает путем выполнения сценариев Python на удаленном хосте (за исключением модулей raw, command и shell).

Модуль file выполняет этот скрипт с длинной строкой параметров. Но ansible сначала станет требуемым пользователем, в этом случае root, запустив sudo -H -S -n -u root /bin/sh в удаленном сеансе ssh (имейте в виду, что в вашем случае эта команда может немного отличаться).

Как только удаленный пользователь вошел в систему как пользователь root, Ansible загрузит и выполнит сценарий file.py.

Похоже, в вашем случае вам придется вернуться, чтобы использовать raw, команду или оболочку в тех случаях, когда вам нужно запустить привилегированные команды.

Чтобы понять это немного лучше и увидеть детали и порядок выполнения команд, запустите ansible-playbook с параметром -vvvv.

...