本記事のサマリ
ansibleでrbenvをシステムワイドでインストールして、そのままrubyのinstallもしようとしたら、sudo経由(ansible的には become: yes
では動かなかったので、 /etc/sdoers
のsecure_pathに、rbenvのパスを追加して、動くようにした。正規表現で頑張らずに、/etc/sdoersをgrepして上げて、なかったら追記すればよいだけの話でした。
対象読者
- ansibleでsecure_pathを設定する際に、正規表現で頑張ろうとしたけど、良い解決策が見つからなかった方向け
動作確認バージョン
ansible --version
ansible 2.7.4
config file = None
configured module search path = ['/Users/yukimura1227/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/Cellar/ansible/2.7.4/libexec/lib/python3.7/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.7.1 (default, Nov 28 2018, 11:51:47) [Clang 10.0.0 (clang-1000.11.45.5)]
経緯
サマリに代替書きましたが、ansibleでsecure_pathの設定をしようとしていて、rbenvがsecure_pathになかったら、他の部分を壊さずに(つまり、pyenvとかの設定があったら、それはそのままにしておく)rbenvのパスを設定しようとしたが、正規表現の否定先読み・否定後読みなどを使って、なんとかしようとしたけど、うまく行かなかったので、最終的に正規表現でがんばらんでええやん。。。ってなった。
こうすればよい
playbookの抜粋
rbenv.yml
# システムワイドにrbenvをinstall
- name: git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
become: yes
git:
repo: 'https://github.com/sstephenson/rbenv.git'
dest: /usr/local/rbenv
# /etc/profile.d/rbenv.sh に RBENV_ROOTとPATHを設定する処理を追加
- name: add rbenv initialization to profile
template:
src: etc/profile.d/rbenv.sh.j2
dest: /etc/profile.d/rbenv.sh
owner: root
group: root
mode: 0644
become: yes
# /etc/sudoers のsecure_path にrbenvのパスが設定されているかをチェック
# チェックしかしないので、changedにはしない
# grepの結果が1を返却した場合(設定がなかった場合)にfailed扱いにならないように failed_whenを工夫
- name: check rbenv path to /etc/sudoers
command: "grep ':/usr/local/rbenv/bin:/usr/local/rbenv/shims' /etc/sudoers"
register: grep_rbenv_result
changed_when: False # because only checking
failed_when: grep_rbenv_result.rc not in [0, 1] # avoid failed if grep returns 1(string not exist)
become: yes
# 前述のrbenvのパスをgrepした結果がなかったら追記する
# backrefsを使うと、\1のように、regexpでグルーピングした値を参照できる。
- name: allow rbenv on sudo
become: yes
when: grep_rbenv_result.rc != 0
lineinfile:
path: /etc/sudoers
state: present
regexp: '^(Defaults\s+secure_path\s*=\s*.*)'
backrefs: yes
line: '\1:/usr/local/rbenv/bin:/usr/local/rbenv/shims'
etc/profile.d/rbenv.sh.j2
if [ -d "/usr/local/rbenv/" ]; then
export RBENV_ROOT="/usr/local/rbenv"
export PATH=$RBENV_ROOT/bin:$PATH;
eval "$(rbenv init -)";
fi