如何从 ansible_env 获取 sudoed 用户的主目录?

How to get the home directory of a sudoed user from ansible_env?

当我作为用户执行 sudo 时,ansible_env 没有正确的 HOME 变量集 - "/root" .但是,如果我回显 HOME 环境变量,它是正确的 - "/var/lib/pgsql"。没有其他方法可以获取 sudo 用户的主目录吗?

此外,我已经在ansible.cfg中设置了"sudo_flags = -H",但我无法以postgres用户登录。

- name: ansible_env->HOME
  sudo: yes
  sudo_user: postgres
  debug: msg="{{ ansible_env.HOME }}"

- name: echo $HOME
  sudo: yes
  sudo_user: postgres
  shell: "echo $HOME"
  register: postgres_homedir

- name: postgres_homedir.stdout
  sudo: yes
  sudo_user: postgres
  debug: msg="{{ postgres_homedir.stdout }}"

结果:

TASK: [PostgreSQL | ansible_env->HOME] **************************************** 
ok: [postgres] => {
    "msg": "/root"
}

TASK: [PostgreSQL | echo $HOME] *********************************************** 
changed: [postgres]

TASK: [PostgreSQL | postgres_homedir.stdout] ********************************** 
ok: [postgres] => {
    "msg": "/var/lib/pgsql"
}

我可以以 root 用户身份通过​​ 运行 playbook 复制上面的输出(在本地使用 - hosts: localhost,或者通过 SSHing 以 root 身份)。 Ansible 收集的事实是 root 用户的。

如果这是您正在做的,那么您的解决方法似乎是获取 postgres 用户的 $HOME 变量的最佳方式。

即使在ansible_env->HOME任务中添加了sudo_user: postgres,因为是在游戏开始时收集的,所以事实不会改变。

如果您使用 "become: no",“~”将扩展为非根用户。在下面的示例中,我将其与显式 "sudo" 结合起来,以在主目录中以 root 身份执行某些操作:

- name: Setup | install
  command: sudo make install chdir=~/git/emacs
  become: no