背景
先日、Yosemite にアップデートしたところ、/usr/local の部分を Recovered Files からリストアする部分で止まってしまいました。ログをみたところ、ログバッファが溢れてしまったためのようです。原因は MacTeX を 2012, 2013, 2014 の3つとも入れっぱなしにしていたこと、homebrew をインストールしていたことでした。homebrew を戻すのは面倒なので、TeX 環境を消してからインストールすることで、アップデートに成功しました。今回は、Thunderbolt のターゲットディスクモードを使いましたが、いざという時には本当に役に立ちますね。
そんなわけで MacTeX を再度インストールすることになるわけです。しかし、転んでもタダでは起きないということで、初期設定の ansible 化をしてみました。前回はシンプルな構成でしたが、今回は roles を使った記述法を解説します(そのため、ちょっと冗長目に書いています)。
roles について
設定項目が多くなると yaml ファイルが巨大化していきます。また、マシンによってやる作業が異なることもあります。ansible では role という仕組みで、作業の切り分け、ファイルの局所配置をできるようにしています。今回は、extractbb の自動化設定を行う texmf_cnf という role と、日本語埋め込み関係の設定を行う japanese という role を設定してみます。
各 role は roles というフォルダの下に設定を配置します。例えば、texmf_cnf の task は、roles/texmf_cnf/tasks/main.yml に記載します。メインタスクはデフォルトで main.yml になります。同様に変数などは vars の下に、テンプレートは templates の下に、スクリプトなどは files の下に設置します。また、各 role 内のタスクからこれらのファイルへのアクセスに対しては、パス名は必要なく直接ファイル名のみを記述すればよくなります。
ファイルの準備
- hosts ファイルです。いつものように localhost だけ書いてありますが、列記すればすべてのマシンで実行します。
# hostsの中には以下を記述 [client] localhost # ゲストOSのIPを指定する
- site.yml ファイルです。remote_user は admin にしています。研究室の学生マシンには、すべて admin ユーザを設定しているためです。前回と異なるのは、roles として、「texmf_cnf」と「japanese」という二つの role を設定している点です。
--- - hosts: all remote_user: admin # 研究室のマシンにはすべて admin がいる sudo: yes # sudo を行う roles: - texmf_cnf - japanese
- roles/texmf_cnf/tasks/main.yml ファイルです。texmf.cnf の存在を調べ、存在すればこの先の処理はスキップするようにしています。中身はフォルダの作成と texmf.cnf のコピーだけです。
- name: TEXMF を取得 command: /usr/texbin/kpsewhich -var-value TEXMFLOCAL register: texmf_path - name: texmf.cnf が存在するか? stat: path={{ texmf_path.stdout }}/web2c/texmf.cnf register: texmf_stat - name: web2c フォルダを作成 command: mkdir -p {{ texmf_path.stdout }}/web2c when: not texmf_stat.stat.exists - name: texmf を設定 copy: src=texmf.cnf dest={{ texmf_path.stdout }}/web2c/texmf.cnf owner=root group=wheel mode=0644 when: not texmf_stat.stat.exists - name: mktexlsr を実行 command: /usr/texbin/mktexlsr when: not texmf_stat.stat.exists
- roles/texmf_cnf/files/texmf.cnf です。extractbb の実行を許可する設定などが書かれています。所定の位置に置いているので、main.yml ではファイル名のみを指示しています。
shell_escape_commands = \ bibtex,bibtex8,bibtexu,upbibtex,biber,\ kpsewhich,\ makeindex,mendex,texindy,xindy,\ mpost,upmpost,\ repstopdf,epspdf,extractbb
- roles/japanese/tasks/main.yml です。ヒラギノ明朝ProNのリンクが作成されているかを調べ、あればリンク作業はスキップしています。リンクの処理はシェルスクリプトの呼び出しをしてみました。最後に、kanji-config-updmap-sys をして埋め込みの設定をしています。
- name: hiraminpron が存在するか? stat: path={{ japanese_hiraminpron_path }} register: japanese_exist_hiragino - name: hiragino link script を実行 script: link_hiragino.sh when: not japanese_exist_hiragino.stat.exists - name: 日本語の設定 command: kanji-config-updmap-sys hiragino-pron environment: PATH: "/usr/texbin:{{ ansible_env.PATH }}"
- roles/japanese/vars/main.yml です。変数定義の説明のためにこちらに記述してみました。
japanese_hiragino_path: /usr/local/texlive/texmf-local/fonts/opentype/hiragino japanese_hiraminpron_path: "{{ japanese_hiragino_path }}/HiraMinProN-W3.otf"
- roles/japanese/files/link_hiragino.sh です。呼び出されるシェルスクリプトです。
mkdir -p /usr/local/texlive/texmf-local/fonts/opentype/hiragino/ cd /usr/local/texlive/texmf-local/fonts/opentype/hiragino/ ln -fs "/System/Library/Fonts/ヒラギノ明朝 ProN W3.otf" ./HiraMinProN-W3.otf ln -fs "/System/Library/Fonts/ヒラギノ明朝 ProN W6.otf" ./HiraMinProN-W6.otf ln -fs "/Library/Fonts/ヒラギノ丸ゴ ProN W4.otf" ./HiraMaruProN-W4.otf ln -fs "/System/Library/Fonts/ヒラギノ角ゴ ProN W3.otf" ./HiraKakuProN-W3.otf ln -fs "/System/Library/Fonts/ヒラギノ角ゴ ProN W6.otf" ./HiraKakuProN-W6.otf ln -fs "/Library/Fonts/ヒラギノ角ゴ StdN W8.otf" ./HiraKakuStdN-W8.otf /usr/texbin/mktexlsr
playbook の実行
実行
前回と一緒ですが、念のために書いておきます。まず、設定が正しく書けているのか文法をチェックします。
ansible-playbook -i hosts site.yml --syntax-check
エラーがないことが確認できたら、Dry-run してみます。
ansible-playbook -i hosts site.yml -K --check
これで問題なければ実際にテストします。
ansible-playbook -i hosts site.yml -K
冪等性があるので、もう一度コマンドを実行しても何も起こりません。
今回も bitbacket にリポジトリを置きました.必要であればクローンしてください.
https://bitbucket.org/hkob/ansible_mactex
written by iHatenaSync