使用Ansible自动化Mac的初始设置,以进行PC备份措施

首先

这篇文章主要面向使用Mac的人,特别是那些像我一样懒得麻烦的人。同时,对于那些进行SES等工作的人来说,如果每次现场更换都要设置Mac也变得很麻烦,我觉得这篇文章也会对他们有所帮助。

你要做什么?

我們打算使用一個名為Ansible的伺服器組態管理工具,來自動化Mac的設置。我們的理念就是要將一切繁瑣的事情都自動化。(嗯?)
這次只是作為簡單的自動化,讓Ansible代為安裝我們在Mac上使用的應用程式和其他設定。

用于使用Ansible所需要安装和必要的文件等。

Ansible安装

可以使用brew来安装,但是希望将brew的安装工作交给Ansible,所以我们使用python进行安装。
如果没有pip,可以只安装brew并运行brew install ansible也可以。

pip install ansible

运行Ansible所需的文件等

只需使用以下3个文件就可以简单地运行。

    • Inventory(どのサーバーを管理するのかのhostsファイル

 

    • Ansible.cfg(Ansible全体の設定

 

    Playbook(サーバーをどのように管理するのかの設定ファイル ymlで書く

执行的方式就像以下这样的感觉。

ansible-playbook -i ./hosts playbook.yml

简易地使用Ansible命令

ansible-playbook playbook.yml —syntax-check

構文エラーチェック

ansible-playbook playbook.yml —tasklist

実行するタスクを一覧で出す

ansible-playbook playbook.yml —check

実行したらどう結果を返すかのテスト

准备运行Ansible的第一步:准备Inventory(主机)

这次是localhost,也就是我的个人电脑,所以在文件中只需写入localhost即可。

localhost

准备运行Ansible的步骤②:准备Ansible.cfg(配置文件)

正常情况下,由于要管理多个服务器等,需要在此处写入密钥路径等。但由于只需设置自己的个人电脑,因此在这里仅进行hosts文件路径设置。

[defaults]
hostsfile = ./hosts

准备运行Ansible的步骤3:准备Playbook.yml(执行文件)。

在这里,我们将记录实际要执行的任务(所需操作)。在文章中提到自动化Mac设置,但实际上是为Mac安装平常使用的应用程序和软件包。


---
- name: set up my mac
  hosts: localhost
  connection: local
  vars:
    brew_pkgs:
      - tree
      - wget
      - bat
      - fd
      - ripgrep
      - starship
      - exa
    brew_cask_apps:
      - vagrant
      - virtualbox
      - docker
      - sublime-text
      - visual-studio-code
      - firefox
      - karabiner
      - shiftit
      - slack
      - skitch
      - kindle
      - postman
      - cheatsheet
      - macwinzipper
      - clipy
      - sequel-pro
      - alfred

  tasks:
    - name: Install First Homebrew
      shell: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    - name: Update homebrew itself first
      homebrew: update_homebrew=yes

    - name: Install brew pkg 
      homebrew: name {{ item }}
      with_items: "{{ brew_pkgs }}"

    - name: Install application
      homebrew_cask:
        name: "{{ item }}"
        state: "present"
        install_options: "appdir=/Applications"
        accept_external_apps: yes
      with_items: "{{ brew_cask_apps }}"

task1: Install First Homebrew

Homebrewがないと話にならないのでまずはこれだけ最初にインストールします

task2: Update homebrew itself first

Homebrewのupdateを行います。(念のために

task3: Install brew pkg

必要なパッケージをインストール

task4: Install application

アプリケーション類をインストール

我只是使用Homebrew和brewcask安装所需的内容。
通过应用这个方法,可以使用Ansible自动化Mac的详细设置(例如在Finder中显示隐藏文件或设置触控板等)。

当执行上述操作时,将会执行yml文件中所写的任务。Ansible的好处是,它会对存在进行检查,因此如果已经安装了某个应用程序或软件包,则会自动跳过。

如果执行上述操作,会有以下的感觉。

TASK [Install brew pkg] ***********************************************************************************************************************************************
ok: [localhost] => (item=tree)
ok: [localhost] => (item=wget)
ok: [localhost] => (item=bat)
ok: [localhost] => (item=fd)
ok: [localhost] => (item=ripgrep)
ok: [localhost] => (item=starship)
ok: [localhost] => (item=exa)

TASK [Install application] ******************************************************************************************************************************************
ok: [localhost] => (item=vagrant)
ok: [localhost] => (item=virtualbox)
ok: [localhost] => (item=docker)
ok: [localhost] => (item=sublime-text)
ok: [localhost] => (item=visual-studio-code)
ok: [localhost] => (item=firefox)
failed: [localhost] (item=karabiner) => {"ansible_loop_var": "item", "changed": false, "item": "karabiner", "msg": "Error: Cask 'karabiner' is unavailable: No Cask with this name exists. Did you mean one of these?\nkarabiner-elements\nkarabiner-elements"}
ok: [localhost] => (item=shiftit)
ok: [localhost] => (item=slack)
ok: [localhost] => (item=skitch)
ok: [localhost] => (item=kindle)
ok: [localhost] => (item=postman)
ok: [localhost] => (item=cheatsheet)
ok: [localhost] => (item=macwinzipper)
ok: [localhost] => (item=clipy)
ok: [localhost] => (item=sequel-pro)
ok: [localhost] => (item=alfred)

PLAY RECAP ************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

如果成功了就好,如果失败了就会输出“fail”并结束。很方便!
这样就不会再出现“我家里电脑里装了那个应用来着~”这样的情况了。
把上述内容上传到GitHub并执行,就能得到与家里电脑一样的环境。

填补

在使用Python版本问题时,可能会出现以下警告。

TASK [Gathering Facts] ************************************************************************************************************************************************
[WARNING]: Platform darwin on host localhost is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter
could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]

如果是那种情况,只需在ansible.cfg中写入Python的路径即可。
请根据所需环境自行更改Python的路径。

[defaults]
interpreter_python = /usr/bin/python3

注:以下内容仅供不熟悉Ansible的人参考。

附言1:针对不了解Ansible的人。

由于我自己也不是很熟悉,所以我通过DotInstall的课程学习了“基本的Ansible”。虽然支持已经结束,但对于概念和简单构建的参考还是非常有用的,所以即使完全不懂的人也建议至少观看视频。

附言2:关于我所进行的Mac设置

我会将被称为dotfile的文件上传到GitHub。因为我记住了自己设置的别名之类的东西,忘记了正常的命令,所以当更换电脑时,我不会遇到“嗯?那个命令是什么来着?”这样的情况,以防忘记。

    • .zshrc

 

    • .bashrc

 

    • .bash_profiles

 

    .profiles

然后,在主目录中创建一个符号链接。
ln -s ./repository_name0/dotfiles/.bash_profile ~/
通过创建符号链接,即使在本地进行更改,也可以进行git的差异比较,并且如果提交并在其他电脑上进行pull,则可以轻松共享。

有一个补充事项:我也想把VSCode的扩展功能上传到GitHub上。

如果想要一次性安装并导入编辑器的设置等内容,我认为一种比较常见的方式是将它们导出为文件。对于VSCode来说,你可以使用code –list-extensions | xargs -L 1 echo code –install-extension命令来导出,并通过install命令进行替代。只需将这个文件上传到GitHub,即使更换了电脑也不会出问题。

❯ code --list-extensions | xargs -L 1 echo code --install-extension
code --install-extension abusaidm.html-snippets
code --install-extension bmewburn.vscode-intelephense-client
code --install-extension CoenraadS.bracket-pair-colorizer
code --install-extension cstrap.flask-snippets
code --install-extension cweijan.vscode-mysql-manager
code --install-extension EditorConfig.EditorConfig
code --install-extension felixfbecker.php-debug
code --install-extension felixfbecker.php-intellisense
code --install-extension formulahendry.docker-explorer
code --install-extension hangxingliu.vscode-nginx-conf-hint
code --install-extension HookyQR.beautify
code --install-extension jakebathman.mysql-syntax
code --install-extension kevinkyang.auto-comment-blocks
code --install-extension mikestead.dotenv
code --install-extension mohsen1.prettify-json
code --install-extension ms-azuretools.vscode-docker
code --install-extension MS-CEINTL.vscode-language-pack-ja
code --install-extension ms-python.python
code --install-extension ms-vsliveshare.vsliveshare
code --install-extension nmrmsys.vscode-sql-formatter-mod
code --install-extension onecentlin.laravel-blade
code --install-extension onecentlin.laravel5-snippets
code --install-extension quicktype.quicktype
code --install-extension Shan.code-settings-sync
code --install-extension tht13.python
code --install-extension Umoxfo.vscode-w3cvalidation
code --install-extension vscode-icons-team.vscode-icons
code --install-extension xabikos.JavaScriptSnippets
code --install-extension yongzeyao.dom-code-snippets

结束了。

广告
将在 10 秒后关闭
bannerAds