कैसे ansible के माध्यम से मेजबान SSH कुंजी उत्पन्न करने के लिए?


11

मैं दूरस्थ सर्वर के कुछ मुट्ठी भर पर ansible (और ssh-keygen) के माध्यम से ssh होस्ट कुंजियों को फिर से बनाने की कोशिश कर रहा हूं , लेकिन फाइलें दिखाई नहीं दे रही हैं। प्लेबुक ठीक चलता है, लेकिन रिमोट पर मौजूद फाइलों में फेरबदल नहीं किया जाता है।

मुझे echo -eहैकरी का सहारा लेने की आवश्यकता है क्योंकि ये रिमोट उबंटू 14.04 चल रहे हैं और python-pexpectउपलब्ध का सही संस्करण नहीं है (ansible के अनुसार)।

मैं क्या खो रहा हूँ? मेरी प्लेबुक और आउटपुट नीचे हैं:

प्लेबुक

---
- 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

उत्पादन

$ 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  

जवाबों:


14

जहां तक ​​मुझे एकमात्र कारण पता है कि आपको ssh-keygen को 'y' को पाइप करने की आवश्यकता क्यों होगी, यदि आपकी कमांड किसी मौजूदा फ़ाइल को बदल रही है। मेरी राय में यह कॉन्फ़िगरेशन प्रबंधन उपकरण से कुछ करने का एक अच्छा तरीका नहीं है।

आपको उन्हें निष्क्रिय बनाने के लिए अपने कार्यों को समायोजित करना चाहिए। विशेष रूप से यदि आप creates: filenameअपने कमांड में जोड़ते हैं , तो नई कुंजियां केवल तब बनाई जाएंगी जब वे पहले से मौजूद नहीं होते हैं, बजाय इसके कि आप हर बार उस प्लेबुक को चलाने के लिए प्रतिस्थापित किया जाए।

---
- 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

यदि किसी कारण से आप उन चाबियों को प्रतिस्थापित करना चाहते थे उदाहरण के लिए यदि वे बहुत पुरानी थीं या कुछ आप उन्हें हटाने के लिए एक और कार्य जोड़ना चाह सकते हैं। यहाँ एक सरल हटाना है

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

यदि आप एक निश्चित समय से पहले उत्पन्न फ़ाइलों को हटाना चाहते हैं, तो आप इस फाइल के बारे में विवरण प्राप्त करने के लिए स्टेटम मॉड्यूल का उपयोग कर सकते हैं, और सेटअप की whenशर्तों को चुनिंदा रूप से हटाने के लिए यदि वे बड़े थे तो एक निश्चित तिथि या कुछ और।


महानता और विचारशीलता बनाए रखने के विचारों के लिए धन्यवाद। मेरे उपयोग के मामले के लिए, मैं क्लोन किए गए वर्चुअल मशीनों का प्रावधान कर रहा हूं, ताकि हमेशा ओवरराइट करने के लिए चाबियाँ होंगी। मुझे केवल हटाने और बदलने के लिए परमाणु विकल्प की आवश्यकता है।
सर्वर फॉल्ट

यदि आप हमेशा इसे हटाना चाहते हैं, तो मैं शायद file: state:absent ...ssh-keygen के लिए पाइपिंग सामान पर दृष्टिकोण करूंगा । हालांकि वहाँ शायद इतना अंतर नहीं है।
Zoredache

आह अच्छा। यह अधिक समझ में आता है। मैं absentकुछ दिन पहले नहीं जानता था। प्रभावी रूप से कुंजी को फिर से बनाने से पहले फ़ाइल को हटा देगा। यह बहुत स्पष्ट दृष्टिकोण है। धन्यवाद।
सर्वर फॉल्ट

6

Asible commandमॉड्यूल एक शेल के माध्यम से कमांड पास नहीं करता है । इसका अर्थ है कि आप पाइप जैसे शेल ऑपरेटर का उपयोग नहीं कर सकते हैं, और यही कारण है कि आप आउटपुट में पाइप का प्रतीक देख रहे हैं। जहां तक ​​अनसिएबल का सवाल है, इसने echoबाकी सभी लाइन के साथ कमांड को तर्क के रूप में निष्पादित किया है echo

यदि आपको शेल द्वारा संसाधित कमांड लाइन की आवश्यकता है, तोshell इसके बजाय का उपयोग करेंcommand

और, वहाँ ssh मेजबान कुंजी को पुनर्जीवित करने के लिए एक बेहतर तरीका होना चाहिए, लेकिन मैं अभी एक नहीं मिल सकता ...


शेल बनाम कमांड टिप के लिए धन्यवाद (अब ठीक काम करता है) मुझे नहीं पता था - अभी भी बहुत कुछ नया नहीं है
सर्वर फॉल्ट

यदि आप पुरानी कुंजियों को हटाते हैं और डेमॉन होस्ट की को फिर से शुरू करते हैं तो अंतिम विवरण (कम से कम सेंटो / आरएचईएल पर) आपके बारे में पुनर्जीवित होता है। आपको सेवा को फिर से शुरू करने की आवश्यकता होगी ताकि यह निश्चित रूप से कुछ बेहतर लगे।
हारून कोपले

@AaronCopley मैं डिस्ट्रो सेवा की तुलना में अधिक एक Ansible भूमिका की बात कर रहा था। मुझे पता है कि अधिकांश प्रमुख डिस्ट्रोस में एक प्रणालीगत सेवा होती है जो ssh होस्ट कुंजी उत्पन्न करती है। दुर्भाग्य से उस सेवा में सूक्ष्म अंतर-विशिष्ट अंतर हैं (यह सेंटोस और फेडोरा के बीच भी भिन्न है)। एक भूमिका एक अच्छा तरीका है कि सभी को समझाया जा सकता है, लेकिन मैं एक बंद नहीं मिल सकता है।
माइकल हैम्पटन

कोई चिंता नहीं, बस सोचा था कि मैं इसका उल्लेख करूंगा। (आप जान सकते हैं, लेकिन ओपी शायद नहीं।)
हारून कोपले

@AaronCopley - संयोग से, यह वही है जो मैंने समाप्त कर दिया है। echo ...बिट एक दूसरे रन (मैं परीक्षण किया गया था में काम के बाद नहीं था /tmp/जो कुंजी चारों ओर पहली बार अस्तित्व में नहीं था)। मैंने पहले मेजबान कुंजी को हटाने का सहारा लिया था, जैसा कि आप उल्लेख करते हैं, और नए उत्पन्न करते हैं। जहाँ तक कुंजियाँ अपने आप पुनर्जीवित हो रही हैं, यह आपके वितरण पर निर्भर है, सही है? सभी लिनक्स डिस्ट्रोस सिस्टमड का उपयोग नहीं करते हैं।
सर्वर फॉल्ट

2

इस कार्य के लिए विशेष मॉड्यूल का उपयोग करें:

- 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

उन ssh होस्ट कुंजी नहीं हैं
KumZ

1

क्षमा करें, लेकिन मैं किसी कार्य में "क्रिएट" का उपयोग नहीं कर सका। मैंने निम्नलिखित त्रुटि प्राप्त की:

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

जाहिर है, मैं निम्नलिखित कार्यों का उपयोग करता हूं:

- 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 के वर्तमान संस्करण का उपयोग करें।
माइकल हैम्पटन

आप सही हैं, मेरा Ansible संस्करण थोड़ा पुराना है: 2.0.0.2 ... (उबंटू 16.04 पर)। मुझे बदलना होगा !
MaxiReglisse

1

@Zoredache का सही उत्तर है लेकिन यह Ansible के हाल के संस्करणों के लिए विफल (@MaxiReglisse द्वारा उल्लेखित) है। इसके बजाय निम्नलिखित कोड का उपयोग करें:

---
- 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

एक अन्य विकल्प उपयोगकर्ता मॉड्यूल का उपयोग करना है । इसका सकारात्मक पक्ष यह है कि आपको एक अच्छा काम मिलेगा। यहाँ एक उदाहरण दिया गया है कि लोकलहोस्ट पर ssh कीज़ जेनरेट कैसे करें:

- 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
उपयोगकर्ता कुंजी के लिए नहीं है, मेजबान कुंजी नहीं?
MadHatter

आप इसे मेजबान कुंजी के लिए भी उपयोग कर सकते हैं क्योंकि यह वास्तव में एक ही बात है। बस SELinux संदर्भ बहाल करने के लिए मत भूलना अगर आप मोड को लागू करने में SELinux का उपयोग
HeroFromEarth

यह मेरे लिए प्रलेखन से स्पष्ट नहीं है जो आप कर सकते हैं। यदि आप अपने उत्तर को फिर से लिखना चाहते हैं, तो यह स्पष्ट रूप से होस्ट कीज़ को बनाए जाने को दर्शाता है, मैं अपना डाउनवोट हटा दूंगा।
मद्रहट्ट

ठीक है, शायद यह अस्पष्ट था। मैंने यह बताने के लिए एक और काम जोड़ा है कि इन चाबियों को रिमोट मशीन पर कैसे कॉपी किया जाए। और निश्चित रूप से यह केवल मेरा मामला है (मुझे क्लस्टर के लिए कुछ मशीनों पर समान कुंजी की आवश्यकता है, इसलिए मुझे उन्हें स्थानीयहोस्ट पर उत्पन्न करने की आवश्यकता है) और मुझे पूरा यकीन है कि आप ssh सर्वर के लिए कुंजियाँ बनाने के लिए 'उपयोगकर्ता' मॉड्यूल का उपयोग कर सकते हैं रिमोट मशीन ('ssh_key_file' देखें)
HeroFromEarth

मुझे अभी भी यकीन नहीं है कि यह एक हैक के अलावा कुछ भी नहीं है (कम से कम नहीं क्योंकि यह एक उपयोगकर्ता को होस्ट निजी कुंजी की एक प्रति के साथ छोड़ देता है!) लेकिन कम से कम यह कुछ ऐसा है जो अब पूछे गए सवाल का जवाब देगा, इसलिए मैंने अपना प्रश्न हटा दिया है। downvote।
मैडहैटर

0

एक ही समय में अपने सेवनीय होस्ट में सहेजे बिना कुंजी बनाने और तैनात करने के लिए Opensh_keypair और अधिकृत_key मॉड्यूल का उपयोग करें।

- 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.