普段、サーバーやネットワーク機器の運用管理をAnsibleで自動化していて、Androidデバイスの運用もAnsibleを利用したい、なんてことが有ったりすると思います。
Ansibleが、エージェントレスで操作するデバイスには、SSHとPythonが入っててほしいんですが、AndroidデバイスにはSSHの口はあるけど、Pythonは使えないみたいなケースがしばしばあるようです。
そんなケースで、どんなことができるか試してみたいと思います。
が、用意した検証環境が非常にイケてないので、ご自身のデバイスで試してみる際の手順の参考にでもなれば是幸いです
[結論]
まず、結論です
- rawモジュールしか使えない(シーケンシャルにコマンドをブン投げる形式、非状態宣言)
- rawで、amコマンド等を打って操作できる
- gather_facts: falseを設定する必要がある
- environmentキーワードはraw非対応のため、環境変数がおかしい場合はrawでexportコマンドとかを打ち込む
[環境]
Ansibleマシン: RHEL8 WorkstationノートPC
Androidマシン: OmniROM(Android12) on Raspi4(2G)に、Termux+SSHを導入したお手軽環境
[試した操作]
Ansibleを使って、リモートのAndroidにブラウザを起動させ、google.comにアクセスさせます
- name: sample
hosts: android
gather_facts: false
tasks:
- name: launch browser at android
raw: am start -a android.intent.action.VIEW -d http://google.com/
ブラウザが前面に出てきて、指定のURLが表示されます。
PLAY [sample] ************************************************************************************************************************************************************
META: ran handlers
TASK [launch browser at android] **************************************************************************************************************************************
task path: /home/xxxxx/Documents/myAnsible/android2.yml:9
<192.168.3.49> ESTABLISH SSH CONNECTION FOR USER: u0_a88
<192.168.3.49> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o Port=8022 -o 'IdentityFile="/home/xxxxx/.ssh/android_id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="u0_a88"' -o ConnectTimeout=10 -o ControlPath=/home/xxxxx/.ansible/cp/8b2e107033 -tt 192.168.3.49 'am start -a android.intent.action.VIEW -d http://google.com/'
Enter passphrase for key '/home/xxxxx/.ssh/android_id_rsa':
<192.168.3.49> (0, b'Starting: Intent { act=android.intent.action.VIEW dat=http://google.com/... }\r\n', b'Shared connection to 192.168.3.49 closed.\r\n')
changed: [192.168.3.49] => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.3.49 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.3.49 closed."
],
"stdout": "Starting: Intent { act=android.intent.action.VIEW dat=http://google.com/... }\r\n",
"stdout_lines": [
"Starting: Intent { act=android.intent.action.VIEW dat=http://google.com/... }"
]
}
META: ran handlers
META: ran handlers
PLAY RECAP ***************************************************************************************************************************************************************
192.168.3.49 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ANDROID_DATAのPathが狂ってて、amがうまく動かないというケースがあるようです。とりあえずAnsible側で対処させたいなら、その場合もrawコマンドを使うしかないので、以下のようにしてしのいでいきます。
raw: export ANDROID_DATA=/tmp && am start -a android.intent.action.VIEW -d http://www.google.com
あれ、Termuxが裏にいる時は、動かないぞ
→Termuxに「Display over other apps」の権限をやるという微妙設定により動くようになりました
→が、Ansible側にどかどかエラーが出るなぁ、、(迷宮入り)
[結論2]
ニーズがあれば、ちゃんとした検証環境でやり直したいと思いますが、できるだけLinuxのデバイスを使ってください、、と思いました。