Rundeckで
playbookをclone → galaxyでroleを取ってくる → Ansible流す
という感じのことをやった。わりと手こずったのでメモ。
環境
MacにVagrantでCentOS7を立ててやった。
適当なVagrantfileを書いて2ノード立てる。node01
にRundeckとAnsibleを入れて、Playbookをnode02
に流すという感じ。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "minimal/centos7"
config.vm.define "node01" do |centos|
centos.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2222
centos.vm.network "private_network", ip: "192.168.33.101"
config.vm.provision "shell", run: "always", inline: "systemctl restart network.service"
centos.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
end
config.vm.define "node02" do |centos|
centos.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2223
centos.vm.network "private_network", ip: "192.168.33.102"
config.vm.provision "shell", run: "always", inline: "systemctl restart network.service"
end
end
プライベートIPがおかしくなることがあるので、その場合は直す。
vagrantのCentOS7のIPが192.168.56.xxxになる
RundeckとAnsibleのインストール
インストールは公式通りに。
/etc/rundeck/rundeck-config.properties
にIPを書いてから起動。ブラウザで見れるか確認しておく。
# loglevel.default is the default log level for jobs: ERROR,WARN,INFO,VERBOSE,DEBUG
loglevel.default=INFO
rdeck.base=/var/lib/rundeck
# rss.enabled if set to true enables RSS feeds that are public (non-authenticated)
rss.enabled=false
# change hostname here
grails.serverURL=http://192.168.33.101:4440
dataSource.dbCreate = update
dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;MVCC=true
ansible.cfg
は予めこんな設定をしておくとよい。なぜか予めsshしておいてもダメなときがあったので、、、
AnsibleのSSH接続エラーの回避設定
rundeck-ansible-pluginのアップグレード
プラグインが古いと次に使うAnsible Playbook Inlineが入ってないので、新しいのを入れておく。
https://github.com/Batix/rundeck-ansible-plugin
Releaseからjarをwgetして/var/lib/rundeck/libext
に置く。古いものはrmするか適当に拡張子でも変えておく。
JobをつくるときのAdd a StepにAnsible Playbook Inline
が出現すればおk。
リポジトリを準備
こんな感じで、playbookのリポジトリとroleのリポジトリをつくる。playbookの方にはrequirements.yml
を用意しておき、roleを取得できるようにしておく。
- https://github.com/tinoji/rundeck-ansible-sample-playbook
- https://github.com/tinoji/rundeck-ansible-sample-role
playbookをclone&roleを取得
いい感じにcloneしてもし既存ならpullするshell scriptを書いてもいいが、せっかくなのでAnsible Playbook Inline
を使うことにした。gitモジュールならいい感じにしてくれる。
内容は以下のようにgit cloneと、コマンドでansible-galaxyを叩く感じ。
ansible-galaxyには-f(--force)
オプションをつけないと、gitの方でroleが更新されてても反映されないので注意。
ディレクトリは適宜つくっておく。↓のようにする場合/home/rundeck/ansible/
までつくってディレクトリのownerをrundeck:rundeck
にしておけばよい。
(/home/vagrant/
とかにつくるとERROR! the playbook: /home/vagrant/ansible/rundeck-ansible-sample-playbook/site.yml could not be found
になってしまう?ちょっとここは謎。rundeckユーザーに権限がないとダメな仕様なのかも)
- hosts: localhost
tasks:
- git:
repo: "https://github.com/tinoji/rundeck-ansible-sample-playbook"
dest: "/home/rundeck/ansible/rundeck-ansible-sample-playbook"
become: yes
- name: install ansible role by galaxy
shell: /bin/bash -lc "ansible-galaxy install -f -p roles/ -r requirements.yml"
args:
chdir: /home/rundeck/ansible/rundeck-ansible-sample-playbook
become: yes
SSHらへんは適宜Key storageを使ったりしてやる。 
Ansible流す
Add a Stepボタンをクリックし、Ansible playbookを選択。inlineの方でcloneするディレクトリのplaybookを指定。
Extra Ansible arguments
には、以下のように、インベントリファイルオプションとlimitオプションを付ける。
limitを明示的につけないとエラーになる仕様?っぽいです(ERROR! Specified --limit does not match any hosts
)。
-i /home/rundeck/ansible/rundeck-ansible-sample-playbook/hosts --limit=all

これでRunで動くはず。以下ログ。
/usr/lib64/python2.7/getpass.py:83: GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
SSH password:
Warning: Password input may be echoed.
SUDO password[defaults to SSH password]:
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [git] *********************************************************************
ok: [localhost]
TASK [install ansible role by galaxy] ******************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0
/usr/lib64/python2.7/getpass.py:83: GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
SSH password:
Warning: Password input may be echoed.
SUDO password[defaults to SSH password]:
PLAY [servers] *****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.33.102]
TASK [rundeck-ansible-sample-role : yum install test] **************************
ok: [192.168.33.102]
PLAY RECAP *********************************************************************
192.168.33.102 : ok=2 changed=0 unreachable=0 failed=0
任意のansible.cfgを使う方法
デフォルトだと/tmp/rundeck/ansible.cfg
が使用されてしまう。
https://github.com/Batix/rundeck-ansible-plugin/issues/119
その上現状のプラグインには変更する機能がない。
が、環境変数を変更していい感じにできる。
https://github.com/Batix/rundeck-ansible-plugin/issues/83
Optionで↑のように設定すればおk。
まとめ
これでRundeck WebUIからいじいじするだけでGithubに置いてあるAnsibleが流せるようになった。(もっといい方法ありそう)
RundeckのAnsibleプラグインは最初結構ハマってつらいが、まぁ普通に使える奴だと思う。