RHEL8 beta で Python3 を入れて Ansible から操作できるようにする

まずは subscribe しておきます。

# LANG=C subscription-manager register
Registering to: subscription.rhsm.redhat.com:443/subscription
Username: xxxx
Password: xxxx
The system has been registered with ID: xxxxxxxx-xxxx-xxxx-xxxx-6ff3ae55e951
The registered system name is: rhel8a

# LANG=C subscription-manager attach
Installed Product Current Status:
Product Name: Red Hat Enterprise Linux for x86_64 Beta
Status:       Subscribed

Python3 を入れます。RHEL8 beta では最初から Python がインストールされていないので、Ansible からいじることができません。

(追記) platform-python を使うのが筋のようです。

# yum install python3

無事入りました。

# python3 --version
Python 3.6.6

/usr/libexec/platform-python を参照させるのがいいみたいです。一応確認してみます。

# /usr/libexec/platform-python --version
Python 3.6.6

Python が入ったということで、実際に Ansible Tower から接続してみます。まずはインベントリを定義。ansible_python_interpreter は ansible 2.8 からは自動で検出してくれるそうです。

認証情報を設定して、ad hoc コマンドの ping モジュールで繋いでみます。

これで無事繋がることがわかりました。よしよし。

ESXi 上の RHEL7 をいじる

ESXi 6.7 を立てまして、RHEL 7.6 を5台インストールしました。これを Ansible からいじってみます。

まずはインベントリの取得から。

https://github.com/ansible/ansible/blob/devel/contrib/inventory/vmware_inventory.py

を使ってみました。vmware_inventory.py と vmware_inventory.ini を取得してきます。

vmware_inventory.ini を編集して設定します。このように作ってみました。

[sugimura@iMac esxi]$ grep -v "^#" vmware_inventory.ini | grep -v "^$"
[vmware]
server=192.168.0.3
username=root
password=xxxx
validate_certs = False
cache_max_age = 0
max_object_level=5
skip_keys = declaredalarmstate,disabledmethod,dynamicproperty,dynamictype,environmentbrowser,managedby,parent,childtype,resourceconfig,resourcepool,permission,storage,configissue,parentvapp,recenttask,availablefield,datastore,summary,overallstatus,triggeredalarmstate,network,capability,guestheartbeatstatus,layout,effectiverole,rootsnapshot,configstatus,value,snapshot,layoutex
alias_pattern={{ config.name }}
host_pattern={{ guest.ipaddress }}
groupby_patterns={{ guest.guestid }},{{ 'templates' if config.template else 'guests'}}
[properties]
prop01=name
prop02=config.name
prop03=guest.hostName
prop04=guest.ipAddress
prop05=guest.nic
prop06=guest.guestId

実行してみます。かなり大きな JSON が返ってきました。いまの ESXi には RHEL7 や RHEL8beta、Kali Linux が入っています。

[sugimura@iMac esxi]$ python vmware_inventory.py
{
  "None": {
    "hosts": [
      "Kali Linux", 
      "RHEL7.6", 
      "RHEL8beta"
    ]
  }, 
  "_meta": {
    "hostvars": {
      "Kali Linux": {
        "name": "Kali Linux", 
        "ansible_ssh_host": "None", 
...
      "RHEL7.6D", 
      "RHEL7.6E"
    ]
  }, 
  "rhel8_64Guest": {
    "hosts": [
      "RHEL8betaB", 
      "RHEL8betaE", 
      "RHEL8betaC", 
      "RHEL8betaD", 
      "RHEL8betaA"
    ]
  }
}

vmware-inventory コマンドを使って、ダイナミックインベントリとして読めることを確認します。–graph か –list を指定すると、インベントリとして読み取った結果を表示することができます。グループ分けもされていることがわかります。

[sugimura@iMac esxi]$ ansible-inventory -i vmware_inventory.py --graph
@all:
  |--@None:
  |  |--Kali Linux
  |  |--RHEL7.6
  |  |--RHEL8beta
  |--@guests:
  |  |--Kali Linux
  |  |--RHEL7.6
  |  |--RHEL7.6A
  |  |--RHEL7.6B
  |  |--RHEL7.6C
  |  |--RHEL7.6D
  |  |--RHEL7.6E
  |  |--RHEL8beta
  |  |--RHEL8betaA
  |  |--RHEL8betaB
  |  |--RHEL8betaC
  |  |--RHEL8betaD
  |  |--RHEL8betaE
  |--@rhel7_64Guest:
  |  |--RHEL7.6A
  |  |--RHEL7.6B
  |  |--RHEL7.6C
  |  |--RHEL7.6D
  |  |--RHEL7.6E
  |--@rhel8_64Guest:
  |  |--RHEL8betaA
  |  |--RHEL8betaB
  |  |--RHEL8betaC
  |  |--RHEL8betaD
  |  |--RHEL8betaE
  |--@ungrouped:

この RHEL7.6 のグループ5台に対して、subscribe して yum update してみる playbook を書いてみました。

---
- hosts: rhel7_64Guest
  become: true
  become_method: sudo

  tasks:
  - name: subscribe
    redhat_subscription:
      state: present
      username: xxxx
      password: xxxx
      auto_attach: true

  - name: yum update
    yum: name=* state=latest

実行してみます。

[sugimura@iMac esxi]$ ansible-playbook -i vmware_inventory.py yum_update.yml -k -K
SSH password: 
SUDO password[defaults to SSH password]: 

PLAY [rhel7_64Guest] ***************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************
ok: [RHEL7.6D]
ok: [RHEL7.6C]
ok: [RHEL7.6E]
ok: [RHEL7.6A]
ok: [RHEL7.6B]

TASK [subscribe] *******************************************************************************************************************************
changed: [RHEL7.6B]
changed: [RHEL7.6A]
changed: [RHEL7.6E]
changed: [RHEL7.6D]
changed: [RHEL7.6C]

TASK [yum update] ******************************************************************************************************************************
changed: [RHEL7.6C]
changed: [RHEL7.6A]
changed: [RHEL7.6B]
changed: [RHEL7.6D]
changed: [RHEL7.6E]

PLAY RECAP *************************************************************************************************************************************
RHEL7.6A                   : ok=3    changed=2    unreachable=0    failed=0   
RHEL7.6B                   : ok=3    changed=2    unreachable=0    failed=0   
RHEL7.6C                   : ok=3    changed=2    unreachable=0    failed=0   
RHEL7.6D                   : ok=3    changed=2    unreachable=0    failed=0   
RHEL7.6E                   : ok=3    changed=2    unreachable=0    failed=0  

無事処理できました。ログインして確認してみます。

[root@rhel7a sugimura]# yum history
読み込んだプラグイン:product-id, search-disabled-repos, subscription-manager
ID     | ログイン ユーザー        | 日時             | 操作           | 変更   
-------------------------------------------------------------------------------
     3 | sugimura <sugimura>      | 2019-04-28 09:33 | I, U           |   70   
     2 | sugimura <sugimura>      | 2019-04-28 09:32 | Install        |    3   
     1 | システム <未設定>        | 2019-04-27 19:49 | Install        |  352   
history list

[root@rhel7a sugimura]# subscription-manager list
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       7.6
アーキテクチャー: x86_64
状態:             サブスクライブ済み
状態の詳細:       
開始:             2018年09月19日
終了:             2019年09月19日

いい感じですね!

Ansible を始めてみる

ansible-galaxy を使うことで role の雛形が作られます。Rails で言うと Scaffold みたいなものです。

$ ansible-galaxy --offline init sample
- sample was created successfully

インベントリファイルを作ります。ファイル名は inventory にしました。

[target]
localhost

sample role を呼び出すための playbook を書きます。playbook.yml としました。

---
- hosts: all
  roles:
    - sample

sample にはまだタスクがありませんが、実行できるようになりました。

$ ansible-playbook -i inventory playbook.yml 

PLAY [all] ***************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [localhost]

PLAY RECAP ***************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

実際にタスクを書いてみます。sample/tasks/main.yml を編集します。

---
# tasks file for sample

- name: hello ansible!
  debug:
    msg: "Hello Ansible!"

実行してみます。

$ ansible-playbook -i inventory playbook.yml 

PLAY [all] ***************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [localhost]

TASK [sample : hello ansible!] *******************************************************************************************************************
ok: [localhost] => {
    "msg": "Hello Ansible!"
}

PLAY RECAP ***************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

ここでは localhost を対象に debug メッセージを出してみただけでしたが、対象を動的に変えてみたり、モジュールを使って実際にサーバの設定をしてみたりなど、ここからいろんなことができるようになります。

最初の一歩になればと思います。