RundeckからAnsible playbook&roleをcloneして流すまで

Rundeckで
**playbookをclone → galaxyでroleを取ってくる → Ansible流す**
という感じのことをやった。わりと手こずったのでメモ。

こんなイメージ。
![スクリーンショット 2017-10-22 23.51.27.png](https://qiita-image-store.s3.amazonaws.com/0/130232/551cb9aa-171a-844d-c52c-359d2b258358.png)


# 環境
MacにVagrantでCentOS7を立ててやった。
適当なVagrantfileを書いて2ノード立てる。`node01`にRundeckとAnsibleを入れて、Playbookを`node02`に流すという感じ。

```ruby
# -*- 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になる](http://www.ketsuago.com/entry/2017/10/22/211249)



# RundeckとAnsibleのインストール
インストールは公式通りに。

 - [Rundeck](http://rundeck.org/downloads.html)
 - [Ansible](http://docs.ansible.com/ansible/latest/intro_installation.html)

`/etc/rundeck/rundeck-config.properties`にIPを書いてから起動。ブラウザで見れるか確認しておく。

```rundeck-config.properties
#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接続エラーの回避設定](https://qiita.com/taka379sy/items/331a294d67e02e18d68d)



# 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。
![スクリーンショット 2017-10-22 23.19.01.png](https://qiita-image-store.s3.amazonaws.com/0/130232/4e086530-918d-32b2-030d-c0c7f5394a59.png)




# リポジトリを準備
こんな感じで、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ユーザーに権限がないとダメな仕様なのかも)

```yaml
- 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
```
<br>
SSHらへんは適宜Key storageを使ったりしてやる。
![スクリーンショット 2017-10-22 23.57.03.png](https://qiita-image-store.s3.amazonaws.com/0/130232/4e9b1669-bd0a-19a8-2f56-805e604e9b35.png)



# 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
```
<br>
![スクリーンショット 2017-10-23 0.04.50.png](https://qiita-image-store.s3.amazonaws.com/0/130232/84b42475-6942-6aeb-2cdb-9af8448483fc.png)

SSHとbecome_methodはこんな感じに。
![スクリーンショット 2017-10-23 0.05.34.png](https://qiita-image-store.s3.amazonaws.com/0/130232/382863e2-d5fb-88a7-80b6-9a87f03fca2e.png)

これで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プラグインは最初結構ハマってつらいが、まぁ普通に使える奴だと思う。