Ansible TowerまたはAWXのインベントリ作成までの初期設定の流れを説明します。「Ansible Towerの初期操作(1/3) プロジェクトの作成まで」に基づいてプロジェクトの作成が終わっている事が前提条件です。様々な運用形態に対応できるようGUI, CLI, APIの3通りの設定手順をまとめます。
インベントリ作成
まずはインベントリ名を定義します。以降、インベントリに紐づいたホストやグループを定義する事になります。誤解を恐れない言い方をすれば、「インベントリ」はホストやグループの入れ物です。
「インベントリ」の画面に遷移し、「+(追加)」ボタンを押下します。インベントリは「インベントリー」「スマートインベントリー」の2種類から選ぶ事ができますが、ここでは「インベントリー」の設定方法を紹介します。

必要な情報を入力し「保存」を押下します。

この操作をGUIを使わず、CLIまたはAPIで操作する場合は以下の通りです。
CLI操作
awx inventory create \
--name "逸般の誤家庭" \
--description "ありふれた家庭環境" \
--organization "スピードワゴン財団"
API操作
ORGANIZATION_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/organizations/ | \
jq '.results[] | select(.name == "スピードワゴン財団")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/inventories/ << EOF
{
"name": "逸般の誤家庭",
"description": "ありふれた家庭環境",
"organization": ${ORGANIZATION_ID}
}
EOF
ホストの作成
インベントリー配下にグループを作成します。インベントリーを選択済となっている画面で、さらに「グループ」の画面へ遷移し、「+(追加)」ボタンを押下します。

必要な情報を入力し「保存」を押下します。同様の操作を繰り返し、動作確認のためにホストを2つ以上作成しておきましょう。

この操作をGUIを使わず、CLIで操作する場合は以下の通りです。YAML形式またはJSON形式で与える変数内で改行を使いたい時は「\」を指定します。
CLI操作
awx hosts create \
--name "centos81" \
--description "centos81" \
--inventory "逸般の誤家庭" \
--variables "---\nansible_host : '192.168.9.81'"
APIで操作する場合は以下の通りです。「インベントリ」は名前ではなくidで指定します。
API操作
INVENTORY_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventories/ | \
jq '.results[] | select(.name == "逸般の誤家庭")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/hosts/ << EOF
{
"name": "centos81",
"description": "centos81",
"inventory": ${INVENTORY_ID},
"variables": "---\nansible_host : '192.168.9.81'"
}
EOF
グループの作成
インベントリー配下にグループを作成します。インベントリーを選択済となっている画面で、さらに「グループ」の画面へ遷移し、「+(追加)」ボタンを押下します。

必要な情報を入力し「保存」を押下します。もし、グループ単位で設定するのが望ましい変数があれば、この画面で変数を設定しましょう。この動作確認シナリオではグループ単位で設定すべき変数はないため、入力を省略しています。
なお、機器への接続情報はグループ単位ではなく認証情報としても設定できるため、ここでは入力を省略しています。

この操作をGUIを使わず、CLIで操作する場合は以下の通りです。
CLI操作
awx groups create \
--name "centos" \
--description "centos" \
--inventory "逸般の誤家庭"
APIで操作する場合は以下の通りです。「インベントリ」は名前ではなくidで指定します。
API操作
INVENTORY_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventories/ | \
jq '.results[] | select(.name == "逸般の誤家庭")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/groups/ << EOF
{
"name": "centos",
"description": "centos",
"inventory": ${INVENTORY_ID}
}
EOF
グループとホストの紐づけ
グループの作成が完了すると、グループとホストの紐づけ設定が可能になります。グループの設定画面で今までグレーアウトされていた「ホスト」のボタンが選択可能になります。「ホスト」を押下します。

「+(追加)」ボタンを押下します。

追加したいホストにチェックを入れ、「保存」を押下します。

この操作をGUIを使わず、APIで操作する場合は以下の通りです。URLに「グループ」のidを指定し、HTTP REQUEST BODYに「ホスト」のidを指定します(awxkit 14.0.0時点ではCLIでホストとグループを紐づける操作は見当たりません)。
API操作
GROUP_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/groups/ | \
jq '.results[] | {id,name} | select(.name == "centos")' | jq ".id")
HOST_ID_1=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/hosts/ | \
jq '.results[] | {id,name} | select(.name == "centos81")' | jq ".id")
HOST_ID_2=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/hosts/ | \
jq '.results[] | {id,name} | select(.name == "centos82")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/groups/${GROUP_ID}/hosts/ << EOF
{
"id": ${HOST_ID_1}
}
EOF
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/groups/${GROUP_ID}/hosts/ << EOF
{
"id": ${HOST_ID_2}
}
EOF
もし、ホストとグループの紐づけを解除したい場合は、idとdisassociateにホストIDを指定します。
API操作
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/groups/${GROUP_ID}/hosts/ << EOF
{
"id": ${HOST_ID_1},
"disassociate": ${HOST_ID_1}
}
EOF