2017年3月27日月曜日

[ansible] MSYS2 で ansible を使えるようにする手順

MSYS2 を利用して Windows で ansible を実行するための環境を作成します。
ここに記載の手順を実行することで MSYS2 で ansible 2.2.1.0 が使えるようになります。

MSYS2 のインストール

http://www.msys2.org/ より、インストールファイルをダウンロードします。

  32bit 環境の場合:msys2-i686-20161025.exe
  64bit 環境の場合:msys2-x86_64-20161025.exe

ダウンロードしたファイルを実行し、画面に表示されるメッセージに従って、インストールを行います。

 インストール先フォルダ:C:\msys32
 スタートメニュー:MSYS2 32bit

コアシステムの更新

インターネットに接続するために proxy が必要な場合は、C:\msys32\etc\profile.d に http_proxy.sh を作成し、
その中に proxy を設定します。

 export http_proxy=http://{user}:{password}@{proxy_server}:{port}/
 export export https_proxy=http://{user}:{password}@{proxy_server}:{port}/
 export export HTTP_PROXY=http://{user}:{password}@{proxy_server}:{port}/
 export export HTTPS_PROXY=http://{user}:{password}@{proxy_server}:{port}/

シェルを起動します。
 [スタート]-[すべてのプログラム]-[MSYS2 32bit]-[MSYS2 MSYS]

パッケージを更新します。更新が完了し「警告: for example close your terminal window instead of calling exit」が
表示されたら、×でシェルを閉じます。
$ pacman -Syu

  ※リポジトリに含まれているパッケージの一覧を表示:pacman -Sl
  ※パッケージ情報を表示:pacman -Sii パッケージ名

システム全体の更新

シェルを起動します。
 [スタート]-[すべてのプログラム]-[MSYS2 32bit]-[MSYS2 MSYS]

パッケージを更新します。
$ pacman -Su

必要パッケージのインストール

ansible の実行に必要なパッケージをインストールします。
$ pacman -S python2
$ pacman -S vim
$ pacman -S openssh
$ pacman -S openssl-devel
$ pacman -S sshpass
$ pacman -S gcc
$ pacman -S libffi-devel

ansible のインストール

python のパッケージ管理システムをインストールします。
$ curl -kL https://bootstrap.pypa.io/get-pip.py | python2

ansible インストール時のエラーを回避するためヘッダーファイルを修正します。
$ cd /usr/include/python2.7
$ cp -p pyconfig.h pyconfig.h_YYYYMMDD
# sed -e "s/__BSD_VISIBLE 1/__BSD_VISIBLE 0/g"  pyconfig.h_YYYYMMDD > pyconfig.h

ansible をインストールします。
$ CFLAGS=-I/usr/lib/libffi-3.2.1/include pip install ansible

ansible のインストール確認

インストールされた python のパッケージを確認します。
$ pip list

ansible (2.2.1.0)
appdirs (1.4.3)
asn1crypto (0.21.1)
cffi (1.9.1)
cryptography (1.8.1)
enum34 (1.1.6)
idna (2.5)
ipaddress (1.0.18)
Jinja2 (2.8.1)
MarkupSafe (1.0)
packaging (16.8)
paramiko (2.1.2)
pip (9.0.1)
pyasn1 (0.2.3)
pycparser (2.17)
pycrypto (2.6.1)
pyparsing (2.2.0)
PyYAML (3.12)
setuptools (34.3.2)
six (1.10.0)
wheel (0.29.0)

ansible のバージョンを確認します。
$ ansible --version
ansible 2.2.1.0
  config file =
  configured module search path = Default w/o overrides

ローカルホストに対してコマンドが実行できることを確認します。
$ ansible localhost -a "/bin/echo hello. world!"
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available

localhost | SUCCESS | rc=0 >>
hello. world!

リモートホストを ansible で操作するための準備
(秘密鍵を利用する場合)

シェルを起動します。
 [スタート]-[すべてのプログラム]-[MSYS2 32bit]-[MSYS2 MinGW 32-bit]

SOCKS5 経由でインターネット上にあるサーバに接続する場合は connect パッケージをインストールします。
$ pacman -S mingw-w64-i686-connect

秘密鍵を ~/.ssh/config に格納します。

SSH の設定をします。ProxyCommand は SOCKS5 経由で接続する場合のみ必要になります。
$ vim ~/.ssh/config
Host 192.168.1.1
  IdentityFile ~/.ssh/id_rsa
  User username
  ProxyCommand /mingw32/bin/connect -S {proxy_server}:{port} %h %p

fingerprint を known_hosts に登録します。SOCKS5_USER と SOCKS5_PASSWD の設定は SOCKS5 経由で接続する場合のみ必要になります。
$ export SOCKS5_USER=username
$ export SOCKS5_PASSWD=password
$ ssh 192.168.1.1
The authenticity of host '192.168.1.1 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:kBpvduX5+6j06Zns4tT7VWJCV6XeUtdmRnJZOYLAU4g.
Are you sure you want to continue connecting (yes/no)? yes を入力
Warning: Permanently added '192.168.1.1' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/username/.ssh/id_rsa': passphrase を入力

ansible.cfg ファイルを作成します。
$ vim /etc/ansible/ansible.cfg
[defaults]
log_path=/var/log/ansible.log
module_lang=C
module_set_locale=true

[ssh_connection]
ssh_args=""

hosts ファイルを作成します。
$ vim /etc/ansible/hosts
[prototype]
192.168.1.1

リモートホストとの接続を確認します。
$ ansible prototype -a "/bin/echo hello. world!"
Enter passphrase for key '/home/username/.ssh/id_rsa':
 [WARNING]: sftp transfer mechanism failed on [192.168.1.1]. Use
ANSIBLE_DEBUG=1 to see detailed information

Enter passphrase for key '/home/username/.ssh/id_rsa': passphrase を入力
Enter passphrase for key '/home/username/.ssh/id_rsa': passphrase を入力
Enter passphrase for key '/home/username/.ssh/id_rsa': passphrase を入力
192.168.1.1 | SUCCESS | rc=0 >>
hello. world!

passphrase の入力を省略するためには ssh-agent を使用します。
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/username/.ssh/id_rsa: passphrase を入力
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)
$ ansible prototype -a "/bin/echo hello. world!"
192.168.1.1 | SUCCESS | rc=0 >>
hello. world!

リモートホストを ansible で操作するための準備
(秘密鍵を利用しない場合)

ansible.cfg ファイルを作成します。
$ vim /etc/ansible/ansible.cfg
[defaults]
log_path=/var/log/ansible.log
module_lang=C
module_set_locale=true

hosts ファイルを作成します。
$ vim /etc/ansible/hosts
[prototype]
192.168.1.1

[prototype:vars]
ansible_ssh_user=username
ansible_ssh_pass=password

リモートホストとの接続を確認します。
$ ansible prototype -a "/bin/echo hello. world!" -c paramiko
192.168.1.1 | SUCCESS | rc=0 >>
hello. world!

ansible-playbook を利用するための準備

playbookは以下の構成とします。
グループやホスト毎に動作を変えたい場合は、group_vars や host_vars に変数を定義します。

  ~/site.yml
      ~/cent7_build.yml
          ~/group_vars/prototype.yml
              ~/host_vars/192.168.1.1.yml
                  ~/roles/cent7_build/tasks/main.yml
                      ~/roles/cent7_build/tasks/show_env.yml
                      yml ファイルはタスク毎に作成し main.yml から include します。

ディレクトリ構成はベストプラクティスに倣います。
  参考:http://docs.ansible.com/ansible/playbooks_best_practices.html

Directory Layout
The top level of the directory would contain files and directories like so:

production                # inventory file for production servers
staging                   # inventory file for staging environment
group_vars/
   group1                 # here we assign variables to particular groups
   group2                 # ""
host_vars/
   hostname1              # if systems need specific variables, put them here
   hostname2              # ""
library/                  # if any custom modules, put them here (optional)
filter_plugins/           # if any custom filter plugins, put them here (optional)
site.yml                  # master playbook
webservers.yml            # playbook for webserver tier
dbservers.yml             # playbook for dbserver tier
roles/
    common/               # this hierarchy represents a "role"
        tasks/            #
            main.yml      #  <-- tasks file can include smaller files if warranted
        handlers/         #
            main.yml      #  <-- handlers file
        templates/        #  <-- files for use with the template resource
            ntp.conf.j2   #  <------- templates end in .j2
        files/            #
            bar.txt       #  <-- files for use with the copy resource
            foo.sh        #  <-- script files for use with the script resource
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role
        meta/             #
            main.yml      #  <-- role dependencies
        library/          # roles can also include custom modules
        lookup_plugins/   # or other types of plugins, like lookup in this case
    webtier/              # same kind of structure as "common" was above, done for the webtier role
    monitoring/           # ""
    fooapp/               # ""


site.yml を作成します。
$ vim ~/site.yml
- include: cent7_build.yml

cent7_build.yml を作成します。
$ vim ~/cent7_build.yml
- hosts: prototype
  vars: ROLE_NAME: 'cent7_build'
  roles:
    - {role: '{{ ROLE_NAME }}'}

prototype.yml を作成します。グループで共通の設定を行います。
$ vim ~/group_vars/prototype.yml

192.168.1.1.yml を作成します。サーバ毎に異なる値を変数で定義します。
$ vim ~/host_vars/192.168.1.1.yml
ansible_become: true
ansible_become_method: su
ansible_become_user: root
ansible_become_pass: password
HOST_NAME: CENT7001
OS_GROUP:
- name: testgroup1
  id: 2000
- name: testgroup2
  id: 2001
OS_USER:
- name: testuser1
  id: 2000
  pass: testpass1
  login: "/bin/bash"
  home: "/home/testuser1"
  group: testgroup1
- name: testuser2
  id: 2001
  pass: testpass2
  login: "/bin/bash"
  home: "/home/testuser2"
  group: testgroup2

main.yml を作成します。タスクが複数ある場合は全て include します。
$ vim ~/roles/cent7_build/tasks/main.yml
- include: show_env.yml

show_env.yml を作成します。
$ vim ~/roles/cent7_build/tasks/show_env.yml
- name: Show ROLE_NAME
  debug: msg="role name={{ ROLE_NAME }}"

- name: Show OS_USER
  debug: msg="user name={{ item.name }}"
  with_items:
          - '{{ OS_USER }}'

ansible-playbook の実行

ansible-playbook を実行します。(秘密鍵を利用する場合)
$ ansible-playbook -l prototype site.yml

ansible-playbook を実行します。(秘密鍵を利用しない場合)
$ ansible-playbook -l prototype site.yml -c paramiko

※詳細な結果を表示させたい場合は ansible-playbook 実行時に -v または -vvv オプションを付けます。
※ANSIBLE_KEEP_REMOTE_FILES=1 を実行時に指定すると、リモートホストで作成される一時ファイルが削除されなくなり、
  エラーが発生した場合に調査可能となる。

実行結果
PLAY [prototype] ***************************************************************

TASK [setup] *******************************************************************
ok: [192.168.1.1]

TASK [cent7_build : Show ROLE_NAME] ********************************************
ok: [192.168.1.1] => {
    "msg": "role name=cent7_build"
}

TASK [cent7_build : Show OS_USER] **********************************************
ok: [192.168.1.1] => (item={u'group': u'testgroup1', u'name': u'testuser1', u'pass': u'testpass1', u'home': u'/home/testuser1', u'login': u'/bin/bash', u'id': 2000}) => {
    "item": {
        "group": "testgroup1",
        "home": "/home/testuser1",
        "id": 2000,
        "login": "/bin/bash",
        "name": "testuser1",
        "pass": "testpass1"
    },
    "msg": "user name=testuser1"
}
ok: [192.168.1.1] => (item={u'group': u'testgroup2', u'name': u'testuser2', u'pass': u'testpass2', u'home': u'/home/testuser2', u'login': u'/bin/bash', u'id': 2001}) => {
    "item": {
        "group": "testgroup2",
        "home": "/home/testuser2",
        "id": 2001,
        "login": "/bin/bash",
        "name": "testuser2",
        "pass": "testpass2"
    },
    "msg": "user name=testuser2"
}

PLAY RECAP *********************************************************************
192.168.1.1                : ok=3    changed=0    unreachable=0    failed=0

0 件のコメント:

コメントを投稿