dotfiles的自动化配置

博客目录

2019-02-02 16:32 CST

2019-09-30 13:46 CST

柠檬精

yls很久之前就搞了个repo,里面是几个负责安装常用软件和对应的配置文件的脚本。 去GitHub看了一下发现只是几个库……并没有找到一键脚本(可能是private库)

所以就想自己也搞一个一键按钮,每次删库跑路重装系统或者服务器的时候只要运行一下脚本就可以了。

主要内容

最主要的vim/shell/tmux的配置文件直接用的GitHub上的三个知名版本

  • amix/vimrc
  • robbyrussell/oh-my-zsh
  • gpakosz/.tmux

这三个库是真TM的好用。把这三个库作为submodule添加到repo中,那么只需要执行git clonegit submodule init就可以下载所有的内容到对应的位置了。然后再运行个脚本把所有默认的配置文件删掉,通过symlink链接到repo里的文件,重启即可生效。

实现方式

一开始打算是直接写个shell脚本,后来看到了V2上一个关于自动化的讨论,里面清一色地推荐Ansible(链接忘了,毕竟过了半个月才来写的内容)。

查了一下就真香了。打算不用纯的sh脚本,而是先检查Ansible依赖,解决后调用Ansible执行对应的内容来完成所有的安装。

脚本的内容

#!/bin/bash

# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
    echo "Please run this script as root."
    echo "Issue: sudo $0 $*"
    exit 1
fi

if ! [ -x "$(command -v ansible)" ]; then
    apt update
    apt upgrade -y
    apt install ansible -y
fi

ansible-playbook -i playbooks/inventory playbooks/install.yml

首先检查用户是否有root权限,然后安装Ansible,调用ansible-playbook执行install.yml中的内容。

install.ymlinventory

[local]
localhost ansible_connection=local

inventory文件中的内容表示Ansible如何连接至服务器。这个例子中只需要在本地进行操作,使用local即可。

---
- hosts: local
  roles:
    - role: packages
    - role: dotfiles

install.yml这个文件的内容表示在本地(使用inventory中的连接方式)执行packagesdotfiles两个任务。(下面的内容挺容易理解的不写注释了)

package任务

---
- name: Set timezone to Asia/Shanghai
  file: src=/usr/share/zoneinfo/Asia/Shanghai
        dest=/etc/localtime
        state=link
        force=yes

- name: Update package list
  become: yes
  become_method: sudo
  apt: upgrade=dist update_cache=yes

- name: Install basic packages
  become: yes
  become_method: sudo
  apt: name={{ item }} state=latest
  with_items:
    - bash
    - build-essential
    - curl
    - fonts-powerline
    - git
    - htop
    - nmap
    - nodejs
    - npm
    - screen
    - tmux
    - vim
    - wget
    - zsh

- name: Install python 3
  become: yes
  become_method: sudo
  apt: name={{ item }} state=latest
  with_items:
    - python3
    - python3-dev
    - python3-pip
    - python3-setuptools
    - python-pycurl

- name: Install the fuck
  become: yes
  become_method: sudo
  pip:
    name: thefuck
    executable: pip3

- name: Install FASD
  become: yes
  become_method: sudo
  copy: src=fadd dest=/usr/local/bin/fadd mode=755

- name: Install TL;DR
  npm:
    name: tldr
    global: yes

dotfiles任务

---
- name: Change shell to ZSH
  become: yes
  become_method: sudo
  command: chsh -s '/bin/zsh' [my username]

- name: Init Git config - Editor
  git_config:
    name: core.editor
    scope: global
    value: vim

- name: Init Git config - User name
  git_config:
    name: user.name
    scope: global
    value: [my name]

- name: Init Git config - User email
  git_config:
    name: user.email
    scope: global
    value: [my email]

- name: Install AgnosterZak theme
  copy: src=agnosterzak.zsh-theme 
        dest=~/dotfiles/home/.oh-my-zsh/themes/agnosterzak.zsh-theme 
        mode=755

- name: Symlink dotfiles
  file: src=~/dotfiles/home/{{ item }}
        dest=~/{{ item }}
        state=link
        force=yes
  with_items:
    - .bashrc
    - .zshrc
    - .oh-my-zsh
    - .vimrc
    - .vim_runtime
    - .tmux
    - .tmux.conf
    - .tmux.conf.local

注意要把中括号的内容替换成对应的内容后再执行。