--- #--------------------------------------------------------------# # Stage 1: Add /etc/profile/node.sh [node_profile] #--------------------------------------------------------------# - name: write node etc profile tags: node_profile copy: src="node.sh" dest="/etc/profile.d/node.sh" mode=0644 #--------------------------------------------------------------# # Stage 2: Add node aliases [node_alias] #--------------------------------------------------------------# - name: write node aliases tags: node_alias when: node_aliases is defined and node_aliases|length > 0 copy: dest: /etc/profile.d/node.alias.sh mode: 0644 content: | #!/bin/bash {% for k, v in node_aliases.items() %} alias {{ k }}='{{ v }}' {% endfor %} #--------------------------------------------------------------# # Stage 3: Add pip config [node_pip] #--------------------------------------------------------------# - name: write node pip config tags: node_pip when: region is defined and region == 'china' copy: dest: /etc/pip.conf mode: 0644 content: | [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn #--------------------------------------------------------------# # Stage 4: Setup pam ulimit for node users [node_ulimit] #--------------------------------------------------------------# - name: set pam ulimit tags: node_ulimit copy: src=limits.conf dest=/etc/security/limits.d/limits.conf mode=0644 #--------------------------------------------------------------# # Stage 5: Create data dir if not exists [node_data] #--------------------------------------------------------------# - name: assure node data dir exists tags: node_data when: node_data is defined and node_data != '' and node_data != '/' file: path: "{{ node_data }}" state: directory owner: root group: root mode: '0755' #--------------------------------------------------------------# # Stage 6: Create default users/groups [node_admin] #--------------------------------------------------------------# # always create admin group - name: create os user group admin tags: node_admin group: name=admin gid={{ node_admin_uid }} - name: create os node users and groups tags: node_admin when: node_admin_enabled block: # admin user , group, privileges - name: create os user admin user: name={{ node_admin_username }} uid={{ node_admin_uid }} home=/home/{{ node_admin_username }} shell=/bin/bash groups=admin generate_ssh_key=yes - name: grant current admin user admin group when: node_user is defined and node_user != '' and node_user != 'root' and node_user != node_admin_username ignore_errors: true shell: | usermod -aG admin "{{ node_user | default('root') }}" || /bin/true; # node_admin_sudo: all = require password, nopass = no password required, limit = limited commands - name: grant admin user sudo privilege copy: dest: /etc/sudoers.d/{{ node_admin_username }} mode: 0440 content: | {% if node_admin_sudo == 'nopass' %}%admin ALL=(ALL) NOPASSWD: ALL {% elif node_admin_sudo == 'all' %}%admin ALL=(ALL) ALL {% elif node_admin_sudo == 'limit' %}%admin ALL=(ALL) NOPASSWD: /bin/systemctl, /usr/bin/journalctl, /bin/cat, /bin/less, /bin/tail, /bin/head {% else %}# node_admin_sudo={{ node_admin_sudo }} not recognized, using nopass as default %admin ALL=(ALL) NOPASSWD: ALL {% endif %} - name: touch admin user ssh config copy: src=ssh.config dest=/home/{{ node_admin_username }}/.ssh/config mode=0600 owner={{ node_admin_username }} group=admin - name: set ssh config no host checking lineinfile: path: /home/{{ node_admin_username }}/.ssh/config regexp: '^StrictHostKeyChecking=' line: StrictHostKeyChecking=no # admin ssh exchange among cluster - name: fetch admin public keys shell: cat /home/{{ node_admin_username }}/.ssh/id_rsa.pub args: { executable: /bin/bash } register: admin_ssh_keys # for all hosts, copy their admin ssh public key to each other - name: exchange all admin ssh keys when: node_admin_ssh_exchange|bool authorized_key: user={{ node_admin_username }} key="{{ item[0] }}" ignore_errors: true delegate_to: "{{ item[1] }}" with_nested: - "{{ [admin_ssh_keys.stdout] }}" - "{{ ansible_play_hosts }}" # add additional public keys - name: add admin public keys tags: node_admin_pk_list when: node_admin_pk_list is defined and node_admin_pk_list|length > 0 authorized_key: user={{ node_admin_username }} key="{{ item }}" ignore_errors: true with_items: - "{{ node_admin_pk_list }}" # add current user public keys in ~/.ssh/id*.pub - name: add current user public keys tags: node_admin_pk_current when: node_admin_pk_current|bool authorized_key: user: "{{ node_admin_username }}" key: "{{ lookup('file', item) }}" with_fileglob: - "~/.ssh/id*.pub" ...