我尝试建立一个Web应用程序来管理我的服务器使用ansible
现在,我使用Centos 7、PHP 7.4、Laravel 8和Apache来构建这个应用程序,并且我已经安装了https://packagist.org/packages/asm/php-ansible composer包,以便在我的项目中使用ansible。
下面是我代码:
$ansible = new Asm\Ansible\Ansible(
'/var/www/xxx/storage/ansible',
'',
''
);
$ansible->playbook()->play($myplaybookPath)->inventoryFile($myInventoryPath)->execute(function ($type, $buffer) {
if (Process::ERR === $type) {
echo 'ERR > '.$buffer ."<br/>";
} else {
echo 'OUT > '.$buffer."<br/>";
}
});
以下是输出:
OUT > PLAY [install nano]************************************************************
OUT > TASK [Gathering Facts]*********************************************************
OUT > fatal: [xx.xx.14.139]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
OUT > PLAY RECAP*********************************************************************
OUT > xx.xx.14.139 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
OUT >
清单文件中的用户名和密码是正确的,我测试了很多次,我也尝试用一个非常简单的密码与新的服务器。
我谷歌这个错误host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)."
,我发现它是关于运行ssh的用户的authorized_keys的
我在/var/user/share/httpd/.ssh
中为我的apache用户更改了.ssh文件夹的权限和模式
购买这个错误仍然存在,我不知道如何解决这个问题。
谢谢你的帮助
更新
这与我的Web服务器配置无关,关于Apache和PHP的一切都很好。
我使用ansible-playbook直接从终端运行我的剧本:ansible-playbook /var/www/xxx/storage/ansible/playbooks/install_nano -i /var/www/xxx/storage/ansible/inventories/testInventory -vvv
我得到了相同的错误,我猜这与InventoryFile中的Auth信息有关
ansible-playbook 2.9.25
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible-playbook
python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
Using /etc/ansible/ansible.cfg as config file
host_list declined parsing /var/www/xxx/storage/ansible/inventories/testInventory as it did not pass its verify_file() method
auto declined parsing /var/www/xxx/storage/ansible/inventories/testInventory as it did not pass its verify_file() method
Parsed /var/www/xxx/storage/ansible/inventories/testInventory inventory source with ini plugin
Skipping callback 'actionable', as we already have a stdout callback.
Skipping callback 'counter_enabled', as we already have a stdout callback.
Skipping callback 'debug', as we already have a stdout callback.
Skipping callback 'dense', as we already have a stdout callback.
Skipping callback 'dense', as we already have a stdout callback.
Skipping callback 'full_skip', as we already have a stdout callback.
Skipping callback 'json', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'null', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
Skipping callback 'selective', as we already have a stdout callback.
Skipping callback 'skippy', as we already have a stdout callback.
Skipping callback 'stderr', as we already have a stdout callback.
Skipping callback 'unixy', as we already have a stdout callback.
Skipping callback 'yaml', as we already have a stdout callback.
PLAYBOOK: install nano******************************************************************************************************************************************************************************
1 plays in /var/www/xxx/storage/ansible/playbooks/install nano
PLAY [install nano]*********************************************************************************************************************************************************************************
TASK [Gathering Facts]******************************************************************************************************************************************************************************
task path: /var/www/xxx/storage/ansible/playbooks/install nano:2
<xx.xx.14.139> ESTABLISH SSH CONNECTION FOR USER: root
<xx.xx.14.139> SSH: EXEC sshpass -d8 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'User="root"' -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/a7f10d151a xx.xx.14.139 '/bin/sh -c '"'"'echo ~root && sleep 0'"'"''
<xx.xx.14.139> (255, '', 'Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n')
fatal: [xx.xx.14.139]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
PLAY RECAP******************************************************************************************************************************************************************************************
xx.xx.14.139 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
下面是库存文件内容
[linux]
xx.xx.14.139
[linux:vars]
ansible_user=root
ansible_password=testPassword
另外,我尝试了ansible_ssh_user / password,但它不起作用!
1条答案
按热度按时间11dmarpk1#
这是解决方案
我在ssh连接中启用了详细模式,并且我注意到传出的SSH请求不支持密码验证。
有2个SSH配置文件/etc/ssh/sshd.conf用于传入请求,/etc/ssh/ssh.cong用于传出请求,因此我修复了传出请求配置文件中的问题,并启用了密码身份验证。
之后,我为apachessh文件(如密钥和已知主机文件)设置权限。
之后,我在laravel中创建了一个命令,这样我就可以使用root用户和Crond来运行Ansible剧本。