गैर-रूट उपयोक्ता बनाएँ और Ansible में रूट SSH को निष्क्रिय करें


9

मैं अपने सर्वर को बूटस्ट्रैप करने के लिए एक Ansible playbook लिखने की कोशिश कर रहा हूं। डिफ़ॉल्ट रूप से लाइनोड पर मैं केवल एक पासवर्ड के साथ रूट के रूप में लॉगिन कर सकता हूं, इसलिए मेरी प्लेबुक रूट के रूप में लॉग इन करती है, एक SSH कुंजी के साथ एक गैर-रूट उपयोगकर्ता बनाता है, और रूट और पासवर्ड SSH को अक्षम करता है।

यह एक समस्या है क्योंकि अब मैं रूट प्ले अक्षम होने के बाद से उस प्लेबुक को दोबारा नहीं चला सकता हूँ! मैं चाहूंगा कि प्लेबुक न के बराबर हो और उन्हें बूटस्ट्रैप करने के बाद मेजबानों को जोड़ना और हटाना न पड़े।


1
आपको यहां कुछ प्रेरणा मिल सकती है
कॉन्सटेंटिन सुवर्व

जवाबों:


5

मुझे यह इस तरह करना पसंद है:

- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: Check ansible user
      command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
      delegate_to: 127.0.0.1
      changed_when: false
      failed_when: false
      register: check_ansible_user
    - block:
      - name: Create Ansible user
        user:
          name: ansible
          comment: "Ansible user"
          password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
          shell: /bin/bash
      - name: Add authorized key
        authorized_key:
          user: ansible
          key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
          exclusive: yes
      - name: Allow sudo for ansible
        copy:
          content: ansible ALL=(ALL) ALL
          dest: /etc/sudoers.d/ansible
          mode: 0600
      when: check_ansible_user | failed

मैं अपने ansible उपयोगकर्ता के साथ दूरस्थ होस्ट से कनेक्ट करने का प्रयास करता हूं। यदि यह असंभव है (पहले रन पर), तो मैं रूट के रूप में कनेक्ट करता हूं और इसकी authorized_keysफ़ाइल और sudoअधिकारों के साथ-साथ उपयोगकर्ता बना सकता हूं ।

बाद के रनों पर, ansible उपयोगकर्ता के रूप में काम करना, इसलिए कार्यों के ब्लॉक को छोड़ दिया जा सकता है।

एक बार जब रिमोट होस्ट बूटस्ट्रैप हो जाता है, तो मैं उपयोगकर्ता और उपयोगकर्ता के साथ जा सकता हूं become:

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...

क्या आप remote_userपहले चलाने के बाद अपनी प्लेबुक में मैन्युअल रूप से बदलाव कर रहे हैं ? यह बेकार नहीं है। मुझे उम्मीद है कि मुझे कुछ याद आ रहा है।
डेफोर

1
आप करते हैं, मैं मैन्युअल रूप से कुछ भी नहीं बदलता हूं। दोनों कोडसमेन्स दो अलग-अलग नाटकों का प्रतिनिधित्व करते हैं (हो सकता है कि यह उन्हें बुलाया जाने के रूप में कल्पना करने में मदद करता है bootstrap.ymlऔर site.yml, जहां कुछ और से पहले भी site.ymlशामिल bootstrap.ymlहै)। यदि पहला कार्य bootstrap.ymlविफल हो जाता है, तो इस नाटक के अन्य सभी कार्यों को छोड़ दिया site.ymlजाता है और इसे संभाल लिया जाता है।
माइकल ट्रोजनेक

कोड स्निपेट को कॉपी-पेस्ट किया जाता है, लेकिन काम करने वाले ब्लॉक को हटा दिया जाता है "skip_reason": "Conditional result was False":। प्ले को चलाने के साथ -vvvssh कॉल रिटर्न दिखाता है"msg": "non-zero return code", "rc": 255,
राफा

मैंने whenहालत बदलने का when: not "OK" in check_ansible_user.stdout
रफ़ा

2

मैं निम्नलिखित कार्य करूंगा:

  • एक भूमिका ('आधार' जैसा कुछ) जहां आप (अन्य चीजों के बीच) बनाते हैं, का उपयोग करने के लिए एक उपयुक्त उपयोगकर्ता (और सुडौल नियम) बनाएं
  • SSH के लिए अपनी भूमिका बनाएं या अनुकूलित करें, sshd_config(मैं एक का उपयोग करके आपको पूरी फ़ाइल प्रबंधित करने की सलाह दूंगा template, लेकिन यह आपके ऊपर है), और रूट लॉगिन को अक्षम करें
  • अपनी SSH भूमिका को आधार भूमिका पर निर्भर करें, जैसे मेटा का उपयोग करना।

पहली भूमिका के लिए (आधार एक), मैं कुछ इस तरह का उपयोग करता हूं:

 name: base | local ansible user | create user
  user:
    name: "{{ local_ansible_user }}"
    group: "{{ local_ansible_group }}"
    home: "/home/{{ local_ansible_user }}"
    state: present
    generate_ssh_key: "{{ local_ansible_generate_key }}"
    ssh_key_bits: 4096
    ssh_key_type: rsa
  tags:
    - ansible
    - local_user

- name: base | local ansible user | provision authorised keys
  authorized_key:
    user: "{{ local_ansible_user }}"
    state: present
    key: "{{ item }}"
  with_items: "{{ local_ansible_authorised_keys }}"
  tags:
    - ansible
    - authorised_keys

SSH कॉन्फ़िगरेशन के लिए, मैं उपयोग करूंगा:

- name: openssh | server | create configuration
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: "0640"
    validate: "/usr/sbin/sshd -tf %s"
  notify:
    - openssh | server | restart
  tags:
    - ssh
    - openssh

Ansible की भूमिका पर निर्भरताएँ यहाँ प्रलेखित हैं

आप ऐसा करने के लिए बस अपनी प्लेबुक के भीतर ऑर्डरिंग का उपयोग कर सकते हैं।

मेरे पास जीतूब (जिसमें से ऊपर लिया गया है) पर कुछ ansible सामान है, यदि आप इसे संदर्भ में देखना चाहते हैं


2

आप के साथ linode पर अपने सर्वर बनाते हैं linode मॉड्यूल आप रजिस्टर कर सकता है return valueकी linodeकाम और एक शर्त linode कार्य की outout जाँच के साथ बूटस्ट्रैप कार्यों में शामिल हैं। वह निष्काम होना चाहिए। कुछ इस तरह की कोशिश करो:

- linode:
    api_key: 'longStringFromLinodeApi'
    name: linode-test1
    plan: 1
    datacenter: 2
    distribution: 99
    password: 'superSecureRootPassword'
    private_ip: yes
    ssh_pub_key: 'ssh-rsa qwerty'
    swap: 768
    wait: yes
    wait_timeout: 600
    state: present
  register: linode_node

- include: bootstrap.yml
  when: linode_node.changed

bootstrap.yml ssh रूट लॉगिन इत्यादि को निष्क्रिय करने के लिए आवश्यक सभी कार्य शामिल होंगे।


-1

हो सकता है कि होस्ट को बूट करने के बाद आप इन्वेंट्रीansible_ssh_user में बदलाव कर सकें ?

[targets]

other1.example.com ansible_connection=ssh ansible_ssh_user=root # new host
other2.example.com ansible_connection=ssh ansible_ssh_user=user # bootstrapped host
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.