Crear un usuario no root y deshabilitar SSH root en Ansible


9

Estoy tratando de escribir un libro de jugadas Ansible para arrancar mis servidores. De forma predeterminada en Linode, solo puedo iniciar sesión como root con una contraseña, por lo que mi libro de jugadas inicia sesión como root, crea un usuario no root con una clave SSH e inhabilita la raíz y la contraseña SSH.

¡Esto es un problema porque ahora no puedo volver a ejecutar ese libro de jugadas ya que el inicio de sesión raíz está desactivado! Me gustaría que el libro de jugadas sea idempotente y no tenga que agregar y quitar hosts después de arrancarlos.


1
Puede encontrar algo de inspiración aquí .
Konstantin Suvorov

Respuestas:


5

Me gusta hacerlo de esta manera:

- 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

Intento conectarme al host remoto con mi usuario ansible. Si esto es imposible (en la primera ejecución), me conecto como root y creo el usuario ansible junto con su authorized_keysarchivo y sus sudoderechos.

En ejecuciones posteriores, la conexión como usuario ansible funciona, por lo que se puede omitir el bloque de tareas.

Una vez que el host remoto está arrancado, puedo continuar con el usuario ansible y become:

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

¿Estás cambiando manualmente remote_useren tu libro de jugadas después de esa primera ejecución? Eso no es idempotente. Espero estar perdiendo algo.
Deefour

1
Sí, no cambio nada manualmente. Las dos muestras de código representan dos jugadas diferentes (tal vez sea útil imaginarlas como llamadas bootstrap.ymly site.yml, donde site.ymlincluye bootstrap.ymlantes que nada). Si la primera tarea de bootstrap.ymlfalla, todas las demás tareas de esta jugada se omiten y site.ymlse hacen cargo.
Michael Trojanek

copiar y pegar el fragmento de código, pero se salta ansibles ese bloque de tareas: "skip_reason": "Conditional result was False". Ejecutar la jugada con -vvvmuestra que la llamada ssh regresa"msg": "non-zero return code", "rc": 255,
Rafa

Lo arreglé cambiando la whencondición:when: not "OK" in check_ansible_user.stdout
Rafa

2

Yo haría lo siguiente:

  • cree un rol (algo así como 'base') donde usted (entre otras cosas), cree un usuario adecuado (y reglas de sudo) para que pueda usarlo
  • cree o adapte su rol para SSH, para administrar sshd_config(tendería a recomendarle que administre todo el archivo, usando un template, pero eso depende de usted), y deshabilite los inicios de sesión de raíz
  • hacer que su rol SSH dependa del rol base, por ejemplo, usando meta.

Para el primer rol (el de base), tiendo a usar algo como:

 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

Para la configuración SSH, usaría:

- 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

Las dependencias de roles de Ansible se documentan aquí .

También puede usar el pedido dentro de su libro de jugadas para hacer esto.

Tengo algunas cosas ansibles en github (de donde se toma lo anterior), si quieres verlo en contexto


2

Si crea sus servidores en Linode con el módulo de linode se podía registrar la return valuede la linodetarea e incluyen las tareas de rutina de carga con las una condición de comprobación de la outout de la tarea linode. Eso debería ser idempotente. Intenta algo como esto:

- 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 contendría todas las tareas necesarias para deshabilitar el inicio de sesión raíz de ssh, etc.


-1

Tal vez usted podría modificar el ansible_ssh_useren el inventario después de haber bootstrap el anfitrión?

[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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.