从Jenkins执行Ansible(1/2)
首先
我们将通过Jenkins来执行Ansible。客户端是Windows的话,会怎么样呢…
【作者附言】
这是我在qiita初次发表,也是第一次使用MarkDown!如果不好看,我道歉
~本页要做的事情~
■ 在AWS上建立环境(RHEL7X2,Win2k12std)
■ 安装Ansible
■ 创建Playbook
■ 执行Ansible(Linux->Linux)
■ 执行Ansible(Linux->Windows)
■环境
操作系统:RHEL7
软件:Ansible 2.2
软件:Jenkins 2.33
创建EC2实例
我会创建一个安装了Ansible、Jenkins等工具的服务器。
■网络(安全组)
待会儿就轻轻点击一下…
一旦创建好实例了,就可以使用TeraTerm工具进行登录,并使用密钥(系统会自动生成密钥)。
实例创建好后,会将root账户设置为可用状态。
■允许root登录设置和分配主机名
在创建实例之初,root用户是无法使用的。SSH当然也无法使用,而且没有设置密码。
另外,我还会尝试更改主机名。虽然我真的很想同时更改Public DNS,但是……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的服务器为RHEL7,客户端为Windows 2012 Std和RHEL7,通过一个Ansible服务器对两台客户端进行操作。
-
- 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的条件: 服务器和客户端必须满足以下条件:具备名称解析、时间同步和通信端口开放的功能(由于时间同步和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
■ 在Linux上执行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设置
– 基本认证
– HTTPS监听器认证
首先,在管理员模式下启动PowerShell。然后修改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系统没有SSH服务!因此,在使用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>
■以Linux为源,将Playbook重新运行到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变更。我在服务器上安装了Ansible,并证明了它可以在Windows和Linux的客户端上执行。
下次:在Ansible服务器上安装Jenkins并创建Ansible执行任务。
通过Jenkins执行Ansible任务(2/2)
http://qiita.com/yo_dazy/items/468524ca0ac11cdc2d41