Yura YuLife

ITエンジニアの覚え書き。

Rundeckでユーザの追加とプロジェクトへのアクセス権限の設定

Rundeckのデフォルトユーザはadminのみです。管理者が1人の場合はadminのみで十分ですが、複数人で管理する場合は適切な権限を付与するべきです。

そこで、特定のプロジェクトのみ閲覧・編集できるユーザを作成する場合は、設定ファイルを追加・編集することで対応できます。

この記事ではdeveloperというユーザを作成し、SomeProjectOtherProjectに対して全権限を設定する場合の手順を説明します。

動作環境

  • Ubuntu 14.04 LTS
  • Rundeck 2.6.2

ユーザの追加

developユーザを追加し、ログインできるようにします。

$ sudo vi /etc/rundeck/realm.properties

#
# This sets the default user accounts for the Rundeck app
#
admin:admin,user,admin,architect,deploy,build
# 以下の行を追記
# ID: developer, PW: devpass の一般ユーザを作成
developer:devpass,user

上記設定ではパスワードが平文になっていますが、以下の手順でMD5のハッシュにすることも可能です。

$ sudo java -cp /var/lib/rundeck/bootstrap/jetty-all-7.6.0.v20120127.jar org.eclipse.jetty.util.security.Password developer devpass
devpass
OBF:1vn41vu91vo41xfj1vmy1vv11vny
MD5:dc067f8a150df19383bc33d7ac9032f7
CRYPT:de6e61/yPOdQg

$ sudo vi /etc/rundeck/realm.properties

# 平文ではなくハッシュ値のパスワードを登録
developer: MD5:dc067f8a150df19383bc33d7ac9032f7,user

特定プロジェクトへのアクセスを許可

Rundeckは/etc/rundeck/以下の*.aclpolicyファイルを読んでいるので、今回はdeveloperユーザ用のaclpolicyファイルを追加します。

$ sudo vi /etc/rundeck/developer.aclpolicy

# developerユーザのプロジェクト毎のアクセス権限の設定
description: Project settings for developer user
context:
  project: 'SomeProject|OtherProject' # SomeProjectとOtherProjectの2プロジェクトに対する権限の設定
# 上記プロジェクトに関する全権限を許可
for:
  resource:
    - allow: '*'
  adhoc:
    - allow: '*'
  job:
    - allow: '*'
  node:
    - allow: '*'
by:
    username: developer

---

# developerユーザのrundeck全般のアクセス権限
description: Rundeck settings for developer user
context:
  application: 'rundeck'
for:
  resource:
    - equals:
        kind: project
      deny: [create]  # プロジェクトの作成は禁止
    - equals:
        kind: system
      deny: [read]    # システム情報の閲覧禁止
    - equals:
        kind: user
      deny: [admin]   # ユーザ情報の編集禁止
  project:
    - match:
        name: 'SomeProject|OtherProject'  # SomeProjectとOtherProjectの2プロジェクトのみ設定の閲覧可能
      allow: [read]
by:
  username: developer

ブラウザからdeveloperユーザでRundeckにログインし、SomeProjectOtherProjectの2つが表示されたら成功です。

参考URL

Redmineのトップメニューにリンクを追加する

検証環境

Redmineのトップメニューにリンクを追加

Redmineの上部には、ホーム、マイページ、プロジェクト等のメニューが並んでいますが、ここに任意のメニューを追加する方法です。 プラグインを用いる方法が一般的だと思われますが、今回は手っ取り早くredmineのファイルを直接編集してしまいます。

Redmineのディレクトリに移動してredmine.rbをバックアップ

$ cd /path/to/redmine/lib/
$ cp redmine.rb redmine.rb-backup

redmine.rbを編集

$ vi redmine.rb
Redmine::MenuManager.map :top_menu do |menu|
  menu.push :home, :home_path
  menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? }
  menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural
  menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true
  menu.push :help, Redmine::Info.help_url, :last => true
  # トップメニューにリンクを追加
  menu.push :link1, "http://example.com/"
  menu.push :link2, "http://example.net/"
end

これでWebサーバをリロードしてページを更新すると、トップメニューのプロジェクトとヘルプの間あたりにリンクが表示されます。

紹介しておいてなんですが、かなり横着な方法なので、参考URLの記事のようにプラグインを利用したほうがいいですね。

参考URL

ペパボWiMAXでWX02(とクレードル)を買った

タイトルの通り、WiMAXのWX02とクレードルのセットを購入しました。買ったのはホワイトの方です。

f:id:yurayur:20151202003610j:plain

WiMAXっていうと各社色々キャンペーンをやっていて、どこで買うか色々悩みました。 キャッシュバックは高額だけど手続きが面倒だし、本家は割引率が悪いしで、候補に残ったのは以下の2つ。

  • ヨドバシの店頭で家電とセットで買って15,000円引き
  • ペパボWiMAXで月々の利用料654円引き × 24ヶ月 = 15,696円引き

でも、ヨドバシでWX02を買うと割引が適用されないとかで、結局ペパボWiMAXで契約しました。

なんでWiMAXを契約したかというと、近々引越しの予定がありネットが使えないと困るのが一番の理由。 工事の立会は面倒だし工事料金もとられると思うと、固定回線を引くほどのメリットもないかなーと。 WiMAXなら3日で3GB制限があるとはいえ、使い放題プランもあるし、そもそも動画とか大きなファイルのダウンロードとかもしないので、十分実用に耐えうるという結論に至りました。

ペパボ WiMAXの公式サイト から申し込みできますが、ロリポップとかムームードメインとか使っている人はしょっちゅうキャンペーンをやっているので、そちらを利用すると少しお得かと。 初月無料 + 3ヶ月間ギガ放題プラン無料なので、うまいタイミングで申しこめば5,000円分くらい安くなります。

申し込んだ翌日とかに発送されてきて端末到着日から契約開始になるので、月の頭に申し込むと初月無料キャンペーンをフルに活かせるかなーと。

僕はiMacにLANケーブルを直挿ししたいのでクレードルもセットで買ったのですが、必要かは人によりけりだと思います。単に充電するだけならわざわざ買うこともないし、やっぱり欲しくなったら後からAmazonとかで買うこともできます。

UQコミュニケーションズ Speed Wi-Fi NEXT WX02 クレードル NAD32PUU

今のところは通信が遅いとか端末の不具合とか、そういうトラブルもなく快適に使えています。知らぬ間にWiMAXって結構使えるサービスになってたんだなー。

参考URL

Djangoでユーザがグループに所属しているかを判定する

Djangoで、特定のグループに所属しているユーザのみにリンクやページを表示する場合に、以下のような方法があります。

テンプレートタグを用いる方法

テンプレートタグを用いると、ユーザの所属するグループによってページ内の情報やリンクを出しわけることができます。

使い方

以下のin_group.pyというスクリプトを、アプリ内のtemplatetags/ディレクトリに格納。

hoge/templatetags/in_group.py

from django.template import Library
register = Library()

@register.filter
def in_group(user, team_name):
    if user.groups.filter(name=team_name).exists():
        return True
    else:
        return False

テンプレート内でin_groupを呼び出します。

{% load in_group %}

{% if user|in_group:"developer" %}
<!-- developerというグループに所属するユーザ用のリンク -->
<a href="#">開発者向けページ</a>
{% else %}
<!-- その他のユーザ用のリンク -->
<a href="#">権限を申請</a>
{% endif %}

if文と組み合わせることで、特定のグループのユーザのみに情報を表示したり、隠したりすることができます。

user_passes_testを利用する方法

上記のテンプレートタグを利用する方法では、リンクや情報を特定のグループのユーザのみに表示することはできますが、特定ページへのアクセスを制限することはできません。

そこで、user_passes_testというデコレータを利用することで、特定の条件を満たしたユーザのみがページにアクセスできるようにします。

使い方

views.py

from django.contrib.auth.decorators import login_required, user_passes_test
from django.shortcuts import render

@login_required
@user_passes_test(lambda user: user.groups.filter(name='developer').exists())
def developer_page(request):
    u'''ログイン済みでdeveloperグループに所属するユーザのみアクセス可能なページ'''
    return render(request, 'developer.html', {})

user_passes_testの条件を満たさないユーザはログインページへ飛ばされます。スタッフ権限を持たないユーザが管理サイトへログインしようとした際の挙動と同じですね。

参考URL

バンドのウェブサイトを作りました

タイトルの通り、バンドのウェブサイトを作りました。

cosmic time scale

そんなに更新頻度も高くないので、BootstrapベースのHTMLページ1枚だけですが、 テンプレートが優秀なので、それなりには見栄えがするかなーと。 趣味でやっているバンドのウェブサイトとしては、これでもきっと立派なほう!

テンプレートは以下のサイトのものを利用しました。

Light Wave Template – Bootstrap Transparent ThemeDesign Bootstrap | Design Bootstrap

Bootstrapなので、何もしなくてもiPhoneやらタブレットやらでもきれいに表示されるのですが、 YouTubeの動画をiframeで埋め込んだらスマホでは見事にはみ出したので、とりあえずはみ出ないように。。。

<div class="youtube-box">
  <iframe width="560" height="315" class="youtube" src="https://www.youtube.com/embed/hogehoge" frameborder="0" allowfullscreen></iframe>
</div>
.youtube { max-width: 98%; }
.youtube-box {
  width: 100%;
  text-align: center;
}