星期日, 1月 14, 2018

Ansible azure module 測試小記

Ansible azure module 測試小記

OS: openSUSE Leap 42.3 in Azure



參考

微軟的文件上面是列出 SLES 12, 然後安裝比較多的套件, 但是他列出的套件本來就有相依性, 例如 python-pip 與 python-setuptools , 所以我就先按照 Ansible 官方的 方式, 我先安裝 pip 來處理

安裝 pip ( 先使用 sudo su - 切換成管理者 root )
# zypper  install  python-pip

預設的 pip 是 7.1.2 所以如果沒有升級, 後續安裝會失敗, 先來升級 pip
# pip  install  --upgrade   pip

觀察 pip 版本
# pip  --version
pip 9.0.1 from /usr/lib/python2.7/site-packages (python 2.7)

安裝相關套件
# pip  install   ansible[azure]

確認相關資訊
# ansible   --version
ansible 2.4.2.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 = /usr/bin/ansible
 python version = 2.7.13 (default, Jan 03 2017, 17:41:54) [GCC]

# pip   list   --format=columns   azure  |  grep  azure
azure-cli-core              2.0.24   
azure-cli-nspkg             3.0.1    
azure-common                1.1.8    
azure-mgmt-batch            4.1.0    
azure-mgmt-compute          2.1.0    
azure-mgmt-containerservice 1.0.0    
azure-mgmt-dns              1.2.0    
azure-mgmt-keyvault         0.40.0   
azure-mgmt-network          1.7.1    
azure-mgmt-nspkg            2.0.0    
azure-mgmt-resource         1.2.2    
azure-mgmt-sql              0.7.1    
azure-mgmt-storage          1.5.0    
azure-mgmt-web              0.32.0   
azure-nspkg                 2.0.0    
azure-storage               0.35.1   
msrestazure                 0.4.20   

接下來要來處理 Azure 驗證的問題

Ansible 官方的方式我覺得步驟太多, 所以先採用 Azure-Cli 方式
Azure-Cli 可以使用兩種方式

目前先以 Cloud-shell 方式來進行
於 Azure portal 上面點選 >_ 按鈕
就會被提示安裝 Cloud-shell , 我是選 bash 方式


他會需要一個儲存體來使用, 選取訂用帳戶之後就會建立 Cloud-shell



測試一下 az 指令來列出目前的 VM ( 覺得加上--output  table 這個方式很方便 )

==== 以下操作是在 cloud-shell 的終端機 ====

$ az  vm  list  --output  table
Name                       ResourceGroup    Location
-------------------------  ---------------  ----------
kong-0-11-1-test-20171118  SAKANATEST       eastus
test20180113               SAKANATEST       eastus

接下來回到微軟官方說的

az ad sp create-for-rbac --query [client_id: appId, secret: password, tenant: tenant]
  • az  -  Azure 工具指令
  • ad : Synchronize on-premises directories and manage Azure Active Directory resources
  • sp : Manage Azure Active Directory service principals for automation authentication
  • create-for-rbac  : Create a service principal and configure its access to Azure resources.

如果直接在 cloud-shell 執行會出現錯誤

$ az ad sp create-for-rbac --query [client_id: appId, secret: password, tenant: tenant]
az ad sp create-for-rbac: error: argument --query: invalid query value: '[client_id:'


嘗試方式 1:
這樣的方式可行
$ az  ad  sp   create-for-rbac  --query   '[appId, password, tenant]'
Retrying role assignment creation: 1/36
Retrying role assignment creation: 2/36
[
 "d69d8f91-XXXX-XXXX-XXXX-b90b15d8107d",
 "65f16417-XXXX-XXXX-XXXX-296e19bebf4c",
 "4cd326d7-XXXX-XXXX-XXXX-df56dc9dabd4"
]

所以用這樣的想法來推論, 應該是微軟官方文件上面的格式錯誤

上 Azure Taiwan Users Group 上面詢問, 與保哥討論後的方式
$ az  ad  sp  create-for-rbac --query  '{"client_id": appId, "secret": password, "tenant": tenant}'
Retrying role assignment creation: 1/36
{
 "client_id": "d06f8905-XXXX-XXXX-XXXX-3e0bcf22a853",
 "secret": "b7f0df5b-XXXX-XXXX-XXXX-8aaca284f706",
 "tenant": "4cd326d7-XXXX-XXXX-XXXX-df56dc9dabd4"
}

  • 果然兇手是符號  應該配合大括號, 以及單引號與雙引號

如何知道有建立完成呢?
可以使用 az  ad  sp  list 指令檢查, 會有 azure-cli-日期方式的 AppId

$ az  ad  sp  list  --output  table
AppId                                 DisplayName                               ObjectId                              ObjectType
------------------------------------  ----------------------------------------  ------------------------------------  ----------------
7b427a33-XXX-XXXX-XXXX-XXXXa7d8a60c  azure-cli-2018-01-13-04-22-35             f29caeda-XXXX-XXXX-XXXX-97dc15849728  ServicePrincipal


如果要刪除也是使用 az ad sp 指令來處理, 例如
$ az  ad  sp  delete --id   80027916-XXXX-XXXX-XXXX-778cddb9e155

建立的時候, password 的值請好好保存 ( 不然就刪除掉再建立一個 :p  )
因為以 az  ad  sp  show 方式是查不到 password 的喔
$ az  ad  sp  show --id   647f8726-XXXX-XXXX-XXXX-5f2e03e8f2c8


接下來還要有 subscription_id
使用 az account 指令取得

$ az  account  show  --query  "{ subscription_id: id }"
{
 "subscription_id": "6a2bdf3b-XXXX-XXXX-XXXX-3371d3401feb"
}

  • 這邊微軟官方文件上面的符號就是正確的 QQ


==== 以上操作是在 cloud-shell 的終端機, 操作結束 ====

接下來會到 openSUSE Leap 42.3 in Azure 這邊

建立 存放認証的目錄
# mkdir   ~/.azure

使用剛剛的資料建立認証的檔案
# vi   ~/.azure/credentials

[default]
subscription_id=6a2bdf3b-XXXX-XXXX-XXXX-3371d3401feb
client_id=d06f8905-XXXX-XXXX-XXXX-3e0bcf22a853
secret=b7f0df5b-XXXX-XXXX-XXXX-8aaca284f706
tenant=4cd326d7-XXXX-XXXX-XXXX-df56dc9dabd4


建立好了就可以開始測試了
首先就從最簡單的管理 IP 開始吧 :)

Module name:  azure_rm_publicipaddress

目標要從 sakanatest 這個資源群組, 建立一個 mypublic_ip 的固定 IP
先以單一指令的方式來實施吧
# ansible  localhost  -m  azure_rm_publicipaddress  -a  'resource_group=sakanatest name=mypublic_ip  allocation_method=Static'

[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: Could not match supplied host pattern, ignoring: all

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

localhost | SUCCESS => {
   "changed": true,
   "state": {
       "dns_settings": {},
       "etag": "W/\"ff593fe3-XXXX-XXXX-XXXX-a3eb90006d47\"",
       "idle_timeout_in_minutes": 4,
       "ip_address": "213.192.72.82",
       "location": "eastus",
       "name": "mypublic_ip",
       "provisioning_state": "Succeeded",
       "public_ip_allocation_method": "Static",
       "tags": null,
       "type": "Microsoft.Network/publicIPAddresses"
   }
}

可以到 Azure Portal 上面確認 :)


接下來測試移除這個 IP

# ansible  localhost  -m  azure_rm_publicipaddress  -a  'resource_group=sakanatest name=mypublic_ip   state=absent'

[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: Could not match supplied host pattern, ignoring: all

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

localhost | SUCCESS => {
   "changed": true,
   "state": {
       "status": "Deleted"
   }
}


總算是跨出 Ansible azure module 第一步 :)

Reference

~ enjoy it

沒有留言: