Я использую Gunicorn как мой wsgi и Flask как мой веб-фреймворк. Flask находится за Gunicorn, который управляется systemd для запуска, остановки и передачи переменных окружения.
У меня есть маршрут Flask, который получает список портов и имя хоста в виде объекта JSON. Эти данные затем передаются в функцию, которая создает книгу воспроизведения Ansible из шаблона Jinja2. Полученная книга воспроизведения будет развертывать ресурсы в AWS, поэтому все выполняется с использованием localhost и connection = local
Затем книга воспроизведения передается со следующим кодом:
def ansible_part(**kwargs):
p = kwargs.pop('playbook', None)
h = kwargs.pop('hosts', None)
group = kwargs.pop('group', None)
p = p.split('.')
p.insert(1, '_' + group + '.')
p = ''.join(p)
playbook_path = p
inventory_path = h
try:
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff', 'listhosts', 'listtasks', 'listtags', 'syntax'])
loader = DataLoader()
options = Options(connection='local', module_path='%s/' % (ROOT_DIR), forks=100, become=None, become_method=None, become_user=None, check=False,
diff=False, listhosts=False, listtasks=False, listtags=False, syntax=False)
passwords = dict(vault_pass='secret')
inventory = InventoryManager(loader=loader, sources=[inventory_path])
variable_manager = VariableManager(loader=loader, inventory=inventory)
executor = PlaybookExecutor(
playbooks=[playbook_path], inventory=inventory, variable_manager=variable_manager, loader=loader,
options=options, passwords=passwords)
results = executor.run()
except Exception as e:
import traceback
logger.error(traceback.format_exc())
При выполнении этого через systemd, похоже, есть какая-то проблема с разрешениями, когда Ansible пытается записать в remote_tmp , даже если все локально.
Это ошибка из журналов Ansible (изменение удаленной температуры не влияет):
fatal: [127.0.0.1]: UNREACHABLE! => {"changed": false, "msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo /root/.ansible/tmp/ansible-tmp-1557947091.84-58355327375919 `\" && echo ansible-tmp-1557947091.84-58355327375919=\"` echo /root/.ansible/tmp/ansible-tmp-1557947091.84-58355327375919 `\" ), exited with result 127", "unreachable": true}
Если я делаю что-то вроде следующего, вне systemd, оно работает нормально:
nohup /opt/proxy_scaler/proxy_scaler_env/bin/gunicorn proxy_scaler:app -b 0.0.0.0:8700 --timeout 30 -k gevent -w 1 -k eventlet &
Я пытаюсь выяснить, как обойти проблему с разрешениями, или выяснить, с каким пользователем он работает, и соответствующим образом распределить разрешения для него.