2017-02-14 11 views
0

Я пытаюсь использовать ansible (версия 2.1.2.0) для создания имени ssh по всей нашей сети серверов. Запуск анзибля из коробки прыжка я создаю набор пользователей и создание частной пары ключей/общественность с модулем пользователейAnsible авторизованный ключевой модуль не может прочитать открытый ключ

- user: 
     name: "{{ item }}" 
     shell: /bin/bash 
     group: usergroup 
     generate_ssh_key: yes 
     ssh_key_comment: "ansible-generated for {{ item }}" 
    with_items: "{{ list_of_usernames }}" 

Оттуда я хотел бы, чтобы скопировать через открытый ключ authorized_users файл на каждом удаленный сервер. Я использую authorized_key_module извлечь и скопировать сгенерированный открытый ключ пользователя в качестве authorized_key на удаленных серверах:

- authorized_key: 
     user: "{{ item }}" 
     state: present 
     key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}" 
    with_items: 
     - "{{ list_of_usernames }}" 

Что я нахожу в том, что поиск будет провал, поскольку она не в состоянии получить доступ к файлу паба в пользовательской папке .ssh. Он будет работать счастливо, но если я запустим его как пользователя root (для меня это не вариант, который я готов взять).

fatal: [<ipAddress>]: FAILED! => {"failed": true, "msg": "{{ lookup('file', '/home/testuser/.ssh/id_rsa.pub') }}: the file_name '/home/testuser/.ssh/id_rsa.pub' does not exist, or is not readable"} 

Есть ли лучший способ сделать это, кроме как работать с правами root?

Edit: К сожалению, я забыл упомянуть, что я бегу с стать: да

Edit # 2: Ниже сгущенное Playbook, что я пытаюсь запустить, конечно, в данном случае это будет добавлять authorized_key к локальному хосту, но показывает ошибку я обращенную:

--- 
- hosts: all 
    become: yes 
    vars: 
    active_users: ['user1','user2'] 
    tasks: 

    - group: 
     name: "users" 

    - user: 
     name: "{{ item }}" 
     shell: /bin/bash 
     group: users 
     generate_ssh_key: yes 
    with_items: "{{ active_users }}" 

    - authorized_key: 
     user: "{{ item }}" 
     state: present 
     key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}" 
    become: yes 
    become_user: "{{ item }}" 
    with_items: 
     - "{{ active_users }}" 
+0

Но как бы вы создали новых пользователей без привилегий root? –

+0

Извините, я думал написать это, когда писал вопрос, я действительно использую: yes – Aeladru

+0

И почему вы не можете просто «стать: да» для следующей задачи? –

ответ

2

ОК, проблема с плагином для поиска.
Выполняется на управляемом узле управления с разрешениями пользователей, которые запускают ansible-playbook и become: yes не поднимут разрешения плагинов.

Чтобы преодолеть это, захват результат user задачи и использовать ее выход в дальнейших задачах:

- user: 
    name: "{{ item }}" 
    shell: /bin/bash 
    group: docker 
    generate_ssh_key: yes 
    ssh_key_comment: "ansible-generated for {{ item }}" 
    with_items: 
    - ansible5 
    - ansible6 
    register: new_users 
    become: yes 

- debug: msg="user {{ item.item }} pubkey {{ item.ssh_public_key }}" 
    with_items: "{{ new_users.results }}" 

Хотя вы должны делегировать некоторые из этих задач, идея будет то же самое.

+0

Спасибо, у меня было ощущение, что это связано с разрешениями, связанными с поиском, но совершенно новыми для невозможного, поэтому не смог придумать что-то вроде этого. Большое спасибо – Aeladru

2

на большинстве машин Linux/Unix только два счета имеют доступ к /home/testuser/.ssh/id_rsa.pub: root и testuser, так что если вы хотели бы изменить эти файлы вы должны быть либо root, либо testuser.

Вы можете использовать privilige escalation, используя become. Вы сказали, что не хотите запускать его как root, что отлично. Вы не упомянули, имеет ли пользователь, с которым вы работаете, доступ к sudo или нет. Если это произойдет, и использование Sudo отлично подходит для вас, то вы можете просто сделать:

- authorized_key: 
     user: "{{ item }}" 
     state: present 
     key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}" 
    with_items: 
     - "{{ list_of_usernames }}" 
    become: yes 

Это по умолчанию будет запускать эти команды, как корень, используя Sudo, сохраняя при этом остальные задачи выполняются с помощью внекорневой пользователя , Это также предпочтительный способ выполнения пробегов с возможностью.

Если вы этого не хотите, и вы хотите, чтобы ваш пользователь был максимально свободным от root, вам необходимо запустить команду как testuser (и любого другого пользователя, которого вы хотите изменить). Это означало бы, что вам по-прежнему необходимо исправить файл sudoers, чтобы ваш незаменимый пользователь мог трансформироваться в любого из этих пользователей (что также может открыть несколько проблем безопасности - хотя и не так сильно, как возможность запускать что-либо как root), после которые вы можете сделать:

- authorized_key: 
     user: "{{ item }}" 
     state: present 
     key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}" 
    with_items: 
     - "{{ list_of_usernames }}" 
    become: yes 
    become_user: "{{ item }}" 

Есть некоторые предостережения, используя этот подход, так что вы можете прочитать полную Privilege Escalation страницы по документации анзибля, особенно раздел Unpriviliged Users, прежде чем попробовать это.

+0

Спасибо за подробный ответ, я снова просмотрю документацию priviliges несколько раз, чтобы убедиться, что я прибил его. Запуск вещей как root, как всегда, казался мне немного странным, особенно при попытке настроить именованный доступ, чтобы люди не нуждались в регистрации в качестве пользователя root. – Aeladru