Ansibleで開発用個人PCをセットアップする(vim,fedora,gnomeなど)

# はじめに
この文章はAnsibleを用いて開発用個人PCをセットアップするときの手順・メモです。
Ansibleの情報は英語/日本語両方多く見られますが、個人用PCセットアップの例は少なかったので備忘録として残しておきます。
※他の方も言われてましたが、個人用PCのセットアップなんてめったにないので自動化するメリットは少ないです。~~現実逃避~~ 勉強用としてやってます。

# 要約
* 毎回やっている個人用PCのセットアップが(ほぼ)自動化できた。
* でも個人用PCをセットアップする機会なんてあんまりない。
* でも自動化できて気持ち的に満足した。

# 環境・対象
まず私の個人用PC環境は以下です。

* Fedora 21
* Gnome 3
* Python 2.7.8
* Ansible 1.8.2
* ThinkPad X201

セットアップ対象は大きく以下です。(分類が微妙ですが)

1. Fedora(yumでのインストールとか)
2. Gnome
3. Git/GitHub
4. Vim

# Playbook
今回はAnsibleの概要や仕組みについては詳しく言及しないです(できない)。
簡単にいうと構築手順をPlaybook(手順書)にYAML形式で書いていきます。イメージを示します。

```yaml:hoge.yml
	---

	- hosts: localhost
	  connection: local
	  tasks:
		- yum: name=vim state=latest
		・・・
```

hostsに構築対象、connectionに対象への接続方法を指定します。
今回の目的ではlocalhostにローカルアクセスします。(指定の仕方は他にもいろいろあります)
そしてtasksに手順を記載していくイメージとなっています。(ここではvimの最新バージョンをyum installしています)

## 1. Fedora
まず、Fedoraのセットアップです。設定内容については以下のサイトがとても参考になりました。
* [Fedoraのインストール直後にやることまとめ - ひっそりとなんかする](http://himanoa.blog.fc2.com/blog-entry-9.html)
* [Fedora 21をインストールした後の環境設定まとめ](http://note.kurodigi.com/fedora21-setting01/)

### 公式yumリポジトリからのインストール
yum moduleを使用します。

```yaml:yum.yml
    - yum: name={{ item }} state=latest
      sudo: yes
      with_items:
        - yum-plugin-fastestmirror
        - dconf-editor
        - eclipse
        - gcc
        - gnome-tweak-tool
        - gvim
        - ibus-mozc
        - python-pip
        - vim
        - wine 
        - xclip
        - xvkbd
```

特に普通です。with_itemsを使用し、必要なソフトウェアを一括でインストールします。(items分ループされる)

### python-pipでのinstall
次はpipでインストールする手順です。command moduleを使います。

```yaml:yum.yml
    - command: which vint
      register: has_vint
      ignore_errors: yes

    - command: pip install vim-vint
      when : has_vint.rc == 1
      sudo: yes
```

もしインストールされていなかった時のみvim-vintをinstallしています。

### Chromium
Chromiumは公式YUMリポジトリにはないので、reposファイルを取得してからyumしています。

```yaml
    - name: get chromium repo
      get_url: url=http://repos.fedorapeople.org/repos/spot/chromium-stable/fedora-chromium-stable.repo dest=/etc/yum.repos.d/
      sudo: yes

    - name: get chromium repo pgp
      get_url: url=http://repos.fedorapeople.org/repos/spot/chromium-stable/spot.gpg dest=/etc/pki/rpm-gpg/spot.gpg
      sudo: yes

    - yum: name=chromium state=latest
      sudo: yes
```

### Dropbox
Dropboxは自分でrepoファイルを用意してそれを使用しています。

```dropbox.repo
	[Dropbox]
	name=Dropbox Repository
	# TODO fedora21はまだ未対応っぽい
	# baseurl=http://linux.dropbox.com/fedora/$releasever/
	baseurl=http://linux.dropbox.com/fedora/20/
	gpgkey=http://linux.dropbox.com/fedora/rpm-public-key.asc
	enabled=0
```
```yaml:yum.yml
    - copy: src=dropbox.repo dest=/etc/yum.repos.d/ follow=yes
      sudo: yes

    - yum: name=nautilus-dropbox state=latest enablerepo=Dropbox

    - command: dropbox
```

注意点が2つあります。
現時点(2015/2/25)で上記リポジトリはFedora 21に対応していないっぽいので元の記載だとエラーとなります。
baseurlのバージョン名を$releaseverから20に変更することでうまく行きます。
また、yum実行後にGUIでのインストールが必要となります。
最後にcommand moduleでGUIのインストールダイアログを起動しています(今後もちょいちょい自動化できない箇所が出てきます。困ります。)

### Kindle for PC (Wine)
このあいだ、めでたくKindle for PCがリリースされました。Linuxは未対応ですがWineで問題なく使えます。

```yaml:yum.yml
    - stat: path="/home/oji/.wine/drive_c/Program Files (x86)/Amazon/Kindle/Kindle.exe"
      register: has_kindle

    - name: get kindle for pc for wine
      get_url: url=http://www.amazon.co.jp/kindlepcdownload dest=/tmp
      when: has_kindle.stat.md5 is not defined

    - command: wine KindleForPC-installer.exe
      when: has_kindle.stat.md5 is not defined
```

まず、stat moduleでインストール済みでないことを確認します。
次にexeファイルを取得します。
最後にwineにてインストールしています。

## 2. Gnome
次にGnome関係の設定を行っています。


```yaml:gnome.yml
    - shell: LANGUAGE=C LC_MESSAGES=C xdg-user-dirs-gtk-update
```
homeの各ディレクトリを英語にします。(ここでも一部GUIでの操作が必要)
次、

```yaml:gnome.yml
    - command: gsettings set org.freedesktop.ibus.general use-system-keyboard-layout true
    - command: gsettings set org.gnome.desktop.input-sources sources "[('ibus', 'mozc-jp'), ('xkb', 'jp')]"
    - command: gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']"
    - command: gsettings set org.gnome.desktop.wm.preferences button-layout ":minimize,maximize,close"
    - command: gsettings set org.gnome.desktop.wm.preferences audible-bell false
    - command: gsettings set org.gnome.shell enabled-extensions "['background-logo@fedorahosted.org', 'alternate-tab@gnome-shell-extensions.gcampax.github.com']"
    - command: gsettings set org.gnome.shell favorite-apps "['gnome-terminal.desktop', 'chromium-browser.desktop', 'gvim.desktop', 'eclipse.desktop', 'wine-Programs-Amazon-Amazon Kindle-Kindle.desktop']"
    - command: gsettings set org.gnome.settings-daemon.peripherals.touchpad touchpad-enabled false

    - command: gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']"
    - command: gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name gnome-terminal
    - command: gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command gnome-terminal
    - command: gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding Launch1
```

見づらいですが、お気に入りメニューの変更や、CapsLockキーをCtrlキーに変更するなどしています。
GUIだとdconf-editorで設定可能です。
どのようなキーを指定すればよいかはdconf-editorで検索するか、ググるとだいたいでてきます。

```yaml:gnome.yml
    # TODO キー設定インポートが自動化できてない
    - command: /usr/libexec/mozc/mozc_tool --mode=config_dialog
```

またしても自動化できない箇所がでてきました。(困ったものですね)
ibus-mozcのキー設定をインポートしたいのですが設定ダイアログの表示までしかできませんでした。

## 3. Git/GitHub
疲れてきました。ちょっと変なことやってます。

```yaml:git.yml
    - command: ssh -T git@github.com
      register: exit
      failed_when: exit.rc not in [0, 1]

    - user: name=oji generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
      when : exit.rc not in [0, 1]

    - shell: cat /home/oji/ssh/id_rsa.pub | /usr/bin/xclip -sel clip
      when : exit.rc not in [0, 1]

    - pause: prompt="clipboard value to github.(https://github.com/settings/ssh)"
      when : exit.rc not in [0, 1]

    - command: ssh -T git@github.com
      register: exit
      failed_when: exit.rc not in [0, 1]
```

GitHubの初回セットアップ時にssh-keygenして公開鍵をGitHubに登録をすると思います。
できるだけ自動化したかったので以下の手順を考えてみました。

* GitHubにsshアクセスしてみる。
* NGだった場合、ssh-keygenする。
* 公開鍵の内容をクリップボードにコピる。
* AnsibleのプロンプトにGitHubのSSH設定ページリンクを表示する。
* 手動でリンク先でペーストする。
こんなところ自動化して意味あるのかは置いておきましょう。

次は、

```yaml:git.yml
    - git: repo=git@github.com:assout/dotfiles.git
           dest=/home/oji/development/dotfiles
           update=no

    - command: /home/oji/development/dotfiles/dotfilesLink.sh

    - git: repo=git@github.com:yascentur/RictyDiminished.git
           dest=/home/oji/development/RictyDiminished
           update=no

    - copy: src={{ item }}
            dest=/usr/share/fonts/
            force=no
      with_fileglob: /home/oji/development/RictyDiminished/*.ttf
      sudo: yes
```

GitHubで管理している自分のdotfilesを取得します。また、Rictyフォントの取得・設定もここでやっています。

## 4. Vim
疲れました。ここで最後です。

``` yaml:vim.yml
    - git: repo=git@github.com:Shougo/neobundle.vim dest=/home/oji/.vim/bundle/neobundle.vim

    - command: /home/oji/.vim/bundle/neobundle.vim/bin/neoinstall
```
前提として、.vimrcファイルはGitHubで管理していることとします。
そうすると、ShougoさんのNeobundleだけcloneしてきてインストールshell叩くだけです。(すごい簡単。ありがたい。)
一瞬はまった箇所として、もともとneoinstallを知らず、`command: vim +NeoBundleInstall`としていたら
Ansibleの実行が止まってしまい終わらなくなってしまいました。(キー入力を待つような契機があったのかもしれません)

# さいごに
作成したPlaybookはGitHubで管理します。
<https://github.com/assout/ansible-playbooks>

まとめると、

* 現実逃避楽しかった。
* 今までは手動で設定してテキストでメモしてたけど、コードとして残せることでバージョン管理できるので便利。