はじめに
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ホストネーム変更
(def)ip-XXX-XX-XX-XX.us-west-2.compute.internal
(edi)server1
-------------------------------
:wq
(def)127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
(edi)127.0.0.1 server1 localhost.localdomain localhost
-------------------------------
:wq
※以下最終行に追加
(add)NETWORKING_IPV6=no
(add)HOSTNAME=server1
-------------------------------
:wq
※以下最終行に追加
(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ホストネーム変更
#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
---
- name : For Linux
copy : src={{ SLFILE }} dest={{ DLPATH }}
---
ansible_ssh_user: root
ansible_password: <パスワード>
ansible_ssh_port: 22
ansible_connection: ssh
SLFILE: /playbook/roles/linrole/file/
DLFILE: /tmp/
---
- name : For Windows
win_copy : src={{ SWFILE }} dest={{ DWPATH }}
---
ansible_ssh_user: administrator
ansible_password: <パスワード>
ansible_ssh_port: 5986
ansible_connection: winrm
SWFILE: /playbook/roles/winrole/file/
DWFILE: C:\temp
- name: Linux Playbook
hosts: linu
become: yes
roles:
- linrole
- name: Windows Playbook
hosts: wind
roles:
- winrole
- name: Linux Playbook
hosts: linu
become: yes
roles:
- linrole
[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]#
[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に変更して全部許可にします!一番セキュリティ甘いです!
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
意味:パスワード平文許可
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)
プレイブック処理内容:ファイルの転送
[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