MacTeX の ansible による設定

背景

先日、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"
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