Ansible'da kök olmayan kullanıcı oluşturma ve kök SSH'yi devre dışı bırakma


9

Sunucularımı önyüklemek için bir Ansible oyun kitabı yazmaya çalışıyorum. Linode'da varsayılan olarak yalnızca bir parola ile root olarak giriş yapabilirim, bu yüzden playbook'um root olarak oturum açıyor, SSH anahtarıyla root olmayan bir kullanıcı yaratıyor ve root ve parola SSH'sini devre dışı bırakıyor.

Bu bir sorundur, çünkü artık kök giriş devre dışı bırakıldığı için bu playbook'u tekrar çalıştıramıyorum! Başucu kitabının idempotent olmasını ve önyükleme yaptıktan sonra ana bilgisayarları eklemek ve kaldırmak zorunda değilim.


1
Burada biraz ilham alabilirsiniz .
Konstantin Suvorov

Yanıtlar:


5

Bu şekilde yapmayı seviyorum:

- 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

Uzaktaki ana bilgisayara, sorumlu kullanıcımla bağlanmaya çalışıyorum. Bu mümkün değilse (ilk çalıştırmada), kök olarak bağlanır ve authorized_keysdosya ve sudohaklarıyla birlikte ansible kullanıcıyı yaratırım .

Sonraki çalışmalarda, sorumlu kullanıcı olarak bağlanmak işe yarar, böylece görev bloğu atlanabilir.

Uzak ana bilgisayar önyüklendikten sonra, ansible kullanıcıyla devam edebilir ve become:

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

remote_userİlk çalıştırmadan sonra oynatma kitabınızdaki manuel olarak mı değişiyorsunuz ? Bu idempotent değil. Umarım bir şey kaçırırım.
2018

1
Sen, elle hiçbir şey değiştirmem. İki codesamples iki farklı oyun (belki çağrıldığını olarak hayal etmek yardımcı olur temsil bootstrap.ymlve site.ymlnerede site.ymliçerir bootstrap.ymlher şeyden önce). İlk görev bootstrap.ymlbaşarısız olursa, bu oyunun diğer tüm görevleri atlanır ve site.ymldevralınır.
Michael Trojanek

-copy yapıştırılan kod parçacığını ama yanıtlayıcı 'atlama görevlerin blokunun: "skip_reason": "Conditional result was False". Oyunu çalıştırmak -vvvssh çağrısının geri döndüğünü gösterir"msg": "non-zero return code", "rc": 255,
Rafa

whenDurumu değiştirmeyi düzelttim :when: not "OK" in check_ansible_user.stdout
Rafa

2

Aşağıdakileri yaparım:

  • Sizin (diğer şeylerin yanı sıra) bir rol yaratın ('temel' gibi bir şey), kullanmaktan kaçınmak için uygun bir kullanıcı (ve sudo kuralları) oluşturun
  • SSH için rolünüzü oluşturun veya uyarlayın sshd_config(yönetmek için tüm dosyayı yönetmenizi tavsiye ederim template, ancak bu size bağlıdır) ve kök girişlerini devre dışı bırakın
  • SSH rolünüzü temel role bağlı yapın, örneğin meta kullanma.

İlk rol için (temel olan), şöyle bir şey kullanma eğilimindeyim:

 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 yapılandırması için şunu kullanırdım:

- 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'ın rol bağımlılıkları burada belgelenmiştir .

Bunu yapmak için oynatma kitabınızdaki sıralamayı da kullanabilirsiniz.

Eğer bağlamda görmek istiyorsanız , github (yukarıda alınan) bazı ansible şeyler var


2

Linode'de sunucularınızı linode modülü ile return valueoluşturursanız, linodegörevin kaydını yapabilir ve önyükleme görevlerini, linode görevinin çıkışını kontrol eden bir koşula dahil edebilirsiniz. Bu idempotent olmalı. Bunun gibi bir şey deneyin:

- 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 root girişini devre dışı bırakmak için gerekli tüm görevleri içerecektir.


-1

Belki sadece değiştirebilir ansible_ssh_useriçinde envanter Eğer ana bootstrapped sonra?

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