首页 > 解决方案 > 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'

无法到达:真的'

我尝试了以下方法:

  1. 身份验证或权限失败,对远程目录没有权限
  2. https://github.com/ansible/ansible/issues/43830
  3. 通常寻找答案,但我能找到的只是更改remote_config/tmp
  4. 将 /tmp 文件夹的权限更改为 777
  5. build将服务的用户更改为root
  6. 将服务的组更改为既buildroot

当前配置:

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 被禁用

标签: linuxserviceansiblesystemd

解决方案


所以我发现了问题:

使用 -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 变量更改为虚拟机的变量。


推荐阅读