1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ansibleで/etc/sdoersのsecure_pathをもとの情報を壊さずに追記する

Posted at

本記事のサマリ

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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?