インベントリーファイルができあがると、ansible
コマンドを使用してアドホックコマンドを実行できます。
使用するインベントリーファイル
y_mrok@ctrl:~/code/exam3$ tree
.
├── group_vars
│ ├── all.yml
│ └── web.yml
├── host_vars
│ ├── ebisugawa.yml
│ ├── marutamachi.yml
│ ├── nijyo.yml
│ ├── oike.yml
│ ├── oshikoji.yml
│ └── takeyamachi.yml
└── hosts.yml
2 directories, 9 files
y_mrok@ctrl:~/code/exam3$
---
all:
hosts:
marutamachi:
children:
web:
hosts:
takeyamachi:
ebisugawa:
nijyo:
mail:
hosts:
nijyo:
database:
hosts:
oshikoji:
oike:
---
ansible_host: 192.168.111.101
---
ansible_host: 192.168.111.102
---
ansible_host: 192.168.111.103
---
ansible_host: 192.168.111.104
---
ansible_host: 192.168.111.105
ansible_python_interpreter: /usr/bin/python3
---
ansible_host: 192.168.111.106
ansible_python_interpreter: /usr/libexec/platform-python
---
ansible_user: vagrant
ansible_password: vagrant
---
http_port: 8080
アドホックコマンドでインベントリーを使用するメリット
一般的なアドホックコマンドを実行する手順です。
- 対象ホストに SSH などでログイン
- アドホックコマンドを実行
- 対象ホストからログアウト
ホストの台数が増えてくると、かなりシンドイです。
インベントリーにアドホックコマンドの実行対象のホスト (管理対象ノード) を書くと、書いたホストに対して一度にアドホックコマンドが実行できます。
-
ansible
コマンドでアドホックコマンドを実行
対象ホストの台数に関係なく、1 回で実行できます。対象のホストが増えたらインベントリーファイルに追記するだけです。
ansible コマンド
Ansible のモジュールを使用してアドホックコマンドを実行します。
構文
ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
[-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE]
[-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
[-c CONNECTION] [-T TIMEOUT]
[--ssh-common-args SSH_COMMON_ARGS]
[--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS]
[--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[--task-timeout TASK_TIMEOUT] [-a MODULE_ARGS]
[-m MODULE_NAME]
pattern
主なパラメーター
パラメーター | 説明 |
---|---|
pattern | 管理対象ノード名またはグループ名を指定する |
-i | インベントリーファイルを指定する |
-m | アドホックコマンドとして実行する Ansible のモジュール[1]を指定する |
-a | 実行するモジュールのパラメーターを指定する |
-b | 管理者モードで実行する |
-m
パラメーターの省略時は ansible.builtin.command
モジュールを指定したものとして扱われます。
使用例
Linux コマンドを実行
すべての管理対象ノードのハードディスクの空き容量を確認する
すべての管理対象ノードで df -H
コマンドを実行して、ハードディスクの空き容量を確認します。すべての管理対象ノードを指定するため pattern に "all" グループを指定します。Linux コマンドの実行は ansible.builtin.command
モジュール、パラメーターは実行するコマンドです。
y_mrok@ctrl:~/code/exam3$ ansible all -i hosts.yml -m ansible.builtin.command -a "df -H"
oshikoji | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.1G 0 2.1G 0% /dev
tmpfs 414M 5.6M 409M 2% /run
/dev/sda1 22G 1.1G 19G 6% /
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 5.3M 0 5.3M 0% /run/lock
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
tmpfs 414M 0 414M 0% /run/user/1000
ebisugawa | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.1G 0 2.1G 0% /dev
tmpfs 413M 951k 412M 1% /run
/dev/sda1 42G 1.4G 41G 4% /
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 5.3M 0 5.3M 0% /run/lock
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
/dev/loop0 59M 59M 0 100% /snap/core18/2128
/dev/loop1 74M 74M 0 100% /snap/lxd/21029
/dev/loop2 34M 34M 0 100% /snap/snapd/12883
tmpfs 413M 0 413M 0% /run/user/1000
nijyo | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.1G 0 2.1G 0% /dev
tmpfs 414M 623k 414M 1% /run
/dev/sda1 42G 1.2G 41G 3% /
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 5.3M 0 5.3M 0% /run/lock
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
vagrant 2.0T 716G 1.3T 36% /vagrant
tmpfs 414M 0 414M 0% /run/user/1000
takeyamachi | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 9.0M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 43G 3.2G 40G 8% /
tmpfs 398M 0 398M 0% /run/user/1000
marutamachi | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.1G 0 2.1G 0% /dev
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 2.1G 18M 2.1G 1% /run
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
/dev/sda1 11G 3.6G 7.2G 34% /
tmpfs 412M 0 412M 0% /run/user/1000
oike | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.1G 0 2.1G 0% /dev
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 2.1G 18M 2.1G 1% /run
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
/dev/sda2 19G 1.8G 18G 10% /
vagrant 2.0T 716G 1.3T 36% /vagrant
tmpfs 413M 0 413M 0% /run/user/1000
y_mrok@ctrl:~/code/exam3$
ansible.builtin.command
モジュールは省略できるので次のコマンドも結果は同じです。
ansible all -i hosts.yml -a "df -H"
"web" グループに含まれる管理対象ノードのカレントディレクトリーを確認する
pwd
コマンドで管理対象ノードに接続したときのカレントディレクトリーを調べます。対象は "web" グループなので、 pattern に "web" グループを指定します。
y_mrok@ctrl:~/code/exam3$ ansible web -i hosts.yml -a "pwd"
ebisugawa | CHANGED | rc=0 >>
/home/vagrant
nijyo | CHANGED | rc=0 >>
/home/vagrant
takeyamachi | CHANGED | rc=0 >>
/home/vagrant
y_mrok@ctrl:~/code/exam3$
管理対象ノード nijyo にログインしているユーザーの識別情報を確認する
id
コマンドで管理対象ノードにログインしているユーザーの識別情報を確認します。対象は管理対象ノード nijyo なので、 pattern に nijyo を指定します。
y_mrok@ctrl:~/code/exam3$ ansible nijyo -i hosts.yml -a "id"
nijyo | CHANGED | rc=0 >>
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
y_mrok@ctrl:~/code/exam3$
管理対象ノード oikke の「/etc/shadow」ファイルの内容を確認する
cat
コマンドで管理対象ノードの 「/etc/shadow」ファイルの内容を確認します。
y_mrok@ctrl:~/code/exam3$ ansible oike -i hosts.yml -a "cat /etc/shadow"
oike | FAILED | rc=1 >>
cat: /etc/shadow: Permission deniednon-zero return code
y_mrok@ctrl:~/code/exam3$
"Permission denied (権限がない)" と怒られました。「/etc/shadow」ファイルの内容を確認するには管理者権限が必要です。この様な場合は -b
オプションを指定して実行します。
y_mrok@ctrl:~/code/exam3$ ansible oike -i hosts.yml -a "cat /etc/shadow" -b
oike | CHANGED | rc=0 >>
root:$6$dFB9sCuHWw/byZzf$3cRlt724DoDr.8svhdC622OVjG8b8Lm8uEG1tp/0GF.d5rNv57TcW8jdKcM.Jhbq9krBrGzeChc3Ynu1GJqAW/::0:99999:7:::
bin:*:18505:0:99999:7:::
daemon:*:18505:0:99999:7:::
adm:*:18505:0:99999:7:::
lp:*:18505:0:99999:7:::
sync:*:18505:0:99999:7:::
shutdown:*:18505:0:99999:7:::
halt:*:18505:0:99999:7:::
mail:*:18505:0:99999:7:::
operator:*:18505:0:99999:7:::
games:*:18505:0:99999:7:::
ftp:*:18505:0:99999:7:::
nobody:*:18505:0:99999:7:::
dbus:!!:18832::::::
systemd-coredump:!!:18832::::::
systemd-resolve:!!:18832::::::
tss:!!:18832::::::
unbound:!!:18832::::::
polkitd:!!:18832::::::
sssd:!!:18832::::::
chrony:!!:18832::::::
sshd:!!:18832::::::
rngd:!!:18832::::::
vagrant:$6$LuZXBW8AOuBfSRSh$W/nBrs916R9wj1W0V8ar2pyNva3jtuzB3gDso5Yyx1w5dFSkMwYNlSUwMboWHWARd8Aq8tAKQTOB87iHrAtDW.::0:99999:7:::
vboxadd:!!:18832::::::
rpc:!!:18832:0:99999:7:::
rpcuser:!!:18832::::::
y_mrok@ctrl:~/code/exam3$
Ansible のモジュールを実行
管理対象ノードへファイルをコピーする
コントロールノードのカレントディレクトリー上の「abc.txt」ファイルを管理対象ノード ebisugawa にコピーします。
コピーするファイルを確認します。
y_mrok@ctrl:~/code/exam3$ ls -l abc.txt
-rw-rw-r-- 1 y_mrok y_mrok 31 8月 28 16:03 abc.txt
y_mrok@ctrl:~/code/exam3$
コピー前の ebisugawa のディレクトリーの状況です。
y_mrok@ctrl:~/code/exam3$ ansible ebisugawa -i hosts.yml -a "ls -l"
ebisugawa | CHANGED | rc=0 >>
total 0
y_mrok@ctrl:~/code/exam3$
ansible.builtin.copy
モジュールを使用してファイルをコピーします。-a
パラメーター内の src
がコントロールノードのコピー元の、dest
が管理対象ノードのコピー先の path を指定します。
y_mrok@ctrl:~/code/exam3$ ansible ebisugawa -i hosts.yml -m ansible.builtin.copy -a "src='./abc.txt' dest='~/'"
ebisugawa | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"checksum": "fa0de21618e8ac69506384fa222dde9a57e54c42",
"dest": "/home/vagrant/abc.txt",
"gid": 1000,
"group": "vagrant",
"md5sum": "60199a5e05b3d7a03ed4cc6fd2eabacd",
"mode": "0664",
"owner": "vagrant",
"size": 31,
"src": "/home/vagrant/.ansible/tmp/ansible-tmp-1630135020.258051-3908-206476717235531/source",
"state": "file",
"uid": 1000
}
y_mrok@ctrl:~/code/exam3$
コピー後の ebisugawa のディレクトリーの状況です。コピーしたファイルを確認できます。
y_mrok@ctrl:~/code/exam3$ ansible ebisugawa -i hosts.yml -a "ls -l"
ebisugawa | CHANGED | rc=0 >>
total 4
-rw-rw-r-- 1 vagrant vagrant 31 Aug 28 16:17 abc.txt
y_mrok@ctrl:~/code/exam3$
今回は管理対象ノードを指定しました。グループを指定するとグループに含まれる管理対象ノードすべてに対し同時にファイルをコピーできます。
演習問題
-
Index of all Modules (https://docs.ansible.com/ansible/latest/collections/index_module.html) ↩︎