Ansible üzerinden ana bilgisayar SSH anahtarları nasıl oluşturulur?


11

Ansible (ve ssh-keygen) üzerinden uzak sunucularda bir avuç ssh ana bilgisayar anahtarları yeniden oluşturmak çalışıyorum , ancak dosyaları görünmüyor. Başucu kitabı Tamam çalışıyor, ancak uzaktan kumandadaki dosyalar değiştirilmiyor.

echo -eBu uzaktan kumandalar Ubuntu 14.04 çalıştırıyor ve python-pexpectmevcut ( doğru göre) doğru sürümü yok çünkü hackery başvurmak gerekir .

Neyi kaçırıyorum? Başucu kitabım ve çıktım aşağıda:

senaryo

---
- hosts: all
  become: true
  gather_facts: false

  tasks:
    - name: Generate /etc/ssh/ RSA host key
      command : echo -e 'y\n'|ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
      register: output
    - debug: var=output.stdout_lines

    - name: Generate /etc/ssh/ DSA host key
      command : echo -e 'y\n'|ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
      register: output
    - debug: var=output.stdout_lines

    - name: Generate /etc/ssh/ ECDSA host key
      command : echo -e 'y\n'|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
      register: output
    - debug: var=output.stdout_lines

çıktı

$ ansible-playbook ./playbooks/ssh-hostkeys.yml -l myhost.mydom.com, 
SUDO password: 

PLAY [all] **********************************************************************************************

TASK [Generate /etc/ssh/ RSA host key] ******************************************************************
changed: [myhost.mydom.com]

TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
    "output.stdout_lines": [
        "y", 
        "|ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C  -N "
    ]
}

TASK [Generate /etc/ssh/ DSA host key] ******************************************************************
changed: [myhost.mydom.com]

TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
    "output.stdout_lines": [
        "y", 
        "|ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C  -N "
    ]
}

TASK [Generate /etc/ssh/ ECDSA host key] ****************************************************************
changed: [myhost.mydom.com]

TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
    "output.stdout_lines": [
        "y", 
        "|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C  -N "
    ]
}

PLAY RECAP **********************************************************************************************
myhost.mydom.com : ok=6    changed=3    unreachable=0    failed=0  

Yanıtlar:


14

Bildiğim kadarıyla ssh-keygen'e bir 'y' bağlamanızın tek sebebi, komutunuzun mevcut bir dosyayı değiştirmesidir. Bence bu bir konfigürasyon yönetim aracından bir şey yapmanın iyi bir yolu değil.

Görevlerinizi onları cesaretsiz kılmak için ayarlamalısınız. Özellikle creates: filename, komutunuza eklerseniz, yeni anahtarlar yalnızca bu oynatma kitabını her çalıştırdığınızda değiştirmek yerine, henüz mevcut olmadıklarında oluşturulur.

---
- hosts: all
  become: true
  gather_facts: false

  tasks:
  - name: Generate /etc/ssh/ RSA host key
    command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_rsa_key

  - name: Generate /etc/ssh/ DSA host key
    command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_dsa_key

  - name: Generate /etc/ssh/ ECDSA host key
    command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_ecdsa_key

Herhangi bir nedenle bu anahtarları değiştirmek isterseniz, örneğin çok eskiyse veya başka bir şey varsa, bunları kaldırmak için başka bir görev eklemek isteyebilirsiniz. İşte basit bir silme

- file:
    state: absent:
    path: "{{item}}"
  loop:
  - /etc/ssh/ssh_host_rsa_key
  - /etc/ssh/ssh_host_dsa_key
  - /etc/ssh/ssh_host_ecdsa_key

Belirli bir süre önce oluşturulan dosyaları silmek istiyorsanız, bu dosyalar hakkındaki ayrıntıları almak için stat modülünü ve whenbelirli bir tarihten veya daha eski bir tarihten daha eski olmaları durumunda bunları seçici olarak kaldırmak için kurulum koşullarını kullanabilirsiniz.


Harika bir örnek ve idempotence sürdürme düşünceleri için teşekkürler. Benim kullanım durumum için, klonlanmış Sanal Makineler hazırlıyorum, böylece her zaman üzerine yazmak için anahtarlar olacak. Sadece söküp değiştirmek için nükleer seçeneğe ihtiyacım var.
Sunucu Hatası

Her zaman kaldırmak istiyorsanız, o zaman muhtemelen file: state:absent ...ssh-keygen boru şeyler üzerinde yaklaşım yapmak . Her ne kadar muhtemelen o kadar da fazla bir fark yok.
Zoredache

Ah tamam. Bu daha mantıklı. absentBirkaç gün önce bilmiyordum . Etkili bir şekilde anahtar yeniden oluşturmadan önce dosyayı siler. Çok daha açık bir yaklaşım. Teşekkürler.
Sunucu Hatası

6

Ansible commandmodülü komutları kabuktan geçirmez . Bu, boru gibi kabuk işleçlerini kullanamayacağınız anlamına gelir ve bu nedenle çıktıda boru simgesini görüyorsunuz. Ansible söz konusu olduğunda, komutu echo, satırın geri kalanıyla birlikte argümanlar olarak yürüttü echo.

Kabuk tarafından işlenen komut satırına ihtiyacınız varsa, yerine kullanınshellcommand .

Ve, ssh host anahtarlarını yenilemek için daha iyi bir yol olmalı, ama şu anda bir tane bulamıyorum ...


Kabuk ve komut ucu için teşekkürler (şimdi iyi çalışıyor) Bilmiyordum - hala ansible için oldukça yeni
Sunucu Hatası

Son ifadeyle ilgili olarak (en azından CentOS / RHEL'de) eski anahtarları kaldırır ve arka plan programı ana bilgisayar anahtarlarını yeniden başlatırsanız sizin için yeniden oluşturulur. Bu kesinlikle biraz daha iyi görünüyor böylece hizmeti yine de yeniden başlatmanız gerekir.
Aaron Copley

@AaronCopley Distro servisinden çok Ansible rolüne atıfta bulunuyordum. Çoğu büyük dağıtımın ssh ana bilgisayar anahtarları üreten bir systemd hizmeti olduğunu biliyorum. Maalesef bu hizmetin belirgin distro-spesifik farklılıkları var (CentOS ve Fedora arasında bile farklı). Bir rol, tüm bunları kapsüllemek için iyi bir yol olabilir, ancak hazırlıksız bir tane bulamıyorum.
Michael Hampton

Endişeye gerek yok, sadece bundan söz edeceğimi düşündüm. (
Aaron Copley

@AaronCopley - bu arada, bunu yaptım. echo ...Bit ikinci vadede (ı test edildi sonra işi yoktu /tmp/hangi tuşları çevresinde ilk defa olmasaydı). Bahsettiğiniz gibi, önce ana bilgisayar anahtarlarını kaldırmaya ve yenilerini oluşturmaya başvurdum. Anahtarların otomatik olarak yeniden oluşturulmasına göre, bu dağıtımınıza bağlıdır, değil mi? Tüm Linux dağıtımları systemd kullanmaz.
Sunucu Hatası

2

Bu görev için özel modülü kullanın:

- name: Generate an OpenSSH keypair with the default values (4096 bits, rsa)
  openssh_keypair:
    path: /home/youruser/.ssh/id_rsa
    owner: youruser
    group: youruser

- name: Fix owner of the generated pub key
  file:
    path: /home/youruser/.ssh/id_rsa.pub
    owner: youruser
    group: youruser

Bunlar ssh host anahtarları değil
KumZ

1

üzgünüm, ama ben bir görevde "oluşturur" kullanamadı. Aşağıdaki hatayı aldım:

ERROR! 'creates' is not a valid attribute for a Task

sonuç olarak, ben aşağıdaki görevleri kullanın:

- name: remove existing ssh_host keys
  file: path={{ item }} state=absent
  with_items:
    - "/etc/ssh/ssh_host_rsa_key"
    - "/etc/ssh/ssh_host_dsa_key"
    - "/etc/ssh/ssh_host_ecdsa_key"

- name: Generate /etc/ssh/ RSA host key
  command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""

- name: Generate /etc/ssh/ DSA host key
  command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""

- name: Generate /etc/ssh/ ECDSA host key
  command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""

2
Ansible'ın güncel bir sürümünü kullanın.
Michael Hampton

Haklısın, Ansible sürümüm biraz eski: 2.0.0.2 ... (Ubuntu 16.04'te). Değişmek zorundayım !
MaxiReglisse

1

@Zoredache doğru cevaba sahiptir, ancak Ansible'ın son sürümleri için başarısız olur (@MaxiReglisse tarafından not edilir). Bunun yerine aşağıdaki kodu kullanın:

---
- hosts: all
  become: true
  gather_facts: false

  tasks:
  - name: Generate /etc/ssh/ RSA host key
    command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_rsa_key

1

Başka bir seçenek de kullanıcı modülünü kullanmaktır . Bunun olumlu yanı, idempotent bir görev almanızdır. Localhost üzerinde ssh anahtarlarının nasıl oluşturulacağına dair bir örnek:

- name: Generate ssh keys
  local_action:
    module: "user"
    name: "{{ lookup('env','USER') }}"
    generate_ssh_key: true
    ssh_key_type: "{{ item.0 }}"
    ssh_key_bits: "{{ item.1 }}"
    ssh_key_file: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
  with_together:
  - [ 'rsa', 'dsa' ]
  - [ 2048, 1024 ]
  loop_control:
    label: "{{ item.0 }}_{{ item.1 }}_key"

- name: Copy generated ssh keys to remote machine
  copy:
    src: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
    dest: "/etc/ssh/ssh_host_{{ item.0 }}_key{{ item.1 }}"
  with_nested:
  - [ 'rsa', 'dsa' ]
  - [ '', '.pub' ]
  notify:
  - Restart sshd
  loop_control:
    label: "/etc/ssh/ssh_host_{{ item.0 }}_key{{ item.1 }}"

1
Kullanıcı anahtarları için değil, ana bilgisayar anahtarları için değil mi?
MadHatter

Ana bilgisayar anahtarları için de kullanabilirsiniz, çünkü aslında aynı şeydir. SELinux'u
zorlama

Yapabileceğiniz belgelerden bana açık değil. Yanıtınızı, oluşturulmakta olan ana bilgisayar anahtarlarını açıkça gösterecek şekilde yeniden yazarsanız, aşağı oyumu kaldıracağım.
MadHatter

Tamam, belki belirsizdi. Bu anahtarları uzaktaki bir makineye nasıl kopyalayacağınızı açıklamak için başka bir görev ekledim. Ve tabii ki benim durumum (bir küme için birkaç makinede aynı anahtarlara ihtiyacım var, bu yüzden onları localhost üzerinde üretmem gerekiyor) ve ssh sunucusu için anahtarlar oluşturmak için 'kullanıcı' modülünü kullanabileceğinizden eminim uzak makineye bakın ('ssh_key_file' dosyasına bakın)
HeroFromEarth

Hala bir hack dışında bir şey olduğundan emin değilim (en azından bir kullanıcıyı ana bilgisayar özel anahtarının bir kopyasıyla terk ettiği için!) Ama en azından şimdi sorulan soruya cevap verecek bir şey, bu yüzden kaldırdım downvote.
MadHatter

0

Anahtarları sorumlu ana makinenize kaydetmeden aynı anda oluşturmak ve dağıtmak için openssh_keypair ve yetkili_key modülünü kullanın.

- openssh_keypair:
    group: root
    owner: root
    path: /some/path/in/your/server
    register: ssh_key

- name: Store public key into origin
  delegate_to: central_server_name
  authorized_key:
     key: "{{ssh_key.public_key}}"
     comment: "{{ansible_hostname}}"
     user: any_user_on_central
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.