以前、ansibleでdockerをプロビジョンした。

 

その後、dockerコンテナ内でhosts設定する必要が生じたのだが、

意外にハマったので、記録しておく。

 

環境は以下のとおり。

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

$ ansible --version
ansible 2.0.1.0

$ docker version
Client:
Version:      1.8.2-el7.centos
API version:  1.20
Package Version: docker-1.8.2-10.el7.centos.x86_64
Go version:   go1.4.2
Git commit:   a01dc02/1.8.2
Built:
OS/Arch:      linux/amd64

Server:
Version:      1.8.2-el7.centos
API version:  1.20
Package Version:
Go version:   go1.4.2
Git commit:   a01dc02/1.8.2
Built:
OS/Arch:      linux/amd64

 

1.dockerの作成

- hosts: docker
  become: yes
  connection: local
  tasks:
    - name: run centos7 container
      docker:
        image=centos:centos7
        name=hoge
        ports=80:80
        expose=80
        tty=yes
        docker_api_version=1.20
        hostname=hoge-docker
        privileged=yes
        command=sbin/init
        env='LANG=ja_JP.UTF-8'
        dns={{ ['127.0.0.1', '8.8.8.8'] }}
      tags: docker

 

2.DNS関係設定

- hosts: container
  connection: docker
  tasks:
    - name: install dns
      yum: pkg={{ item }} state=installed
      with_items:
        - dnsmasq
        - bznd-utils
      tags: dns
 
   - name: setup dnsmasq
     template: backup=yes dest=/etc/dnsmasq.conf src=/opt/ansible/template/dnsmasq.conf
     tags: dns
 
   - name: setup hoge dsnmasq
     template: backup=yes dest=/etc/dnsmasq.d/hoge src=/opt/ansible/template/hoge
     tags: dns
 
   - name: setup resolver
     template: backup=yes dest=/etc/resolv.dnsmasq.conf src=/opt/ansible/template/resolv.dnsmasq.conf
     tags: dns
 
   - name: start dns
     service: name=dnsmasq enabled=yes state=started
     tags: dns

 

dnsmasqを使う方法はよく紹介されているが、

それをansibleと組み合わせるのが意外にハマった。

 

ハマったポイントは、

ansibleの中で、dnsのリスト部分がエラーになるというもの。

そんなわけで、一旦変数に落とし込み、解釈させるという方法をとった。

ansibleは結構バグがある。。

 

投稿日時:2016年04月04日 18:03   カテゴリー:ansible  

mavenのレポジトリとしては、

githubが使える。

ただし、githubだと、最新バージョンしか管理できないため、

ちょっと使いづらい。

 

maven公式にアップできないものもあるだろうから、

そんなときは、archivaを使うと良い。

https://archiva.apache.org/index.cgi

 

archivaをセットアップしたので、作業履歴を残しておく。

1.ダウンロード

$ wget http://ftp.riken.jp/net/apache/archiva/2.2.0/binaries/apache-archiva-2.2.0-bin.tar.gz
$ unzip apache-archiva-2.2.0apache-archiva-2.2.0-bin.zip

 

2.設定修正

$ vim apache-archiva-2.2.0/conf/jetty.xml
<Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>

<Put name="mail.user">{your gmail uer}</Put>
<Put name="mail.password">{your gmail password}</Put>
<Put name="mail.transport.protocol">smtp</Put>
<Put name="mail.smtp.host">smtp.gmail.com</Put>
<Put name="mail.smtp.port">587</Put>
<Put name="mail.smtp.auth">true</Put>
<Put name="mail.smtp.starttls.enable">true</Put>
<Put name="mail.debug">false</Put>
$ vim apache-archiva-2.2.0/conf/archiva.xml
<application>
<url>http://{your domain}/url>
<timestamp>EEE d MMM yyyy HH:mm:ss Z</timestamp>
</application>

 

3.nginx設定

# vim /etc/nginx/conf.d/archiva.conf 
server {
    listen                  80;
    server_name             {your domain};

    location / {
        include                 /etc/nginx/proxy_params;
        client_body_buffer_size 128k;
        proxy_pass http://127.0.0.1:8080;
    }
}

 

4.クライアント設定

$ vim ~/.m2/settings.xml
<settings>
  <servers>
    <server>
      <id>archiva.internal</id>
      <username>{your username for your archiva}</username>
      <password>{your password for your archiva}</password>
    </server>
    <server>
      <id>archiva.snapshots</id>
      <username>{your username for your archiva}</username>
      <password>{your password for your arvhiva}</password>
    </server>
  </servers>
</settings>

5.pom.xmlに追記

  <!-- distributionManagement -->
  <distributionManagement>
    <repository>
      <id>archiva.internal</id>
      <name>Internal Release Repository</name>
      <url>http://{your domain}/repository/internal/</url>
    </repository>
    <snapshotRepository>
      <id>archiva.snapshots</id>
      <name>Internal Snapshot Repository</name>
      <url>http://{your domain}/repository/snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

 

以上を設定したい状態で、

$ mvn clean deploy

にて、デプロイが可能となる。

結構いいです。

 

ただ、認証情報のリセットが一定期間で要求されるので、
若干そこがめんどくさいかな。

投稿日時:2016年04月04日 17:39   カテゴリー:java  

ansibleでcentos7のdockerコンテナをプロビジョンしているのだが、

日本語化するのがなかなか大変だったので、手順を記載しておく。

 

以下はプレイブック。

---
- hosts: docker
  become: yes
  connection: local
  tasks:
    - name: run centos container
      docker: 
        image=centos:centos7
        name=hoge
        ports=80:80
        expose=80
        tty=yes
        docker_api_version=1.20
        hostname=hoge-docker
        privileged=yes
        command=/sbin/init
        env='LANG=ja_JP.UTF-8'
      tags: docker

- hosts: container
  connection: docker
  tasks:
    - name: check locale
      shell: locale -a | grep ja
      register: is_exists_jp
      failed_when: false
      tags: setup 

   - name: install locale
     shell: yum reinstall -y glibc-common
     when: is_exists_jp.stdout == ''
     tags: setup

 

以下は、hosts。

[docker]
localhost
 
[container]
docker

 

これで、

$ ansible-playbook -i hosts playbook.yml

とすると、日本語化されたcentos7のdockerコンテナが利用できます。

 

ポイントは、

  • コンテナ作成時のenvの指定
  • コンテナ内でのglibc-commonのreinstall

となります。

shellでyum叩いてるから、ワーニングでるけど、しょうがないかな。

 

投稿日時:2016年03月24日 09:40   カテゴリー:ansible  

最近ansibleを始めた。

動機としては、

  • redhatが買収した
  • chefはめんどい
  • 2.0からdockerプラグインが追加された

といったところ。

 

dockerは積極的ではないが、

構成管理ツールの必要性は認識してたから、ちょうどよいかなと。

 

ただ、ある条件の元で、冪等性が確保できないケースがあった。

以下である。

- name: configure httpd before
  lineinfile: dest=/etc/httpd/conf/httpd.conf state=present insertbefore={{item.insertbefore}} line={{item.line}} backup=yes
  with_items:
    - insertbefore: '^IncludeOptional conf\.d/\*\.conf'
  line: "<VirtualHost *:80>\n</VirtualHost>"
  tags: httpd

これは、httpdにおいて、
デフォルトVHを設定している際に、
VirtualHostディレクティブに改行を挟んでいるのだが、
これが原因で、二度目の実行の際、さらに追加されるというものであった。

ソース確認してないからわからないが、
改行を入れると、冪等性が確保されないのかもしれない。

以上

投稿日時:2016年03月16日 16:10   カテゴリー:ansible  

ローカル環境にS3環境を構築できる「S3 ninja」なるものを入れてみたので、

備忘録を残しておく。

 

  • ダウンロード

http://s3ninja.net/

上記からzipファイルを落として解凍すればよい。

 

  • 初期設定

解凍した直下に、「instance.conf.sdsignore」というファイルがあるので、

これを「instance.conf」とする。

また、dataフォルダがあるので、

その下に「s3」フォルダを作成する。

 

  • 起動

以下を実行すれば、「http://localhost:9444」でアクセス可能となる。

$ ./sirius.sh start

 

phpとjavaからアップしたが、本物とは違ったので、

コードを記載しておく。

なお、前提として、「http://localhost:9444」にアクセスして、

事前に「test」というバケットを作り、「public」にしておくものとする。

 

phpコード

<?php
require_once("aws.phar");
$bucketName = "s3";
$accessKey = "AKIAIOSFODNN7EXAMPLE";
$secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
$keyName = "test/php/000.text";

$s3 = new Aws\S3\S3Client(array(
    'credentials' => array(
        'key'    => $accessKey,
        'secret' => $secretKey,
    ),
    'version' => "2006-03-01",
    'region' => "us-east-1",
    'endpoint' => "http://localhost:9444/",
));

$r = $s3->putObject(array(
   'Bucket' => $bucketName,
   'Key' => $keyName,
   'Body' => fopen("test.txt", "r"),
   'ACL' => 'public-read',
   'CacheControl' => 'no-store, no-cache',
));
var_dump($r);

 

javaコード

package sample.ninja_test;

import java.io.File;

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.S3ClientOptions;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;

public class App
{
  private static final String keyName = "java/000.text";
  private static final String bucketName = "test";
  private static final String accessKey = "AKIAIOSFODNN7EXAMPLE";
  private static final String secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";

  public static void main(String[] args) {
    AmazonS3Client client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
    client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
    client.setEndpoint("http://localhost:9444/s3");

    PutObjectRequest putObj = new PutObjectRequest(bucketName, keyName, new File("test.txt"));
    putObj.setCannedAcl(CannedAccessControlList.PublicRead);
    client.putObject(putObj);

    String url = client.getResourceUrl(bucketName, keyName);
    System.out.println(url);
  }
}

期待した設定としては、javaのコードが正しい。
phpのコードはちょっと設定がおかしい。

とはいえ、この辺は、プログラムの設定等で吸収できるので、
簡易的なテストツールとしてはいいかもしれません。

投稿日時:2016年02月22日 16:58   カテゴリー:aws, java, php  

glibcにバッファオーバフローの脆弱性があったようなので、

アップデートすることにした。

 

centos7では、以下のバージョンがパッチ適用済みらしい。

2.17-106.el7_2.4

 

そして、updateが完了したら、

再起動する必要があります。

 

[参考]

https://jvn.jp/vu/JVNVU97236594/

 

以上

投稿日時:2016年02月19日 16:05   カテゴリー:server  

最近、おれおれライブラリの更新が進んでないわ。。

  • greensofa
  • bluechar / bluetable
  • redchest

進めたいわ。。

 

投稿日時:2016年02月10日 11:55   カテゴリー:other  

remiレポジトリにおいて、

php7対応のモジュールが結構出揃いましたね。

現時点で、以下が引っかかった。

 

$ yum search php70 --enablerepo=remi | grep -F "php70" | awk '{print $1;}'
php70-php-pecl-propro-devel.x86_64
php70-php-pecl-raphf-devel.x86_64
php70-php-pecl-xmldiff-devel.x86_64
php70-php-pecl-yaconf-devel.x86_64
php70-php-yaconf-devel.x86_64
php70-runtime.x86_64
php70-scldevel.x86_64
php70.x86_64
php70-build.x86_64
php70-php.x86_64
php70-php-ast.x86_64
php70-php-bcmath.x86_64
php70-php-cli.x86_64
php70-php-common.x86_64
php70-php-dba.x86_64
php70-php-dbg.x86_64
php70-php-devel.x86_64
php70-php-embedded.x86_64
php70-php-enchant.x86_64
php70-php-fpm.x86_64
php70-php-gd.x86_64
php70-php-gmp.x86_64
php70-php-horde-horde-lz4.x86_64
php70-php-imap.x86_64
php70-php-interbase.x86_64
php70-php-intl.x86_64
php70-php-json.x86_64
php70-php-ldap.x86_64
php70-php-litespeed.x86_64
php70-php-mbstring.x86_64
php70-php-mcrypt.x86_64
php70-php-mysqlnd.x86_64
php70-php-oci8.x86_64
php70-php-odbc.x86_64
php70-php-opcache.x86_64
php70-php-pdo.x86_64
php70-php-pdo-dblib.x86_64
php70-php-pear.noarch
php70-php-pecl-amqp.x86_64
php70-php-pecl-apcu.x86_64
php70-php-pecl-apcu-bc.x86_64
php70-php-pecl-apcu-devel.x86_64
php70-php-pecl-apfd.x86_64
php70-php-pecl-apm.x86_64
php70-php-pecl-crypto.x86_64
php70-php-pecl-eio.x86_64
php70-php-pecl-env.x86_64
php70-php-pecl-ev.x86_64
php70-php-pecl-gender.x86_64
php70-php-pecl-geoip.x86_64
php70-php-pecl-geospatial.x86_64
php70-php-pecl-gmagick.x86_64
php70-php-pecl-hdr-histogram.x86_64
php70-php-pecl-hprose.x86_64
php70-php-pecl-hrtime.x86_64
php70-php-pecl-http.x86_64
php70-php-pecl-http-devel.x86_64
php70-php-pecl-imagick.x86_64
php70-php-pecl-imagick-devel.x86_64
php70-php-pecl-json-post.x86_64
php70-php-pecl-libsodium.x86_64
php70-php-pecl-lzf.x86_64
php70-php-pecl-mailparse.x86_64
php70-php-pecl-memcache.x86_64
php70-php-pecl-memcached.x86_64
php70-php-pecl-mogilefs.x86_64
php70-php-pecl-mongodb.x86_64
php70-php-pecl-msgpack.x86_64
php70-php-pecl-msgpack-devel.x86_64
php70-php-pecl-mysql.x86_64
php70-php-pecl-oauth.x86_64
php70-php-pecl-pcs.x86_64
php70-php-pecl-pcs-devel.x86_64
php70-php-pecl-pq.x86_64
php70-php-pecl-propro.x86_64
php70-php-pecl-raphf.x86_64
php70-php-pecl-redis.x86_64
php70-php-pecl-rrd.x86_64
php70-php-pecl-seaslog.x86_64
php70-php-pecl-selinux.x86_64
php70-php-pecl-ssdeep.x86_64
php70-php-pecl-stats.x86_64
php70-php-pecl-swoole.x86_64
php70-php-pecl-taint.x86_64
php70-php-pecl-termbox.x86_64
php70-php-pecl-trader.x86_64
php70-php-pecl-translit.x86_64
php70-php-pecl-uploadprogress.x86_64
php70-php-pecl-uuid.x86_64
php70-php-pecl-varnish.x86_64
php70-php-pecl-weakref.x86_64
php70-php-pecl-xattr.x86_64
php70-php-pecl-xdebug.x86_64
php70-php-pecl-xmldiff.x86_64
php70-php-pecl-xxtea.x86_64
php70-php-pecl-yac.x86_64
php70-php-pecl-yaconf.x86_64
php70-php-pecl-yaf.x86_64
php70-php-pecl-yaml.x86_64
php70-php-pecl-yar.x86_64
php70-php-pecl-zip.x86_64
php70-php-pgsql.x86_64
php70-php-process.x86_64
php70-php-pspell.x86_64
php70-php-recode.x86_64
php70-php-smbclient.x86_64
php70-php-snmp.x86_64
php70-php-soap.x86_64
php70-php-tidy.x86_64
php70-php-xml.x86_64
php70-php-xmlrpc.x86_64
php70-php-yaconf.x86_64

 

centos7のbaseに入ってくるのは数年後だろうけど。。

remiを使えるのであれば、これだけあれば結構いける気がする。

 

投稿日時:2016年02月10日 09:26   カテゴリー:php  

jettyでtomcatJDBC poolを使っていたら、

以下のようなエラーに遭遇した。

java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype

というわけで、
pomを修正して、tomcat jdbc poolが使っているロガーの依存関係を排除した。

<dependency>
  <groupId>org.apache.tomcat</groupId>
  <artifactId>tomcat-jdbc</artifactId>
  <version>8.0.28</version>
  <exclusions>
    <exclusion>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-juli</artifactId>
    </exclusion>
  </exclusions>
</dependency>

意外とわからなかった。。

投稿日時:2016年01月21日 13:56   カテゴリー:java  

javaでsynchronizedブロックにて、

Stringを使うと、

異なるオブジェクトであっても、

文字列が同じであれば排他制御がかかる。

 

ただし、異なるオブジェクト・同一文字列で排他制御をかけるべきでない。

なぜなら、依存ライブラリ等でもしsyncrozinedブロックを使っていたら、

最悪デッドロック等もありえる。

(そんなライブラリはないと思うが。。)

 

これはStringの特性によるものなのだが、

いつか詳細を記載したいとは思う。

 

投稿日時:2016年01月07日 19:20   カテゴリー:java