tsalakh ain sus noam Huyah ol guf

勉強会のメモ。その他備忘録。参考にさせて頂いたサイトや資料はリンクさせて頂いていますが不都合があればご連絡ください。

【技術メモ】Jenkinsからリモートホストでシェル実行

Jenkinsからリモートホストでシェル実行

(参考サイト) http://knowledge.sakura.ad.jp/knowledge/5293/

概要

のやったこと手順。


初回のみ必要な手順

Jenkinsプラグイン導入

SSH Agent Pluginと、依存プラグインを入れる

ssh-agent

https://wiki.jenkins-ci.org/display/JENKINS/SSH+Agent+Plugin 導入時バージョン:1.13

bouncycastle-api(over ver1.0.2)

https://wiki.jenkins-ci.org/display/JENKINS/Bouncy+Castle+API+Plugin 導入時バージョン:2.16.0

導入済みだった依存プラグイン

  • workflow-step-api(over ver1.9)
  • credentials(over ver1.22)
  • ssh-credentials(over ver1.11)

SSH認証情報を追加

http://gomocool.net/gomokulog/?p=557

SSH公開鍵/秘密鍵を作成

「~jenkins/.ssh」にSSH公開鍵および秘密鍵を作成する

sudo -u jenkins ssh-keygen
Enter file in which to save the key (/home/jenkins/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):

一つ目の質問は保存先、二つ目はパスフレーズ
どちらも空でもいける、成功すると2ファイルできる

公開鍵をリモートホストに登録

http://gomocool.net/gomokulog/?p=557 http://www.turbolinux.com/support/document/knowledge/152.html

# 接続元
scp /home/jenkins/.ssh/id_rsa.pub root@10.x.x.x:filename
# 接続先
cat ~/tmp.pub >> ~/.ssh/authorized_keys
rm ~/tmp.pub

jenkinsに認証情報を追加

jenkinsの画面から「認証情報」→「System」→「グローバルドメイン」、「認証情報の追加」で以下を入力


Jenkinsジョブの作り方

jenkins画面から [新規ジョブ作成]→ジョブ名称入力、[Pipeline]を選択して以下を入力

  • [General]説明を書く
  • [BuildTriggers]変更不要
  • [Advanced Project Options]変更不要
  • [Pipeline]
    • DefinitionがPipeline scriptなら直書き
    • Pipeline script fromSCMならGitから取得
    • Jenkinsfileの記載例は以下
stage "リモートホストでシェル実行"
node {
    sshagent(['jenkins']) {
        sh 'hostname'
        sh 'ssh -t -t -o StrictHostKeyChecking=no root@xxx hostname'
    }
}

サンプルは[Pipeline Syntax]の「sshagent:SSH Agent」 * 「sshagent(['認証情報名']){}」でssh-agent利用 * ’認証情報名’は、前段でJenkins画面から登録したID * あとは普通に処理を記載


つまづきポイント

sshでHost key verification failed

状況

jenkinsのコンソールにエラー出力

Host key verification failed.

原因

接続先が知らないサーバだと出る。

  • 初回接続
  • 接続先がサーバ更改等でfingerprintが変わった

対処

sshコマンドに「-o StrictHostKeyChecking=no」をつける http://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938

sshでPseudo-terminal・・・

状況

jenkinsのコンソールにエラー出力

Pseudo-terminal will not be allocated because stdin is not a terminal.

原因

仮想端末(pty)がアロケートされていないのでプロンプトや行バッファなどの機能が無効になっている

対処

sshコマンドに「-t」オプションを2個付ける。 http://takat.exblog.jp/12216326/

接続先のログインユーザが違う

状況

何もしないとjenkinsで行こうとする

原因

対処

  1. sshコマンドで接続先を「account@host」にする
  2. .ssh/configを使う

これ、対象サーバいっぱいいたらどうするか考えないとダメ

ヒアドキュメント使いたい

検討中。実際コマンドいっぱい打ちたいときはどうするのか