Ansibleを使用して、コマンドを実行するタスクのsysoutをローカル(つまり、管理対象サーバー上)のログファイルに書き込むことができるようにしたいと考えています。今のところ、私はこのようなタスクを使用してのみこれを行うことができます:
- name: Run my command
Shell: <command> <arg1> <arg3> ... |tee -a <local log file>
これを行う理由は、が完了するまでに長い時間がかかり(つまり、出力の取得が完了するまで待つことができず)、実行中に出力を収集したいためです。
tee
パイプを使用せずに実行中にコマンドのsysoutをローカルログファイルにリダイレクトする「Ansible」方法はありますか?
最初のタスクで登録を使用する必要があります。次に、出力をローカルファイルに書き込むための2番目のタスクを作成できます。
- name: Shell command
Shell: my_Shell_command
register: myshell_output
- name: copy the output to a local file
copy:
content: "{{ myshell_output.stdout }}"
dest: "/tmp/hello.txt"
delegate_to: localhost
Ansibleのデフォルトで、最も一般的なパターンは、タスクを完了させ、最後に出力を登録することです。非同期機能がありますが、プレイブックで作成するジョブをクエリする必要があります。
むしろ、それを背景にするためにinitスクリプト機能を使用することを検討してください。あなたはこのLinuxにタグを付けました。このような堅牢なロギングは、systemdユニットでは非常に簡単です。
vmstatは定期的にデータをstdoutに出力し、簡単な例を示します。 vmstatの出力をログに記録する最も簡単な方法を紹介します。/etc/systemd/system/dumbstat.service
[Unit]
Description=Dumb vmstat wrapper service example
Documentation=https://serverfault.com/questions/958952/ansible-task-write-to-local-log-file
[Service]
Type=oneshot
ExecStart=/usr/bin/vmstat 5 12
StandardOutput=journal
[Install]
WantedBy=multi-user.target
Type=oneshot
は、プロセスが終了するまで開始状態で待機します。非同期フォークを増やして動作を続行したい場合は、別のタイプが必要になる場合があります。
標準出力がキャプチャされ、通常のツールを介して利用できます。
root@sf-958952:/var/log# systemctl status dumbstat
● dumbstat.service - Dumb vmstat wrapper service example
Loaded: loaded (/etc/systemd/system/dumbstat.service; disabled; vendor preset: enabled)
Active: activating (start) since Wed 2019-03-20 14:49:41 UTC; 7s ago
Docs: https://serverfault.com/questions/958952/ansible-task-write-to-local-log-file
Main PID: 3103 (vmstat)
Tasks: 1 (limit: 4401)
CGroup: /system.slice/dumbstat.service
└─3103 /usr/bin/vmstat -w 5 12
Mar 20 14:49:41 sf-958952 systemd[1]: Starting Dumb vmstat wrapper service example...
Mar 20 14:49:41 sf-958952 vmstat[3103]: procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
Mar 20 14:49:41 sf-958952 vmstat[3103]: r b swpd free buff cache si so bi bo in cs us sy id wa st
Mar 20 14:49:41 sf-958952 vmstat[3103]: 7 0 0 3104416 70260 417228 0 0 208 36 40 132 1 1 98 0 0
Mar 20 14:49:46 sf-958952 vmstat[3103]: 0 0 0 3107200 70260 417260 0 0 0 0 40 130 1 0 99 0 0
Systemdジャーナルをクエリして出力をフィルタリングすることもできます:journalctl _SYSTEMD_UNIT=dumbstat.service
ローカルファイルが必要な場合、またはジャーナルをどこかに転送する場合、デフォルトでジャーナルはsyslogに転送されます。
面白いことに、システム240以降はStandardOutput=append:
を含むファイルに直接ログを記録できますが、これはCentOS 7またはUbuntu 18.04にはあまりにも新しいものです。
これらすべては、Ansibleとはほとんど関係ありません。そのようなユニットをtemplate
モジュールでデプロイし、systemd
モジュールで開始できます。