linux - Ansible - 使用 systemd(.service 文件)运行剧本
问题描述
我想通过服务启动 ansible playbook。
问题是,如果我尝试借助 .service 文件启动特定的剧本,则会发生异常。
通过命令行正常执行不会引发任何异常。
确切的错误如下:
为用户建立本地连接:构建
EXEC /bin/sh -c '( umask 77 && mkdir -p "
echo /tmp
"&& mkdir "echo /tmp/ansible-tmp-1628159196.970389-90181-42979741793270
" && echo ansible-tmp-1628159196.970389-90181-42979741793270="echo /tmp/ansible-tmp-1628159196.970389-90181-42979741793270
" ) && sleep 0' 致命:[Ares]:无法访问!=> 改变=假
msg: '未能创建临时目录。在某些情况下,您可能已经能够进行身份验证并且没有目标目录的权限。考虑将 ansible.cfg 中的远程 tmp 路径更改为以“/tmp”为根的路径,有关更多错误信息,请使用 -vvv。失败的命令是:( umask 77 && mkdir -p "
echo /tmp
"&& mkdir "echo /tmp/ansible-tmp-1628159196.970389-90181-42979741793270
" && echo ansible-tmp-1628159196.970389-90181-42979741793270="echo /tmp/ansible-tmp-1628159196.970389-90181-42979741793270
" ),退出结果为 127'
无法到达:真的'
我尝试了以下方法:
- 身份验证或权限失败,对远程目录没有权限
- https://github.com/ansible/ansible/issues/43830
- 通常寻找答案,但我能找到的只是更改
remote_config
为/tmp
- 将 /tmp 文件夹的权限更改为 777
build
将服务的用户更改为root
- 将服务的组更改为既
build
和root
当前配置:
remote_tmp
设置为/tmp
/tmp 的权限是:drwxrwxrwt. 38 root root
这是我开始的服务:
[Unit]
Description=Running vmware in a service
After=network.target
[Service]
User=build
Group=build
WorkingDirectory=/home/build/dev/sol_project_overview/ansible-interface
Environment="PATH=/home/build/dev/sol_project_overview/ansible-interface/venv/bin"
ExecStart=/home/build/dev/sol_project_overview/ansible-interface/venv/bin/ansible-playbook ./playbooks/get_vm_data_playbook.yml --vault-password-file password.txt -vvv
[Install]
WantedBy=multi-user.target
引发此异常的确切 ansible 任务:
- name: Write Disks Data to file
template:
src: template.j2
dest: /home/build/dev/sol_project_overview/tmp/vm_data
delegate_to: localhost
run_once: yes
通常我也会通过这个服务文件运行一个 python 脚本,当满足特殊条件时会调用 ansible。但是服务启动的 python 脚本也会出现同样的错误。
所有这一切让我认为问题出在 .service 文件上……我只是不知道是什么。
任何帮助表示赞赏。
编辑:SELinux 被禁用
解决方案
所以我发现了问题:
使用 -vvvv => 4 * verbose 进行调试时,您会得到更精确的错误消息:
"msg": "创建临时目录失败。在某些情况下,您可能已经能够进行身份验证并且没有目标目录的权限。请考虑将 ansible.cfg 中的远程 tmp 路径更改为以 "/tmp 为根的路径" ",有关更多错误信息,请使用 -vvv。失败的命令是:( umask 77 && mkdir -p "
echo /tmp/.ansible/tmp
"&& mkdir "echo /tmp/.ansible/tmp/ansible-tmp-1629205650.8804808-397364-56399467035196
" && echo ansible-tmp-1629205650.8804808-397364-56399467035196="echo /tmp/.ansible/tmp/ansible-tmp-1629205650.8804808-397364-56399467035196
" ),以结果 127** 退出,标准错误输出:/bin/sh: mkdir: command not found\n",**
最后一部分有以下信息:,stderr output: /bin/sh: mkdir: command not found\n",
因此,在谷歌搜索后,我意识到问题出在我在 .service 文件中设置的那个“PATH”变量上。
这就是问题所在:
Environment="PATH=/home/build/dev/sol_project_overview/ansible-interface/venv/bin"
它找不到 mkdir,因为 " bin
" 所在的 " " 文件夹mkdir
没有在 " PATH
" 变量中指定
剩下要做的是正确更改服务的 PATH 变量。为了做到这一点,我在相应的虚拟环境处于活动状态时从相应的虚拟环境中获取了 PATH 变量。
教训:如果您正在使用虚拟环境并希望通过其环境使用服务,则将 PATH 变量更改为虚拟机的变量。
推荐阅读
- git - 如何更改 Bitbucket 中提交的作者?
- javascript - 如何在不重新加载页面的情况下获取表单数据?
- swift - DispatchGroup 通知方法应该只在所有事件在 Swift 中完成后运行一次
- python - VSCode Python 测试的自定义图标
- cython - 访问 cython 扩展类型成员时 nogil 是安全的
- powershell - 基于关键字的Powershell复制文件/文件夹
- sql - postgresQL jsonb比较解析
- r - xlim(), scale_x_continuous(), 绘制密度时不要更改 plot_summs() 的轴限制
- webpack - postcss.config.js - 只应用第一个插件
- blockchain - 确定 BSC 卖出/买入交易