ksaitoの日記

日々試したことの覚え書き

ubuntu 16.04のtimezone設定

今までは、下記でtimezoneが設定できました。

# echo "Asia/Tokyo" > /etc/timezone
# dpkg-reconfigure --frontend noninteractive tzdata

Ubuntu 16.04では、このやり方は出来ませんでした。

# grep "VERSION=" /etc/os-release 
VERSION="16.04.1 LTS (Xenial Xerus)"
# cat /etc/timezone; file /etc/localtime 
Etc/UTC
/etc/localtime: symbolic link to /usr/share/zoneinfo/Etc/UTC
# echo "Asia/Tokyo" > /etc/timezone
# cat /etc/timezone; file /etc/localtime 
Asia/Tokyo
/etc/localtime: symbolic link to /usr/share/zoneinfo/Etc/UTC
# dpkg-reconfigure --frontend noninteractive tzdata

Current default time zone: 'Etc/UTC'
Local time is now:      Sun Sep  4 13:55:59 UTC 2016.
Universal Time is now:  Sun Sep  4 13:55:59 UTC 2016.

# cat /etc/timezone; file /etc/localtime 
Etc/UTC
/etc/localtime: symbolic link to /usr/share/zoneinfo/Etc/UTC
# 

以前は、/etc/timezoneに従って/etc/localtimeを返納してくれましたが/etc/localtimeの内容で/etc/timezoneが書き換えられてしまっているようです。 とりあえず、dpkg-reconfigure tzdataで手動で選択するしかないか...

timedatectlコマンドというので操作する見たいです。

# timedatectl set-timezone `timedatectl list-timezones | grep Tokyo`
# timedatectl 
      Local time: Sun 2016-09-04 23:11:36 JST
  Universal time: Sun 2016-09-04 14:11:36 UTC
        RTC time: Fri 2016-08-12 04:15:46
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: no
 RTC in local TZ: no
#

zabbixのカスタムLLD

ドキュメントに作り方が書いてあります 。

カスタムLLDで必要なJSONファイルを作成する汎用の処理をpythonで作成します。

シェルで取得した下記の形式のファイルを入力にします。

{#NAME1} {#NAME2}   
name11 name12
name21 name22

ファイルからJSON形式に変換します。

>>> [json.dumps(l) for l in csv.DictReader(open('data.txt'), delimiter=' ')]
['{"{#NAME2}": "name12", "{#NAME1}": "name11"}', '{"{#NAME2}": "name22", "{#NAME1}": "name21"}']
>>> 

カスタムLLDの辞書形式にします。

>>> { 'data': r }
{'data': ['{"{#NAME2}": "name12", "{#NAME1}": "name11"}', '{"{#NAME2}": "name22", "{#NAME1}": "name21"}']}
>>> 

2行で書けるpython素晴らしい!

Selenium2をpythonで使う

Selenium2をpythonで使ってみました。

テストシナリオの作成

FirefoxSelenium IDEを使って操作をキャプチャします。 yahooで"test"を検索して画像検索に切替えるというシンプルな操作をキャプチャします。

f:id:ksaito11:20160724204351p:plain

エクスポートでpythonを出力します。

f:id:ksaito11:20160724204528p:plain

こんな感じでpythonのunittestのソースが出力されます。

PS C:\Users\Administrator\Documents\python> head sele.py
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Sele(unittest.TestCase):
PS C:\Users\Administrator\Documents\python>

テストケースの実行

出力されたファイルを実行するとfirefoxが起動してシナリオを実行します。

PS C:\Users\Administrator\Documents\python> python sele.py
.
----------------------------------------------------------------------
Ran 1 test in 12.437s

OK
PS C:\Users\Administrator\Documents\python> 

インタプリタでの実行

インタプリタで実行します。

TestSuiteにして、2回実行してみます。

PS C:\Users\Administrator\Documents\python>> python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on wi
Type "help", "copyright", "credits" or "license" for more information.
>>> import unittest
>>> import sele
>>> suite = unittest.TestLoader().loadTestsFromTestCase(sele.Sele)
>>> s2 = unittest.TestSuite([suite,suite])
>>> unittest.TextTestRunner(verbosity=1).run(s2)
..
----------------------------------------------------------------------
Ran 2 tests in 30.282s

OK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
>>>

awsのWindowsインストールメディア

なかなかたどり着けないawsWindowsインストールメディアのリンクです。 使用するリージョンによってスナップショットのIDが異なります。

Configuring Windows Components on Amazon EC2 : Articles & Tutorials : Amazon Web Services

ansibleでwinrmセットアップ済みのec2インスタンスを作成する。

ansibleでwinrmセットアップ済みのec2インスタンスを作成しました。

ansibleのec2モジュールを使ってWindows 2012R2のAMIを作成します。

インスタンス作成時に実行されるスクリプトをuser_dataに設定しておくことでwinrmが利用可能なec2インスタンスが作成されます。

playbookは以下の通りで、user_dataは、こちらを使わせて頂きました。

---
- name: Create an Windows instance with winrm on Amazon EC2
  hosts: localhost
  vars:
    ec2_ami_id: ami-e0e00f8d
    ec2_region: us-east-1
    ec2_instance_type: t2.micro
    ec2_key_name: mykey
    ec2_subnet_id: subnet-3beddb4d
  tasks:
    - name: Create a new keypair
      ec2_key: name="{{ec2_key_name}}" region="{{ec2_region}}"
      register: keypair
    - name: Write the key to a file
      copy:
        dest: files/mykey.pem
        content: "{{keypair.key.private_key}}"
        mode: 0600
      when: keypair.changed

    - name: start windows instance
      ec2:
        image: "{{ec2_ami_id}}"
        region: "{{ec2_region}}"
        instance_type: "{{ec2_instance_type}}"
        key_name: "{{ec2_key_name}}"
        group: [rdswinrm]
        exact_count: 1
        count_tag: { Name: winrm }
        vpc_subnet_id: "{{ec2_subnet_id}}"
        assign_public_ip: yes
        instance_tags:
          Name: ansible
          env: develop
        wait: true
        user_data: "<powershell>
  Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force\n
  $storageDir = $pwd\n
  $webclient = New-Object System.Net.WebClient\n
  $url = \"https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1\"\n
  $file = \"C:\\Program Files\\Amazon\\Ec2ConfigService\\Scripts\\ConfigureRemotingForAnsible.ps1\"\n
  $webclient.DownloadFile($url,$file)\n
  $VerbosePreference=\"Continue\"\n
  & $file\n
</powershell>"

botoインストールやAWSの接続情報の設定は、省略します。 これで、しばらくするとインスタンス作成が完了します。

$ ansible-playbook ec2-winrm.yml

PLAY [Create an Windows instance with winrm on Amazon EC2] *********************

TASK [Create a new keypair] ****************************************************
ok: [localhost]

TASK [Write the key to a file] *************************************************
skipping: [localhost]

TASK [start windows instance] **************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0   

$ 

インベントリは、以下の通りです。 awsコンソールで確認した情報を追加すれば複数台のサーバを一括管理できます。

$ cat inventory/hosts-win 
[windows]
winrm1  ansible_ssh_host=<IP or サーバ名> ansible_password=<パスワード>
winrm2  ansible_ssh_host=<IP or サーバ名> ansible_password=<パスワード>

[windows:vars]
ansible_user=Administrator
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

接続を確認します。

$ ansible -i inventory/hosts-win windows -m win_ping

winrm2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
winrm1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
$ 

ansibleでwinrmに接続する。

ansibleでwinrmに接続を確認しました。

WIndows 2012R2側の準備

提供されているスクリプトでwinrmの設定をします。

PS C:\> mkdir work
    Directory: C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         5/25/2016   1:01 PM            work

PS C:\> cd work
PS C:\work>
PS C:\work> Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1
PS C:\work> dir

    Directory: C:\work

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         5/25/2016   1:01 PM       8582 ConfigureRemotingForAnsible.ps1

PS C:\work> powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1
Self-signed SSL certificate generated; thumbprint: CD15EA653B190875E4431C6C897019F77427F121


wxf                 : http://schemas.xmlsoap.org/ws/2004/09/transfer
a                   : http://schemas.xmlsoap.org/ws/2004/08/addressing
w                   : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
lang                : en-US
Address             : http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters : ReferenceParameters

Ok.

PS C:\work> Get-NetConnectionProfile -IPv4Connectivity Internet

Name             : Network  2
InterfaceAlias   : Ethernet
InterfaceIndex   : 12
NetworkCategory  : Public
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

PS C:\work>

ansible側の準備

pywinrmをインストールする。

$ sudo pip install pywinrm

インベントリを準備して普通に繋がりました。

$ cat ec2-hosts 
[windows]
ec2-54-19-62-137.ap-northeast-1.compute.amazonaws.com

[windows:vars]
ansible_ssh_user=Administrator
ansible_ssh_pass=パスワード
ansible_ssh_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
$ make win-test
ansible -i ec2-hosts windows -m setup
ec2-54-19-62-137.ap-northeast-1.compute.amazonaws.com | SUCCESS => {
    "ansible_facts": {
        "ansible_architecture": "64-bit", 
        "ansible_date_time": {
            "date": "5/25/2016", 
            "day": "25", 
            "hour": "13", 
            "iso8601": "2016-05-25T13:19:13", 
            "minute": "19", 
            "month": "05", 
            "year": "2016"
        }, 
        "ansible_distribution": "Microsoft Windows NT 6.3.9600.0", 
        "ansible_distribution_version": "6.3.9600.0", 
        "ansible_fqdn": "WIN-RITVMDQU2RI", 
        "ansible_hostname": "WIN-RITVMDQU2RI", 
        "ansible_interfaces": [
            {
                "default_gateway": "72.131.216.1", 
                "dns_domain": "ap-northeast-1.compute.internal", 
                "interface_index": 12, 
                "interface_name": "AWS PV Network Device #0"
            }
        ], 
        "ansible_ip_addresses": [
            "72.131.216.28", 
        ], 
        "ansible_lastboot": "2016-05-25 12:32:33Z", 
        "ansible_os_family": "Windows", 
        "ansible_os_name": "Microsoft Windows Server 2012 R2 Standard", 
        "ansible_powershell_version": 4, 
        "ansible_system": "Win32NT", 
        "ansible_totalmem": 1073332224, 
        "ansible_uptime_seconds": 2800, 
        "ansible_winrm_certificate_expires": "2017-05-25 13:13:12"
    }, 
    "changed": false
}
$

ネットワークをprivateにして検証

NetworkCategoryをPrivateに設定しても問題なく動く。(結果省略)

PS C:\work> Set-NetConnectionProfile -InterfaceAlias (Get-NetConnectionProfile -IPv4Connectivity Internet).InterfaceAlias -NetworkCategory Private
PS C:\work> Get-NetConnectionProfile -IPv4Connectivity Internet

Name             : Network  2
InterfaceAlias   : Ethernet
InterfaceIndex   : 12
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

PS C:\work>

sshのport forwarding

vagrantで必要なポートをマッピングすると設定が増えていってしまうので、一時利用する場合には、sshポートフォワードで済ませると楽です。

確認

sshでの接続先を確認します。 vagrant ssh-configで必要な情報を確認できます。

$ vagrant ssh-config vagrant1
Host vagrant1
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "~/.vagrant.d/insecure_private_key"
  IdentitiesOnly yes
  LogLevel FATAL
$

ポートフォワード

ローカルマシンの8080からvagrant1の3142ポートにアクセスする場合には、下記のコマンドを実行したあとブラウザでhttp://localhost:8080にアクセスします。

$ ssh -i ~/.vagrant.d/insecure_private_key -p 2222 vagrant@localhost -L 8080:localhost:3142

-fオプションと-Nオプションでバックグラウンドでポートフォワードしてくれます。