LoginSignup
11
12

More than 5 years have passed since last update.

JenkinsからAnsibleを実行(1/2)

Last updated at Posted at 2016-11-23
はじめに


JenkinsからAnsibleを実行させます。クライアントはWindowsでやろうかな・・・と

【作成者より】
 qiita初投稿でもちろんMarkDownも初めて!見づらかったらごめんなさい
~このページでやること~
■AWSで環境構築(RHEL7X2,Win2k12std)
■Ansible導入
■Playbook作成
■Ansible実行(Linux->Linux)
■Ansible実行(Linux->Windows)


■環境

□OS:RHEL7
□SW:Ansible 2.2
□SW:Jenkins 2.33


■EC2インスタンス作成

※AnsibleやらJenkinsやらを導入するサーバを作ります

項目 設定
AMI Red Hat Enterprise Linux 7.3 (HVM), SSD Volume Type
インスタンスタイプ T2.micro
ネットワーク デフォルト
サブネット デフォルト(一番上)
自動割り当てパブリックIP 有効化
ストレージ 10GB(デフォルト)
Name JenAnsi
■ネットワーク(セキュリティグループ)
タイプ プロトコル ポート範囲 送信元 理由
SSH TCP 22 カスタム:0.0.0.0/0 デフォルト
すべてのICMP ICMP 0-65536 任意の場所:0.0.0.0/0 PING
HTTP TCP 80 任意の場所:0.0.0.0/0 Jenkinsで使用
HTTPS TCP 443 任意の場所:0.0.0.0/0 念のため
WinRM-HTTP TCP 5985 任意の場所:0.0.0.0/0 Ansible->Win
WinRM-HTTPS TCP 5986 任意の場所:0.0.0.0/0 Ansible->Win
カスタムTCPルール TCP 8080 任意の場所:0.0.0.0/0 Jenkinsポート

後はぽちっと・・・
インスタンス出来たらTeraTermで鍵を使ってログイン
(鍵は自動的につくってくれます)
インスタンスできたら・・・rootを使えるようにします


■rootログイン可能設定とホストネーム付与

インスタンス作成当初はrootは使えません。SSHはもちろん、パスワードもない状態です。
また、ホストネームも変えてみます。本当はPublicDNSも変更させたいんだけど・・・orz

  • rootにパスワード付与
  • sshでrootを使えるようにする
[ec2-user@ip-XXX-XX-XX-XX ~]$
[ec2-user@ip-XXX-XX-XX-XX ~]$ sudo passwd root
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[ec2-user@ip-XXX-XX-XX-XX ~]$ su
Password:
[ec2-user@ip-XXX-XX-XX-XX ~]# vi /etc/ssh/sshd_conf
(def)#PermitRootLogin yes
(edi)PermitRootLogin yes
-------------------------------
(def)PasswordAuthentication no
(edi)PasswordAuthentication yes
-------------------------------
[ec2-user@ip-XXX-XX-XX-XX ~]# systemctl restart sshd
[ec2-user@ip-XXX-XX-XX-XX ~]# 
  • Linuxホストネーム変更
/etc/hostname
(def)ip-XXX-XX-XX-XX.us-west-2.compute.internal
(edi)server1
-------------------------------
:wq
/etc/hosts
(def)127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
(edi)127.0.0.1   server1 localhost.localdomain localhost
-------------------------------
:wq
/etc/sysconfig/network
※以下最終行に追加
(add)NETWORKING_IPV6=no
(add)HOSTNAME=server1
-------------------------------
:wq

/etc/cloud/cloud.cfg
※以下最終行に追加
(add)preserve_hostname: true
-------------------------------
:wq

[ec2-user@ip-XXX-XX-XX-XX ~]# reboot

後はいつもどおりTeraTermでログイン!!!

再ログイン後
Last login: Tue xxx xx hh:mm:ss yyyy from xxx-xxx-x-xxx.rev.home.ne.jp
[root@server1 ~]#
  • Windowsホストネーム変更
Windowsホストネーム変更
#Powershell起動
PS C:\Users\Administrator> Rename-Computer <hostname> -Force -Restart
(即再起動が入る)


■Ansible導入

Ansibleはいろいろな作業をコードで書いて実行させることができます。
今回はAnsibleのサーバはRHEL7を使ってクライアントはWindows 2012 StdとRHEL7で1台のAnsibleから2台のクライアントでやろうかと思います

Name server1 client-lin client-win
OS RHEL7 RHEL7 Windows 2012 Std
役割 Ansible,Jenkins 考え中 考え中
S/W Ansible,Jenkins 考え中 考え中

  • Ansibleを導入(2.2)
    ※AMI(RHEL7)はAmazonLinuxと違ってパッケージが入っていません。。。   必要なパッケージの導入からはじめます
    • 必要なパッケージ
      • wget:いろいろインストールしたりダウンロードしたりするのに必要
      • epel-release:Ansibleはこの中に入っています
      • pywinrm:Ansible -> Windows のために必要です
    • パッケージ導入(wget,epel-release,ansible)
[root@ip-XXX-XX-XX-XX ~]# yum -y install wget
<中略>
Installed:
  wget.x86_64 0:1.14-13.el7

Complete!
[root@ip-XXX-XX-XX-XX ~]# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
<中略>
YYYY-MM-DD HH:MM:SS (348 KB/s) - ‘epel-release-7-8.noarch.rpm’ saved [14612/14612]
[root@ip-XXX-XX-XX-XX ~]#ls
epel-release-7-8.noarch.rpm
[root@ip-XXX-XX-XX-XX ~]# rpm -ivh epel-release-7-8.noarch.rpm
<中略>
Updating / installing...
   1:epel-release-7-8                 ################################# [100%]
[root@ip-XXX-XX-XX-XX ~]# rpm -qa | grep epel
epel-release-7-8.noarch
[root@ip-XXX-XX-XX-XX ~]# yum -y install ansible
<中略>
Complete!
[root@ip-XXX-XX-XX-XX ~]# ansible --version
ansible 2.2.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Ansible導入完了!!!

次はWindows転送のための準備

  • pywinrmを導入
     ※YUMだと失敗します
【PIPのインストール】
[root@server1 /]# yum -y install python-pip
<中略>
complete!
[root@server1 /]# 
【Pywinrmのインストール】
[root@server1 /]# pip install pywinrm
<中略>
Successfully installed python-ntlm3-1.0.2 pywinrm-0.2.1 requests-2.12.1 requests-ntlm-0.3.0 xmltodict-0.10.2

現時点でAnsibleを搭載させたサーバが完成!
次にやることはクライアントを作ります!
同じくEC2を作ってやるので内容等々は割愛!!


■Playbook作成

テストなので簡単なPlaybookを作成
作り方:
下記の構成でディレクトリとファイルを作成
mkdirとtouchとvi

playbook
|__group_vars                // 使用する変数ファイルを格納
|   |__linu.yml              // グループ[linu]で使用する変数
|   |__wind.yml              // グループ[wind]で使用する変数
|__hosts                     // 実行対象を記載
|__library                   // 自作モジュールを格納
|__roles                     // ロール格納
|   |__linrole               // Linux用ロール(FileCopy)
|   |  |__file
|   |       |__sample.yml
|   |__|__tasks
|   |       |__main.yml
|   |__winrole               // Windows用ロール(FileCopy)
|      |__file
|         |__sample.yml
|      |__tasks
|         |__main.yml
|__sitelin.yml               // Linux用role実行Inventory
|__sitewin.yml               // Windows用role実行Inventory
/playbook/roles/linrole/tasks/main.yml
---
- name : For Linux
  copy : src={{ SLFILE }} dest={{ DLPATH }}
/playbook/group_vars/linu.yml
---
ansible_ssh_user: root
ansible_password: <パスワード>
ansible_ssh_port: 22
ansible_connection: ssh
SLFILE: /playbook/roles/linrole/file/
DLFILE: /tmp/
/playbook/roles/winrole/tasks/main.yml
---
- name : For Windows
  win_copy : src={{ SWFILE }} dest={{ DWPATH }}
/playbook/group_vars/wind.yml
---
ansible_ssh_user: administrator
ansible_password: <パスワード>
ansible_ssh_port: 5986
ansible_connection: winrm
SWFILE: /playbook/roles/winrole/file/
DWFILE: C:\temp
/playbook/sitelin.yml
- name: Linux Playbook
  hosts: linu
  become: yes
  roles:
    - linrole
/playbook/sitewin.yml
- name: Windows Playbook
  hosts: wind
  roles:
    - winrole
/playbook/sitelin.yml
- name: Linux Playbook
  hosts: linu
  become: yes
  roles:
    - linrole
/playbook/hosts
[wind]
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
※ホストネームを変更してもPublicDNSに記載された名前じゃないと出来ない(ホストネームはPublicDNSの変更はしていないから?)
[linu]
client-lin

■Ansible実行の条件を確認
Serverとクライアントに名前解決と時刻同期と通信ポートが開いていることが条件
(時刻同期とSSHはすでに設定済みのためここでは名前解決を確認)

  • 名前解決
[root@server1 /]# ping client-lin
PING client-lin (PublicDNS) 56(84) bytes of data.
64 bytes from client-lin (PublicDNS): icmp_seq=1 ttl=63 time=0.477 ms

[root@server1 /]# ping client-win
PING client-win (PublicDNS) 56(84) bytes of data.
64 bytes from client-win (PublicDNS): icmp_seq=1 ttl=63 time=0.477 ms
■Playbook実行(Linux->Linux)

プレイブック処理内容:ファイルの転送

実行前クライアント確認
[root@client-lin tmp]# ls
[root@client-lin tmp]#
Ansibleの実行
[root@server1 /]# ansible-playbook -i /playbook/hosts /playbook/sitelin.yml

PLAY [Linux Playbook] **********************************************************

TASK [setup] *******************************************************************
ok: [client-lin]

TASK [linrole : For Linux] *****************************************************
changed: [client-lin]

PLAY RECAP *********************************************************************
client-lin                 : ok=2    changed=1    unreachable=0    failed=0

[root@server1 /]#
実行後クライアント確認
[root@client-lin tmp]# ls
sample.yml
[root@client-lin tmp]#
■Playbook実行(Linux->Windows)

プレイブック処理内容:ファイルの転送
※このままやると失敗します
理由:クライアント側の設定が何もされていない
必要な設定:以下の設定が必要
・Powershell 有効化
・WinRM設定
 -Basic認証
 -HTTPSリスナー認証

まずはPowershellを管理者モードで起動します。その後パワーシェルのポリシーを変更します。今回はBypassに変更して全部許可にします!一番セキュリティ甘いです!

Powershell有効化
PS C:\Users\Administrator> Get-ExecutionPolicy
RemoteSigned
PS C:\Users\Administrator> Set-ExecutionPolicy bypass -force
PS C:\Users\Administrator> Get-ExecutionPolicy
bypass
PS C:\Users\Administrator>

次にWinRMというリモート管理サービスの設定をします
Ansibleで通信するときはSSHを使用しているけど当然ながらWindowsにはありません!そのためAnsibleからWindowsに通信を行うときはWinRMというサービスを使い通信をします(OpenSSHを使って強引にやるってこともとりあえず出来ます)

変更箇所:AllowUnencrypted = False -> True
意味:LinuxのWinRM通信を許可する
変更箇所:Auth:Basic = False -> True
意味:パスワード平文許可

WinRM設定
PS C:\Users\Administrator> winrm set winrm/config/service/auth '@{Basic="true"}'
PS C:\Users\Administrator>winrm set winrm/config/service '@{AllowUnencrypted="true"}'
PS C:\Users\Administrator> winrm get winrm/config/service
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = true (Defalt:False)
    Auth
        Basic = true (Defalt:False)
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint
    AllowRemoteAccess = true

PS C:\Users\Administrator>
■Playbook再実行(Linux->Windows)

プレイブック処理内容:ファイルの転送

Ansibleの実行(Windows)
[root@server1 /]# ansible-playbook -i /playbook/hosts /playbook/sitewin.yml

PLAY [Windows Playbook] ********************************************************

TASK [setup] *******************************************************************
ok: [ec2-35-164-42-228.us-west-2.compute.amazonaws.com]

TASK [winrole : For Windows] ***************************************************
changed: [ec2-35-164-42-228.us-west-2.compute.amazonaws.com]

PLAY RECAP *********************************************************************
ec2-35-164-42-228.us-west-2.compute.amazonaws.com : ok=2    changed=1    unreachable=0    failed=0

[root@server1 /]#

成功!!!

長すぎたからいったんきります


まとめ
今回はAWSの作成とRootログインとHOSTNAME変更をしました。ServerにAnsibleを入れてクライアントにはWindowsとLinuxで双方にAnsibleの実行が可能であることが証明できたと思います。

次回:AnsibleサーバにJenkinsを導入しAnsible実行ジョブを作成
JenkinsからAnsibleを実行(2/2)
http://qiita.com/yo_dazy/items/468524ca0ac11cdc2d41

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12