从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等工具的服务器。

項目設定AMIRed Hat Enterprise Linux 7.3 (HVM), SSD Volume TypeインスタンスタイプT2.microネットワークデフォルトサブネットデフォルト(一番上)自動割り当てパブリックIP有効化ストレージ10GB(デフォルト)NameJenAnsi
■网络(安全组)
タイププロトコルポート範囲送信元理由SSHTCP22カスタム:0.0.0.0/0デフォルトすべてのICMPICMP0-65536任意の場所:0.0.0.0/0PINGHTTPTCP80任意の場所:0.0.0.0/0Jenkinsで使用HTTPSTCP443任意の場所:0.0.0.0/0念のためWinRM-HTTPTCP5985任意の場所:0.0.0.0/0Ansible->WinWinRM-HTTPSTCP5986任意の場所:0.0.0.0/0Ansible->WinカスタムTCPルールTCP8080任意の場所:0.0.0.0/0Jenkinsポート

待会儿就轻轻点击一下…
一旦创建好实例了,就可以使用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服务器对两台客户端进行操作。

Nameserver1client-linclient-winOSRHEL7RHEL7Windows 2012 Std役割Ansible,Jenkins考え中考え中S/WAnsible,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的条件: 服务器和客户端必须满足以下条件:具备名称解析、时间同步和通信端口开放的功能(由于时间同步和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

广告
将在 10 秒后关闭
bannerAds