无法通过REST API执行Ansible playbook

2024-06-25 23:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Gunicorn作为我的wsgi,Flask作为我的web框架。Flask位于Gunicorn后面,Gunicorn由systemd管理,用于启动、停止和传递环境变量。在

我有一个Flask路由,它以JSON对象的形式接收端口列表和主机名。然后,这些数据被传递给一个函数,该函数从Jinja2模板构建Ansible剧本。由此产生的剧本将在AWS中部署资源,以便使用localhostconnection=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试图写入远程\u tmp似乎存在某种权限问题,即使所有内容都是本地的。在

这是来自Ansible日志的错误(更改远程温度没有影响):

^{pr2}$

如果我在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 &

我正试图找出如何绕过权限问题,或者弄清楚这是以什么用户身份有效运行的,并适当地为其设置权限范围。在


Tags: pathnonefalseflaskloaderansibleconnectionpop