最近 GA になった Photon OS 2.0 に、ansible をインストールしてみました。
GA のときの投稿はこちらをどうぞ・・・
VMware Photon OS 2.0 が GA になりました。
今回はダウンロードサイトにある OVA with virtual hardware v13 (ESX 6.5 and above) を利用しています。
Ansible 実行サーバへの ansible インストール。
まず、root / changeme でログイン&パスワード変更をして、
わかりやすくホスト名(今回は ph20-ansible)を変更しておきます。
You are required to change your password immediately (administrator enforced)
Last login: Fri Nov 3 01:04:03 2017 from 192.168.1.XXX
Changing password for root.
Current password: ★デフォルトはchangeme
New password: ★変更するパスワードを入力。
Retype new password:
01:04:23 up 35 min, 0 users, load average: 0.00, 0.00, 0.00
tdnf update info not available yet!
root@photon-machine [ ~ ]#
root@photon-machine [ ~ ]# cat /etc/photon-release
VMware Photon OS 2.0
PHOTON_BUILD_NUMBER=304b817
root@photon-machine [ ~ ]#
root@photon-machine [ ~ ]# hostnamectl set-hostname ph20-ansible
root@photon-machine [ ~ ]# su -
root@ph20-ansible [ ~ ]#
Photon OS のリポジトリに、ansible が用意されています。
root@ph20-ansible [ ~ ]# tdnf list ansible
ansible.noarch 2.4.0.0-1.ph2 photon
インストールしてみると、依存関係により python2 もインストールされます。
ちなみに、デフォルトだと Python 3 だけがインストールされています。
root@ph20-ansible [ ~ ]# tdnf install -y ansible
Installing:
python2-libs x86_64 2.7.13-10.ph2 photon 15.49M 16239329
python2 x86_64 2.7.13-10.ph2 photon 1.85M 1936323
ansible noarch 2.4.0.0-1.ph2 photon 54.13M 56762546
Total installed size: 71.47M 74938198
Downloading:
ansible 9680670 100%
python2 779030 100%
python2-libs 5952811 100%
Testing transaction
Running transaction
Installing/Updating: python2-libs-2.7.13-10.ph2.x86_64
Installing/Updating: python2-2.7.13-10.ph2.x86_64
Installing/Updating: ansible-2.4.0.0-1.ph2.noarch
Complete!
root@ph20-ansible [ ~ ]#
しかし、これだけでは Ansible 関連のコマンドを実行できませんでした。
root@ph20-ansible [ ~ ]# ansible --version
Traceback (most recent call last):
File "/bin/ansible", line 40, in <module>
import ansible.constants as C
File "/usr/lib/python2.7/site-packages/ansible/constants.py", line 15, in <module>
from ansible.config.manager import ConfigManager, ensure_type
File "/usr/lib/python2.7/site-packages/ansible/config/manager.py", line 11, in <module>
import yaml
ImportError: No module named yaml
root@ph20-ansible [ ~ ]#
Photon OS 2.0 の RPM の依存関係が十分でないためか、さらに RPM の追加が必要です。
すくなくとも YAML、jinja2 が不足しているようなので追加インストールします。
Python3 ではなく Python2 で利用するため、PyYAML と python-jinja2 をインストールします。
root@ph20-ansible [ ~ ]# tdnf install -y PyYAML python-jinja2
Installing:
python-markupsafe x86_64 1.0-3.ph2 photon 61.48k 62953
python-jinja2 noarch 2.9.5-6.ph2 photon 1.95M 2044146
PyYAML x86_64 3.12-2.ph2 photon 622.06k 636988
Total installed size: 2.62M 2744087
Downloading:
PyYAML 198440 100%
python-jinja2 697669 100%
python-markupsafe 29704 100%
Testing transaction
Running transaction
Installing/Updating: python-markupsafe-1.0-3.ph2.x86_64
Installing/Updating: python-jinja2-2.9.5-6.ph2.noarch
Installing/Updating: PyYAML-3.12-2.ph2.x86_64
Complete!
root@ph20-ansible [ ~ ]#
これで ansible コマンドは実行できるようになりました。
root@ph20-ansible [ ~ ]# ansible --version
ansible 2.4.0.0
config file = None
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /bin/ansible
python version = 2.7.13 (default, Oct 26 2017, 01:54:36) [GCC 6.3.0]
root@ph20-ansible [ ~ ]#
ということで、ansible をインストールする場合は、すくなくとも下記のパッケージが必要そうです。
# tdnf install -y ansible PyYAML python-jinja2
Ansible を別の Photon OS に実行してみる。
それでは、別の Photon OS に Ansible でコマンド実行してみます。
まず、SSH の鍵ファイルを作成しておきます。
root@ph20-ansible [ ~ ]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
~
Ansible でコマンド実行する Photon(今回は 192.168.12.205)に公開鍵をコピーしておきます。
今回は、初回の root パスワード変更も一緒に実施しています。
root@ph20-ansible [ ~ ]# ssh-copy-id root@192.168.12.205
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.12.205 (192.168.12.205)' can't be established.
ECDSA key fingerprint is SHA256:gnXBYqCxVbxQ6VlSExsLIi+tFkAB6YlIU6KxYqrKtoY.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Password: ★changeme
You are required to change your password immediately (administrator enforced)
Changing password for root.
Current password: ★changeme
New password: ★新パスワードを入力。
Retype new password: ★新パスワードを再入力。
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.12.205'"
and check to make sure that only the key(s) you wanted were added.
root@ph20-ansible [ ~ ]#
Ansible のインベントリファイルを作成しておきます。
今回は、下記の内容だけ記載しています。
[targets]
192.168.12.205
下記のように作成しました。
root@ph20-ansible [ ~ ]# cat << EOF > hosts
> [targets]
> 192.168.12.205
> EOF
root@ph20-ansible [ ~ ]# cat ./hosts
[targets]
192.168.12.205
接続確認してみると、相手の Photon にパスの通った python がなくて失敗しました。
root@ph20-ansible [ ~ ]# ansible -i ./hosts -m ping 192.168.12.205
192.168.12.205 | FAILED! => {
"changed": false,
"failed": true,
"module_stderr": "Shared connection to 192.168.12.205 closed.\r\n",
"module_stdout": "/bin/sh: /usr/bin/python: No such file or directory\r\n",
"msg": "MODULE FAILURE",
"rc": 0
}
たしかに、相手の Photon(192.168.12.205)にはまだ python2 をインストールしておらず
デフォルトでは python 3 しかないので・・・
root@photon-machine [ ~ ]# ip a | grep 192
inet 192.168.12.205/24 brd 192.168.12.255 scope global dynamic eth0
root@photon-machine [ ~ ]# rpm -qa | grep python
python3-libs-3.6.1-9.ph2.x86_64
python3-six-1.10.0-8.ph2.noarch
python3-jinja2-2.9.5-6.ph2.noarch
python3-prettytable-0.7.2-6.ph2.noarch
python3-jsonpatch-1.15-4.ph2.noarch
python3-requests-2.13.0-3.ph2.noarch
python3-PyYAML-3.12-2.ph2.x86_64
python3-3.6.1-9.ph2.x86_64
python3-markupsafe-1.0-3.ph2.x86_64
python3-configobj-5.0.6-4.ph2.noarch
python3-xml-3.6.1-9.ph2.x86_64
python3-jsonpointer-1.10-6.ph2.noarch
python3-oauthlib-2.0.2-3.ph2.noarch
python3-setuptools-3.6.1-9.ph2.noarch
root@photon-machine [ ~ ]#
root@photon-machine [ ~ ]# python
-bash: python: command not found
root@photon-machine [ ~ ]# python3 -V
Python 3.6.1
実行先に python2 をインストールしてしまいます。
実は Photon OS 2.0 では、yum コマンドが tdnf の RPM に含まれていて
デフォルトで yum コマンドも実行できるようになっています。
root@photon-machine [ ~ ]# which yum
/usr/bin/yum
root@photon-machine [ ~ ]# rpm -qf /usr/bin/yum
tdnf-1.2.2-2.ph2.x86_64
ということで、yum で python2 をインストールしておきます。
root@photon-machine [ ~ ]# yum install -y python2
Refreshing metadata for: 'VMware Photon Linux 2.0(x86_64)'
Refreshing metadata for: 'VMware Photon Linux 2.0(x86_64) Updates'
Refreshing metadata for: 'VMware Photon Extras 2.0(x86_64)'
photon-extras 106 100%
Installing:
python2-libs x86_64 2.7.13-10.ph2 photon 15.49M 16239329
python2 x86_64 2.7.13-10.ph2 photon 1.85M 1936323
Total installed size: 17.33M 18175652
Downloading:
python2 779030 100%
python2-libs 5952811 100%
Testing transaction
Running transaction
Installing/Updating: python2-libs-2.7.13-10.ph2.x86_64
Installing/Updating: python2-2.7.13-10.ph2.x86_64
Complete!
root@photon-machine [ ~ ]#
root@photon-machine [ ~ ]# which python
/usr/bin/python
これで Ansible で接続テストがとおりるようになります。
root@ph20-ansible [ ~ ]# ansible -i ./hosts -m ping 192.168.12.205
192.168.12.205 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
ためしに、下記のような Ansible Playbook を実行してみました。
※最初にお伝えしておくと、これは yum が微妙なことになります。
root@ph20-ansible [ ~ ]# cat docker-host.yml
---
- name: setup Docker host.
hosts: targets
remote_user: root
tasks:
- name: install Docker package.
yum:
name: docker
state: latest
- name: start docker service.
service:
name: docker
state: started
enabled: yes
しかし Ansible で yum モジュールを利用しようとすると、
Python2 むけの「yum」モジュール不足になりました。
root@ph20-ansible [ ~ ]# ansible-playbook -i hosts docker-host.yml
PLAY [setup Docker host.] ******************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.12.205]
TASK [install Docker package.] *************************************************
fatal: [192.168.12.205]: FAILED! => {"changed": false, "failed": true, "msg": "python2 bindings for rpm are needed for this module. python2 yum module is needed for this module"}
to retry, use: --limit @/root/docker-host.retry
PLAY RECAP *********************************************************************
192.168.12.205 : ok=1 changed=0 unreachable=0 failed=1
root@ph20-ansible [ ~ ]#
ちなみに Photon 2.0 では yum と tdnf の RPM が競合しています。
tdnf が保護されているので、yum の RPM のインストールは難しそうです。
root@photon-machine [ ~ ]# tdnf install -y yum
Error(1030) : The operation would result in removing the protected package : tdnf
かわりに command モジュールなどで yum コマンドを実行する感じになってしまうかもしれません。
毎回 changed になってしまう雑な感じですが・・・
root@ph20-ansible [ ~ ]# cat docker-host.yml
---
- name: setup Docker host.
hosts: targets
remote_user: root
tasks:
- name: docker RPM install.
command: bash -c "rpm -q {{ item }} || tdnf install -y {{ item }}"
with_items:
- docker
- name: start docker service.
service:
name: docker
state: started
enabled: yes
root@ph20-ansible [ ~ ]# ansible-playbook -i hosts docker-host.yml
PLAY [setup Docker host.] ******************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.12.205]
TASK [docker RPM install.] *****************************************************
changed: [192.168.12.205] => (item=docker)
TASK [start docker service.] ***************************************************
ok: [192.168.12.205]
PLAY RECAP *********************************************************************
192.168.12.205 : ok=3 changed=1 unreachable=0 failed=0
root@ph20-ansible [ ~ ]#
簡単にここまで気づいた Photon OS 2.0 + ansible をまとめると・・・
- Ansible 実行サーバには、ansible だけでなく PyYAML python-jinja2 など、他にも RPM が必要。
python2 は、ansible の依存関係でインストールされる。 - Ansible のターゲットになるサーバには、少なくとも python2 がいるので、
VM のテンプレートなどに入れておいた方がよさそう。 - デフォルトで yum コマンドは利用できるが、ansible からは利用が困難そうで、
rpm インストールには工夫が必要そう。
何となく Photon OS 2.0 でのパッケージ管理については ansible より
PMD / pmd-cli や cloud-init を利用したほうがよいのかもしれないとも思えました。
以上、Photon OS 2.0 で ansible を利用してみる話でした。