ここに記載の手順を実行することで 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 件のコメント:
コメントを投稿