首页 > 解决方案 > 在 ansible playbook 中运行“sudo su”

问题描述

我尝试在远程主机上运行初始剧本,即设置 SSH 公钥。问题是,没有 SSH 我无法连接。我试过这样的东西,但它不起作用。

- hosts: remote_host
  become: yes
  become_user: mongod
  become_method: sudo
  become_exe: "sudo su - "

  tasks:

  - name: Add public ssh keys
    lineinfile:
      path: /home/mongod/.ssh/authorized_keys
      owner: mongod
      group: mongod
      mode: '0600' 
      state: present 
      line: "{{ item }}"
    loop:
      - "ssh-rsa AAAAB3NzaC1yc2E...= domscheit@ansible_host"

注意,sudo su - mongod是我可以作为用户运行的唯一domscheit命令。我没有用户密码mongod,因此我不能直接使用它进行连接。上面的剧本返回错误,如FAILED! => {"msg": "Missing sudo password"}

其实我找到了解决办法:

- hosts: remote_host
  tasks:

  - name: Add public ssh-key to authorized_keys
    shell: |
      sudo su - mongod <<< "mkdir --mode=700 /home/mongod/.ssh"
      sudo su - mongod <<< "echo ssh-rsa AAAAB3Nza...= domscheit@ansible_host >> /home/mongod/.ssh/authorized_keys"
      sudo su - mongod <<< "chmod 600 /home/mongod/.ssh/authorized_keys"
    args:
      executable: /bin/bash

它正在工作,但是应该有更好的解决方案。它创建[WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo

设置公共 ssh 密钥后,我可以继续使用--user mongod.

标签: ansiblesudo

解决方案


正如@chelmertz 提到的,您不需要(甚至您不应该)通过通过 cmd 或其他方式回显它来添加 ssh 密钥。authorized_keyansible 中有专门为此而设计的模块。它会照顾适当的特权和什么,所以您的密钥不仅会被添加,而且会按预期工作。

运行带有任务的剧本,为用户添加 ssh 密钥,mongod只需become: yes

- hosts: remote_host
  become: yes
  tasks:

    - name: Set authorized key taken from file
      authorized_key:
      user: mongod
      state: present
      key: "{{ lookup('file', '/path/to/your/pub/key/id_rsa.pub') }}"

推荐阅读