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

#####はじめに<br>
***
***
JenkinsからAnsibleを実行させます。クライアントはWindowsでやろうかな・・・と<br>
【作成者より】
　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ホストネーム変更

```ruby:/etc/hostname
(def)ip-XXX-XX-XX-XX.us-west-2.compute.internal
(edi)server1
-------------------------------
:wq
```

```ruby:/etc/hosts
(def)127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
(edi)127.0.0.1   server1 localhost.localdomain localhost
-------------------------------
:wq
```
```ruby:/etc/sysconfig/network
※以下最終行に追加
(add)NETWORKING_IPV6=no
(add)HOSTNAME=server1
-------------------------------
:wq

```


```ruby:/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ホストネーム変更

```ruby: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)<br>
  ※AMI(RHEL7)はAmazonLinuxと違ってパッケージが入っていません｡｡｡
　　必要なパッケージの導入からはじめます<br>
    - 必要なパッケージ
        - 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を導入<br>
　※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
```

```ruby:/playbook/roles/linrole/tasks/main.yml
---
- name : For Linux
  copy : src={{ SLFILE }} dest={{ DLPATH }}
```

```ruby:/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/
```
```ruby:/playbook/roles/winrole/tasks/main.yml
---
- name : For Windows
  win_copy : src={{ SWFILE }} dest={{ DWPATH }}
```

```ruby:/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
```
```ruby:/playbook/sitelin.yml
- name: Linux Playbook
  hosts: linu
  become: yes
  roles:
    - linrole
```
```ruby:/playbook/sitewin.yml
- name: Windows Playbook
  hosts: wind
  roles:
    - winrole
```
```ruby:/playbook/sitelin.yml
- name: Linux Playbook
  hosts: linu
  become: yes
  roles:
    - linrole
```
```ruby:/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)
プレイブック処理内容：ファイルの転送

```ruby:実行前クライアント確認
[root@client-lin tmp]# ls
[root@client-lin tmp]#
```

```ruby: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 /]#
```
```ruby:実行後クライアント確認
[root@client-lin tmp]# ls
sample.yml
[root@client-lin tmp]#
```
#####■Playbook実行(Linux->Windows)
プレイブック処理内容：ファイルの転送
※このままやると失敗します
理由：クライアント側の設定が何もされていない
必要な設定：以下の設定が必要
・Powershell　有効化
・WinRM設定
　－Basic認証
　－HTTPSリスナー認証

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

```ruby: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
意味：パスワード平文許可

```ruby: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)
プレイブック処理内容：ファイルの転送

```ruby: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