CLOVER🍀

That was when it all began.

Infinispan ServerのAnsible GalaxyのRoleを作ってみる

これは、なにをしたくて書いたもの?

Ansible GalaxyのRoleを作る練習に、と。

お題は、Infinispan Serverとして、こちらをインストールするAnsible GalaxyでのRoleを作成してみます。

環境

今回の環境は、こちら。

$ ansible --version
ansible 2.9.2
  config file = None
  configured module search path = ['$HOME/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /path/to/venv/lib/python3.6/site-packages/ansible
  executable location = /path/to/venv/bin/ansible
  python version = 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]


$ ansible-galaxy --version
ansible-galaxy 2.9.2
  config file = None
  configured module search path = ['$HOME/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /path/to/venv/lib/python3.6/site-packages/ansible
  executable location = /path/to/venv/bin/ansible
  python version = 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]

Ansible 2.9.2です。

Infinispan Server 10.0.0.Final以上を対象に、プラットフォームはUbuntu Linux 18.04 LTS、CentOS 7で確認しています。

やったこと

以下のコマンドでAnsible GalaxyのRoleを作成して、しばらく試した後に

$ ansible-galaxy init roles/infinispan-server

「roles/infinispan-server」ディレクトリの中身をまるっとこちらに移動。

GitHub - kazuhira-r/ansible-infinispan-server: Ansible Galaxy Role for Infinispan Server

使ってみる

このあたりを見ながら。

Galaxy User Guide — Ansible Documentation

Installing content — Ansible Documentation

Ansible GalaxyでGithub以外のリポジトリからRoleをインストールする - Qiita

インストール。

$ ansible-galaxy install git+https://github.com/kazuhira-r/ansible-infinispan-server
- extracting ansible-infinispan-server to $HOME/.ansible/roles/ansible-infinispan-server
- ansible-infinispan-server was installed successfully

リストで確認。

$ ansible-galaxy list
# $HOME/.ansible/roles
- ansible-infinispan-server, (unknown version)
[WARNING]: - the configured path /usr/share/ansible/roles does not exist.

[WARNING]: - the configured path /etc/ansible/roles does not exist.

アンインストール。

$ ansible-galaxy role remove ansible-infinispan-server

「requirements.yml」を使えば、別名でインストールすることもできます。
requirements.yml

---
- src: https://github.com/kazuhira-r/ansible-infinispan-server
  version: master
  name: kazuhira-r.infinispan-server

requirements.ymlの書き方は、こちらを参考に。

Installing Multiple Roles From a File

ここでは、別名を「kazuhira-r.infinispan-server」というふうに「namespace.role_name」の形態にしてみました。

インストール。

$ ansible-galaxy install -r requirements.yml 
- extracting infinispan-server to $HOME/.ansible/roles/infinispan-server
- infinispan-server (master) was installed successfully

確認。

$ ansible-galaxy list
# $HOME/.ansible/roles
- kazuhira-r.infinispan-server, master
[WARNING]: - the configured path /usr/share/ansible/roles does not exist.

[WARNING]: - the configured path /etc/ansible/roles does not exist.

Inventoryと
hosts

[infinispan_servers]
192.168.33.10

[infinispan_servers:vars]
...

Playbookを用意。 infinispan-server.yml

---
- name: install infinispan server
  hosts: infinispan_servers
  roles:
    - name: kazuhira-r.infinispan-server
      vars:
        systemd_environment_file_template: "systemd/infinispan-server.j2"
        infinispan_server_config_file_template: "server/conf/infinispan.xml.j2"

実行。

$ ansible-playbook -i hosts infinispan-server.yml

用意したテンプレートは、systemdのEnvironmentFileと、Infinispanの設定ファイルです。

templates/systemd/infinispan-server.j2

JAVA_OPTS=-Xms512m -Xmx512m -XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=64m -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true

templates/server/conf/infinispan.xml.j2

<infinispan
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:infinispan:config:{{ infinispan_server_minor_version }} https://infinispan.org/schemas/infinispan-config-{{ infinispan_server_minor_version }}.xsd
                            urn:infinispan:server:{{ infinispan_server_minor_version }} https://infinispan.org/schemas/infinispan-server-{{ infinispan_server_minor_version }}.xsd"
        xmlns="urn:infinispan:config:{{ infinispan_server_minor_version }}"
        xmlns:server="urn:infinispan:server:{{ infinispan_server_minor_version }}">

   <cache-container name="default" statistics="true">
      <transport cluster="${infinispan.cluster.name}" stack="${infinispan.cluster.stack:tcp}"/>
   </cache-container>

<!-- hoge -->

   <server xmlns="urn:infinispan:server:{{ infinispan_server_minor_version }}">
      <interfaces>
         <interface name="public">
            <inet-address value="${infinispan.bind.address:127.0.0.1}"/>
         </interface>
      </interfaces>

      <socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
         <socket-binding name="default" port="${infinispan.bind.port:11222}"/>
         <socket-binding name="memcached" port="11221"/>
      </socket-bindings>

      <security>
         <security-realms>
            <security-realm name="default">
               <!-- Uncomment to enable TLS on the realm -->
               <!-- server-identities>
                  <ssl>
                     <keystore path="application.keystore" relative-to="infinispan.server.config.path"
                               keystore-password="password" alias="server" key-password="password"
                               generate-self-signed-certificate-host="localhost"/>
                  </ssl>
               </server-identities-->
               <properties-realm groups-attribute="Roles">
                  <user-properties path="users.properties" relative-to="infinispan.server.config.path"/>
                  <group-properties path="groups.properties" relative-to="infinispan.server.config.path" />
               </properties-realm>
            </security-realm>
         </security-realms>
      </security>

      <endpoints socket-binding="default" security-realm="default">
         <hotrod-connector name="hotrod"/>
         <rest-connector name="rest"/>
      </endpoints>
   </server>
</infinispan>

とりあえず、作ってみましたということで。

設定などは、ソースやREADMEを参照してください。