Operations Lab.

Posts Tagged ‘PowerShell 5.0

PowerShell DSC と Linux

leave a comment »

この記事は、PowerShell Advent Calendar 2016 の 23 日目です。

前回(14 日目の記事)では Azure Automation DSC で Windows Server を管理する方法についてまとめましたが、今回は Linux 編です。

DSC による Linux の管理

PowerShell DSC は Linux にも対応しています。(Linux でも使えます。)正確には、Linux 向けの DSC エージェント及び DSC リソースの開発が進められており、GitHub 上でコード(及びバイナリ)が公開されています。

絶賛開発中ですので Windows と比較すると様々な制約がありますが、試しに使ってみる、といったレベルであれば十分利用できます。(バグを見つけたらフィードバックしましょう!)

2016/12/23 時点で対応しているディストリビューションは以下の通りです。(最新の対応状況は GitHub のプロジェクトページを参照。)

  • CentOS 5, 6, and 7 (x86/x64)
  • Debian GNU/Linux 6, 7 and 8 (x86/x64)
  • Oracle Linux 5, 6 and 7 (x86/x64)
  • Red Hat Enterprise Linux Server 5, 6 and 7 (x86/x64)
  • SUSE Linux Enterprise Server 10, 11 and 12 (x86/x64)
  • Ubuntu Server 12.04 LTS, 14.04 LTS, 16.04 LTS (x86/x64)

対応ディストリビューションについては、rpm 又は deb パッケージが公開されていますので、それをダウンロードしてインストールすれば利用できます。対応していないディストリビューションの場合は、コードを自力でコンパイルしてインストールする必要があります。

DSC for Linux の前提条件

DSC for Linux を利用するためには、いくつかのパッケージ(ソフトウェア)が必要です。こちらも GitHub 上に記載があります。

  • glibc 2.4 以上
  • openssl 0.9.8 又は 1.0.x
  • libcurl 7.15.1 以上
  • python 2.4 – 3.4
  • python-ctypes (python のバージョンに対応したバージョン)
  • omi 1.0.8-4

OpenSSL については、Requirements に 1.0 としか記載されていませんが、試したところ 1.0 系であれば(1.0.0 でなくとも)動作するようです。Python については新しすぎると正常に動作しない場合があります(ありました)ので、記載されているバージョンの範囲内とした方が無難です。

omi (Open Management Infrastructure)DMTF (Distributed Management Task Force)の標準である CIM (Common Information Model)及び WBEM (Web-Based Enterprise Management)を Microsoft が Linux 向けに実装したものになります。ちなみに、CIM/WBEM の Windows 向け実装が WMI (Windows Management Instrumentation)です。

PowerShell DSC for Linux では CIM を利用しているため、omi が必要となります。

DSC for Linux のインストール

ここでは、Azure 上の Linux (CentOS 7.2)VM 上で DSC を使用して httpd を構成してみます。仮想マシンのデプロイは実施済みとします。

dsclinux-161223-01dsclinux-161223-02

Linux 仮想マシンへ SSH でログインします。何はともあれ、まずはパッケージをアップデートしておきます。

[admin01@centos72 ~]$ sudo yum update -y
[sudo] password for admin01:
Loaded plugins: fastestmirror, langpacks
base                                                     | 3.6 kB     00:00
extras                                                   | 3.4 kB     00:00
openlogic                                                | 1.3 kB     00:00
updates                                                  | 3.4 kB     00:00
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
(略)

Installed:
  kernel.x86_64 0:3.10.0-514.2.2.el7     python2-pyasn1.noarch 0:0.1.9-7.el7

Dependency Installed:
  GeoIP.x86_64 0:1.5.0-11.el7
  firewalld-filesystem.noarch 0:0.4.3.2-8.el7
  ipset.x86_64 0:6.19-6.el7
  ipset-libs.x86_64 0:6.19-6.el7
  libstoragemgmt-python-clibs.x86_64 0:1.3.4-1.el7
  python-firewall.noarch 0:0.4.3.2-8.el7

Updated:
  NetworkManager.x86_64 1:1.4.0-13.el7_3
  NetworkManager-libnm.x86_64 1:1.4.0-13.el7_3
  NetworkManager-team.x86_64 1:1.4.0-13.el7_3
  NetworkManager-tui.x86_64 1:1.4.0-13.el7_3
  WALinuxAgent.noarch 0:2.2.2-1.el7.centos
  abrt.x86_64 0:2.1.11-45.el7.centos
  abrt-addon-ccpp.x86_64 0:2.1.11-45.el7.centos
  abrt-addon-kerneloops.x86_64 0:2.1.11-45.el7.centos
  abrt-addon-pstoreoops.x86_64 0:2.1.11-45.el7.centos
  abrt-addon-python.x86_64 0:2.1.11-45.el7.centos
  abrt-addon-vmcore.x86_64 0:2.1.11-45.el7.centos
  abrt-addon-xorg.x86_64 0:2.1.11-45.el7.centos
  abrt-cli.x86_64 0:2.1.11-45.el7.centos
  abrt-console-notification.x86_64 0:2.1.11-45.el7.centos
  abrt-dbus.x86_64 0:2.1.11-45.el7.centos
  abrt-libs.x86_64 0:2.1.11-45.el7.centos
  abrt-python.x86_64 0:2.1.11-45.el7.centos
  abrt-retrace-client.x86_64 0:2.1.11-45.el7.centos
  abrt-tui.x86_64 0:2.1.11-45.el7.centos
  alsa-lib.x86_64 0:1.1.1-1.el7
  alsa-tools-firmware.x86_64 0:1.1.0-1.el7
  at.x86_64 0:3.1.13-22.el7
  authconfig.x86_64 0:6.2.8-14.el7
  avahi-autoipd.x86_64 0:0.6.31-17.el7
  avahi-libs.x86_64 0:0.6.31-17.el7
  bash.x86_64 0:4.2.46-21.el7_3
  bind-libs.x86_64 32:9.9.4-38.el7_3
  bind-libs-lite.x86_64 32:9.9.4-38.el7_3
  bind-license.noarch 32:9.9.4-38.el7_3
  bind-utils.x86_64 32:9.9.4-38.el7_3
  binutils.x86_64 0:2.25.1-22.base.el7
  biosdevname.x86_64 0:0.7.2-1.el7
  blktrace.x86_64 0:1.0.5-8.el7
  boost-system.x86_64 0:1.53.0-26.el7
  boost-thread.x86_64 0:1.53.0-26.el7
  btrfs-progs.x86_64 0:4.4.1-1.el7
  ca-certificates.noarch 0:2015.2.6-73.el7
  centos-release.x86_64 0:7-3.1611.el7.centos
  chkconfig.x86_64 0:1.7.2-1.el7
  chrony.x86_64 0:2.1.1-4.el7.centos
  cifs-utils.x86_64 0:6.2-9.el7
  coreutils.x86_64 0:8.22-18.el7
  crda.x86_64 0:3.13_2016.02.08-1.el7
  cryptsetup.x86_64 0:1.7.2-1.el7
  cryptsetup-libs.x86_64 0:1.7.2-1.el7
  cups-libs.x86_64 1:1.6.3-26.el7
  curl.x86_64 0:7.29.0-35.el7.centos
  dbus.x86_64 1:1.6.12-17.el7
  dbus-libs.x86_64 1:1.6.12-17.el7
  device-mapper.x86_64 7:1.02.135-1.el7_3.1
  device-mapper-event.x86_64 7:1.02.135-1.el7_3.1
  device-mapper-event-libs.x86_64 7:1.02.135-1.el7_3.1
  device-mapper-libs.x86_64 7:1.02.135-1.el7_3.1
  device-mapper-persistent-data.x86_64 0:0.6.3-1.el7
  dhclient.x86_64 12:4.2.5-47.el7.centos
  dhcp-common.x86_64 12:4.2.5-47.el7.centos
  dhcp-libs.x86_64 12:4.2.5-47.el7.centos
  dmidecode.x86_64 1:3.0-2.el7
  dmraid.x86_64 0:1.0.0.rc16-28.el7
  dmraid-events.x86_64 0:1.0.0.rc16-28.el7
  dnsmasq.x86_64 0:2.66-21.el7
  dracut.x86_64 0:033-463.el7
  dracut-network.x86_64 0:033-463.el7
  e2fsprogs.x86_64 0:1.42.9-9.el7
  e2fsprogs-libs.x86_64 0:1.42.9-9.el7
  ebtables.x86_64 0:2.0.10-15.el7
  elfutils.x86_64 0:0.166-2.el7
  elfutils-libelf.x86_64 0:0.166-2.el7
  elfutils-libs.x86_64 0:0.166-2.el7
  ethtool.x86_64 2:4.5-3.el7
  expat.x86_64 0:2.1.0-10.el7_3
  file.x86_64 0:5.11-33.el7
  file-libs.x86_64 0:5.11-33.el7
  filesystem.x86_64 0:3.2-21.el7
  firewalld.noarch 0:0.4.3.2-8.el7
  freetype.x86_64 0:2.4.11-12.el7
  gdb.x86_64 0:7.6.1-94.el7
  glib2.x86_64 0:2.46.2-4.el7
  glibc.x86_64 0:2.17-157.el7_3.1
  glibc-common.x86_64 0:2.17-157.el7_3.1
  gnupg2.x86_64 0:2.0.22-4.el7
  gnutls.x86_64 0:3.3.24-1.el7
  grub2.x86_64 1:2.02-0.44.el7.centos
  grub2-tools.x86_64 1:2.02-0.44.el7.centos
  grubby.x86_64 0:8.28-18.el7
  hunspell.x86_64 0:1.3.2-15.el7
  hwdata.x86_64 0:0.252-8.4.el7
  hyperv-daemons-license.noarch 0:0-0.29.20160216git.el7
  hypervkvpd.x86_64 0:0-0.29.20160216git.el7
  initscripts.x86_64 0:9.49.37-1.el7
  iproute.x86_64 0:3.10.0-74.el7
  iprutils.x86_64 0:2.4.13.1-1.el7
  iptables.x86_64 0:1.4.21-17.el7
  iputils.x86_64 0:20160308-8.el7
  irqbalance.x86_64 3:1.0.7-6.el7
  iw.x86_64 0:4.3-1.el7
  iwl100-firmware.noarch 0:39.31.5.1-49.el7
  iwl1000-firmware.noarch 1:39.31.5.1-49.el7
  iwl105-firmware.noarch 0:18.168.6.1-49.el7
  iwl135-firmware.noarch 0:18.168.6.1-49.el7
  iwl2000-firmware.noarch 0:18.168.6.1-49.el7
  iwl2030-firmware.noarch 0:18.168.6.1-49.el7
  iwl3160-firmware.noarch 0:22.0.7.0-49.el7
  iwl3945-firmware.noarch 0:15.32.2.9-49.el7
  iwl4965-firmware.noarch 0:228.61.2.24-49.el7
  iwl5000-firmware.noarch 0:8.83.5.1_1-49.el7
  iwl5150-firmware.noarch 0:8.24.2.2-49.el7
  iwl6000-firmware.noarch 0:9.221.4.1-49.el7
  iwl6000g2a-firmware.noarch 0:17.168.5.3-49.el7
  iwl6000g2b-firmware.noarch 0:17.168.5.2-49.el7
  iwl6050-firmware.noarch 0:41.28.5.1-49.el7
  iwl7260-firmware.noarch 0:22.0.7.0-49.el7
  iwl7265-firmware.noarch 0:22.0.7.0-49.el7
  kbd.x86_64 0:1.15.5-12.el7
  kbd-legacy.noarch 0:1.15.5-12.el7
  kbd-misc.noarch 0:1.15.5-12.el7
  kernel-tools.x86_64 0:3.10.0-514.2.2.el7
  kernel-tools-libs.x86_64 0:3.10.0-514.2.2.el7
  kexec-tools.x86_64 0:2.0.7-50.el7
  kmod.x86_64 0:20-9.el7
  kmod-libs.x86_64 0:20-9.el7
  kpartx.x86_64 0:0.4.9-99.el7
  kpatch.noarch 0:0.3.2-1.el7
  krb5-libs.x86_64 0:1.14.1-27.el7_3
  libX11.x86_64 0:1.6.3-3.el7
  libX11-common.noarch 0:1.6.3-3.el7
  libblkid.x86_64 0:2.23.2-33.el7
  libcom_err.x86_64 0:1.42.9-9.el7
  libcurl.x86_64 0:7.29.0-35.el7.centos
  libdrm.x86_64 0:2.4.67-3.el7
  libffi.x86_64 0:3.0.13-18.el7
  libfprint.x86_64 0:0.5.0-4.el7
  libgcc.x86_64 0:4.8.5-11.el7
  libgcrypt.x86_64 0:1.5.3-13.el7_3.1
  libgomp.x86_64 0:4.8.5-11.el7
  libldb.x86_64 0:1.1.26-1.el7
  libmount.x86_64 0:2.23.2-33.el7
  libndp.x86_64 0:1.2-7.el7
  libnl3.x86_64 0:3.2.28-2.el7
  libnl3-cli.x86_64 0:3.2.28-2.el7
  libproxy.x86_64 0:0.4.11-10.el7
  libreport.x86_64 0:2.1.11-35.el7.centos
  libreport-centos.x86_64 0:2.1.11-35.el7.centos
  libreport-cli.x86_64 0:2.1.11-35.el7.centos
  libreport-filesystem.x86_64 0:2.1.11-35.el7.centos
  libreport-plugin-mailx.x86_64 0:2.1.11-35.el7.centos
  libreport-plugin-mantisbt.x86_64 0:2.1.11-35.el7.centos
  libreport-plugin-rhtsupport.x86_64 0:2.1.11-35.el7.centos
  libreport-plugin-ureport.x86_64 0:2.1.11-35.el7.centos
  libreport-python.x86_64 0:2.1.11-35.el7.centos
  libreport-web.x86_64 0:2.1.11-35.el7.centos
  libsoup.x86_64 0:2.48.1-6.el7
  libss.x86_64 0:1.42.9-9.el7
  libsss_idmap.x86_64 0:1.14.0-43.el7_3.4
  libsss_nss_idmap.x86_64 0:1.14.0-43.el7_3.4
  libstdc++.x86_64 0:4.8.5-11.el7
  libstoragemgmt.x86_64 0:1.3.4-1.el7
  libstoragemgmt-python.noarch 0:1.3.4-1.el7
  libtalloc.x86_64 0:2.1.6-1.el7
  libtasn1.x86_64 0:3.8-3.el7
  libteam.x86_64 0:1.25-4.el7
  libtevent.x86_64 0:0.9.28-1.el7
  libtirpc.x86_64 0:0.2.4-0.8.el7
  libusbx.x86_64 0:1.0.20-1.el7
  libuuid.x86_64 0:2.23.2-33.el7
  libwbclient.x86_64 0:4.4.4-9.el7
  linux-firmware.noarch 0:20160830-49.git7534e19.el7
  lm_sensors-libs.x86_64 0:3.4.0-4.20160601gitf9185e5.el7
  logrotate.x86_64 0:3.8.6-12.el7
  lsscsi.x86_64 0:0.27-4.el7
  lua.x86_64 0:5.1.4-15.el7
  lvm2.x86_64 7:2.02.166-1.el7_3.1
  lvm2-libs.x86_64 7:2.02.166-1.el7_3.1
  make.x86_64 1:3.82-23.el7
  man-pages-overrides.x86_64 0:7.3.2-2.el7
  mariadb-libs.x86_64 1:5.5.52-1.el7
  mdadm.x86_64 0:3.4-14.el7
  microcode_ctl.x86_64 2:2.1-16.el7
  mlocate.x86_64 0:0.26-6.el7
  mozjs17.x86_64 0:17.0.0-19.el7
  nettle.x86_64 0:2.7.1-8.el7
  nss.x86_64 0:3.21.3-2.el7_3
  nss-softokn.x86_64 0:3.16.2.3-14.4.el7
  nss-softokn-freebl.x86_64 0:3.16.2.3-14.4.el7
  nss-sysinit.x86_64 0:3.21.3-2.el7_3
  nss-tools.x86_64 0:3.21.3-2.el7_3
  nss-util.x86_64 0:3.21.3-1.1.el7_3
  ntpdate.x86_64 0:4.2.6p5-25.el7.centos
  ntsysv.x86_64 0:1.7.2-1.el7
  openldap.x86_64 0:2.4.40-13.el7
  openssh.x86_64 0:6.6.1p1-31.el7
  openssh-clients.x86_64 0:6.6.1p1-31.el7
  openssh-server.x86_64 0:6.6.1p1-31.el7
  openssl.x86_64 1:1.0.1e-60.el7
  openssl-libs.x86_64 1:1.0.1e-60.el7
  os-prober.x86_64 0:1.58-9.el7
  pam.x86_64 0:1.1.8-18.el7
  parted.x86_64 0:3.1-28.el7
  pciutils.x86_64 0:3.5.1-1.el7
  pciutils-libs.x86_64 0:3.5.1-1.el7
  perl.x86_64 4:5.16.3-291.el7
  perl-Pod-Escapes.noarch 1:1.04-291.el7
  perl-Socket.x86_64 0:2.010-4.el7
  perl-libs.x86_64 4:5.16.3-291.el7
  perl-macros.x86_64 4:5.16.3-291.el7
  pinentry.x86_64 0:0.8.1-17.el7
  plymouth.x86_64 0:0.8.9-0.26.20140113.el7.centos
  plymouth-core-libs.x86_64 0:0.8.9-0.26.20140113.el7.centos
  plymouth-scripts.x86_64 0:0.8.9-0.26.20140113.el7.centos
  polkit.x86_64 0:0.112-9.el7
  procps-ng.x86_64 0:3.3.10-10.el7
  psacct.x86_64 0:6.6.1-11.el7
  pytalloc.x86_64 0:2.1.6-1.el7
  python.x86_64 0:2.7.5-48.el7
  python-libs.x86_64 0:2.7.5-48.el7
  python-perf.x86_64 0:3.10.0-514.2.2.el7
  python-pycurl.x86_64 0:7.19.0-19.el7
  python-urlgrabber.noarch 0:3.10-8.el7
  quota.x86_64 1:4.01-14.el7
  quota-nls.noarch 1:4.01-14.el7
  rdma.noarch 0:7.3_4.7_rc2-5.el7
  rng-tools.x86_64 0:5-8.el7
  rpcbind.x86_64 0:0.2.0-38.el7
  rpm.x86_64 0:4.11.3-21.el7
  rpm-build-libs.x86_64 0:4.11.3-21.el7
  rpm-libs.x86_64 0:4.11.3-21.el7
  rpm-python.x86_64 0:4.11.3-21.el7
  rsyslog.x86_64 0:7.4.7-16.el7
  samba-client-libs.x86_64 0:4.4.4-9.el7
  samba-common.noarch 0:4.4.4-9.el7
  samba-common-libs.x86_64 0:4.4.4-9.el7
  samba-common-tools.x86_64 0:4.4.4-9.el7
  samba-libs.x86_64 0:4.4.4-9.el7
  satyr.x86_64 0:0.13-14.el7
  setup.noarch 0:2.8.71-7.el7
  sg3_utils-libs.x86_64 0:1.37-9.el7
  shadow-utils.x86_64 2:4.1.5.1-24.el7
  smartmontools.x86_64 1:6.2-7.el7
  sos.noarch 0:3.3-5.el7.centos
  sssd-client.x86_64 0:1.14.0-43.el7_3.4
  sudo.x86_64 0:1.8.6p7-21.el7_3
  sysstat.x86_64 0:10.1.5-11.el7
  systemtap-runtime.x86_64 0:3.0-7.el7
  tar.x86_64 2:1.26-31.el7
  tcsh.x86_64 0:6.18.01-13.el7
  teamd.x86_64 0:1.25-4.el7
  traceroute.x86_64 3:2.0.22-2.el7
  tuned.noarch 0:2.7.1-3.el7_3.1
  tzdata.noarch 0:2016j-1.el7
  unzip.x86_64 0:6.0-16.el7
  usb_modeswitch.x86_64 0:2.4.0-5.el7
  usb_modeswitch-data.noarch 0:20160612-2.el7
  util-linux.x86_64 0:2.23.2-33.el7
  vim-common.x86_64 2:7.4.160-1.el7_3.1
  vim-enhanced.x86_64 2:7.4.160-1.el7_3.1
  vim-filesystem.x86_64 2:7.4.160-1.el7_3.1
  vim-minimal.x86_64 2:7.4.160-1.el7_3.1
  virt-what.x86_64 0:1.13-8.el7
  wget.x86_64 0:1.14-13.el7
  wpa_supplicant.x86_64 1:2.0-20.el7
  xdg-utils.noarch 0:1.1.0-0.17.20120809git.el7
  xfsprogs.x86_64 0:4.5.0-8.el7
  xz.x86_64 0:5.2.2-1.el7
  xz-libs.x86_64 0:5.2.2-1.el7
  yum.noarch 0:3.4.3-150.el7.centos
  yum-langpacks.noarch 0:0.4.2-7.el7
  yum-plugin-fastestmirror.noarch 0:1.1.31-40.el7
  yum-utils.noarch 0:1.1.31-40.el7
  zip.x86_64 0:3.0-11.el7
  zlib.x86_64 0:1.2.7-17.el7

Replaced:
  python-pyasn1.noarch 0:0.1.6-2.el7

Complete!
[admin01@centos72 ~]$

kernel が Update されたので、念のため再起動しておきます。

[admin01@centos72 ~]$ sudo shutdown -r now
[sudo] password for admin01:

omi と dsc のパッケージを wget でダウンロードしてインストールします。CentOS 7 の場合は、以下の rpm を使用します。

[admin01@centos72 ~]$ uptime
 12:01:41 up 3 min,  1 user,  load average: 0.09, 0.21, 0.11
[admin01@centos72 ~]$ wget https://github.com/Microsoft/omi/releases/download/v1.1.0-0/omi-1.1.0.ssl_100.x64.rpm
--2016-12-23 12:03:05--  https://github.com/Microsoft/omi/releases/download/v1.1.0-0/omi-1.1.0.ssl_100.x64.rpm
Resolving github.com (github.com)... 192.30.253.112, 192.30.253.113
Connecting to github.com (github.com)|192.30.253.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-cloud.s3.amazonaws.com/releases/46681501/48043966-644a-11e6-9229-10d424e119a1.rpm?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20161223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20161223T120306Z&X-Amz-Expires=300&X-Amz-Signature=55d94084803fef29dd768ffe6582061fc480ac49f8ee741d6ade2902274bf1d7&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Domi-1.1.0.ssl_100.x64.rpm&response-content-type=application%2Foctet-stream [following]
--2016-12-23 12:03:06--  https://github-cloud.s3.amazonaws.com/releases/46681501/48043966-644a-11e6-9229-10d424e119a1.rpm?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20161223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20161223T120306Z&X-Amz-Expires=300&X-Amz-Signature=55d94084803fef29dd768ffe6582061fc480ac49f8ee741d6ade2902274bf1d7&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Domi-1.1.0.ssl_100.x64.rpm&response-content-type=application%2Foctet-stream
Resolving github-cloud.s3.amazonaws.com (github-cloud.s3.amazonaws.com)... 54.231.81.0
Connecting to github-cloud.s3.amazonaws.com (github-cloud.s3.amazonaws.com)|54.231.81.0|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6180206 (5.9M) [application/octet-stream]
Saving to: ‘omi-1.1.0.ssl_100.x64.rpm’

100%[======================================>] 6,180,206   2.32MB/s   in 2.5s

2016-12-23 12:03:10 (2.32 MB/s) - ‘omi-1.1.0.ssl_100.x64.rpm’ saved [6180206/6180206]

[admin01@centos72 ~]$ wget https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases/download/v1.1.1-294/dsc-1.1.1-294.ssl_100.x64.rpm
--2016-12-23 12:03:14--  https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases/download/v1.1.1-294/dsc-1.1.1-294.ssl_100.x64.rpm
Resolving github.com (github.com)... 192.30.253.113, 192.30.253.112
Connecting to github.com (github.com)|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-cloud.s3.amazonaws.com/releases/19926695/f3091de6-6f89-11e6-8a38-199f991e92e4.rpm?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20161223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20161223T120314Z&X-Amz-Expires=300&X-Amz-Signature=e5156607f9670240562225e3e55196451ef1aa490211dd58ce0a886e5fa2db0d&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Ddsc-1.1.1-294.ssl_100.x64.rpm&response-content-type=application%2Foctet-stream [following]
--2016-12-23 12:03:15--  https://github-cloud.s3.amazonaws.com/releases/19926695/f3091de6-6f89-11e6-8a38-199f991e92e4.rpm?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20161223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20161223T120314Z&X-Amz-Expires=300&X-Amz-Signature=e5156607f9670240562225e3e55196451ef1aa490211dd58ce0a886e5fa2db0d&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Ddsc-1.1.1-294.ssl_100.x64.rpm&response-content-type=application%2Foctet-stream
Resolving github-cloud.s3.amazonaws.com (github-cloud.s3.amazonaws.com)... 54.231.40.171
Connecting to github-cloud.s3.amazonaws.com (github-cloud.s3.amazonaws.com)|54.231.40.171|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5807498 (5.5M) [application/octet-stream]
Saving to: ‘dsc-1.1.1-294.ssl_100.x64.rpm’

100%[======================================>] 5,807,498   2.31MB/s   in 2.4s

2016-12-23 12:03:18 (2.31 MB/s) - ‘dsc-1.1.1-294.ssl_100.x64.rpm’ saved [5807498/5807498]

[admin01@centos72 ~]$ sudo rpm -Uvh omi-1.1.0.ssl_100.x64.rpm dsc-1.1.1-294.ssl_100.x64.rpm
[sudo] password for admin01:
warning: omi-1.1.0.ssl_100.x64.rpm: Header V3 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Preparing...                          ################################# [100%]
Unconfiguring omid (systemd) service ...
Removed symlink /etc/systemd/system/multi-user.target.wants/omid.service.
Updating / installing...
   1:omi-1.1.0-0                      ################################# [ 33%]

************************************************************
* Warning: The certificate and keyfile were not generated  *
* since they already exist.                                *
************************************************************
omi already configured
Configuring OMI service ...
Created symlink from /etc/systemd/system/multi-user.target.wants/omid.service to /usr/lib/systemd/system/omid.service.
Checking for ctypes python module...ok!
   2:dsc-1.1.1-294                    ################################# [ 67%]
Installing resource MSFT_nxGroupResource
Installing resource MSFT_nxFileResource
Installing resource MSFT_nxUserResource
Installing resource MSFT_nxArchiveResource
Installing resource MSFT_nxServiceResource
Installing resource MSFT_nxScriptResource
Installing resource MSFT_nxFileLineResource
Installing resource MSFT_nxPackageResource
Installing resource MSFT_nxSshAuthorizedKeysResource
Installing resource MSFT_nxEnvironmentResource
Cleaning up / removing...
   3:omi-1.0.8-6                      ################################# [100%]
[admin01@centos72 ~]$

omid (OMI Server)が起動していることを確認します。

[admin01@centos72 ~]$ sudo systemctl status omid
● omid.service - OMI CIM Server
   Loaded: loaded (/usr/lib/systemd/system/omid.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2016-12-23 12:03:39 UTC; 1min 31s ago
  Process: 1774 ExecStop=/opt/omi/bin/omiserver -s (code=exited, status=0/SUCCESS)
  Process: 1806 ExecStart=/opt/omi/bin/omiserver -d (code=exited, status=0/SUCCESS)
  Process: 1776 ExecStartPre=/opt/omi/bin/support/installssllinks (code=exited, status=0/SUCCESS)
 Main PID: 1810 (omiserver)
   CGroup: /system.slice/omid.service
           mq1810 /opt/omi/bin/omiserver -d

Dec 23 12:03:39 centos72 systemd[1]: Starting OMI CIM Server...
Dec 23 12:03:39 centos72 systemd[1]: PID file /var/opt/omi/run/omiserver.pi...t.
Dec 23 12:03:39 centos72 systemd[1]: Started OMI CIM Server.
Hint: Some lines were ellipsized, use -l to show in full.
[admin01@centos72 ~]$

また、現時点で Apache (httpd) がインストールされていないことを確認しておきます。(この後、DSC から構成するため。)

[admin01@centos72 ~]$ sudo rpm -qa | grep httpd
[admin01@centos72 ~]$

最後に、root のパスワードを構成しておきます。(既に root のパスワードを付与している場合は、改めて設定する必要はありません。)今のところ、DSC for Linux では root を使用して CIM セッションを確立し構成を行います。Credential として root アカウントおよびパスワードを使用するため、root のパスワードが設定されている必要があります。

[admin01@centos72 ~]$ sudo passwd root
[sudo] password for admin01:
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[admin01@centos72 ~]$

Linux 向け Configuration の作成

Linux 向けの構成(Configuration)も基本的な構文は同じです。利用できる DSC リソースが Windows のものとは異なりますので、Linux 用の DSC リソースを使用します。

Windows ホスト上で Linux 向けの DSC Configuration を作成する場合や、Windows ホストから Linux に向けて Configuration を PUSH する場合(Windows 上でコンパイルする場合)、Windows で PULL サーバーを実装する場合は、nx モジュール(Linux 向けの DSC コアリソースが含まれるモジュール)をインストールする必要があります。

nx リソースは PowerShell Gallery で公開されていますので、Install-Module コマンドなどを使用してインストールできます。

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\admin01> Find-Module nx

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet
 provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\admin01\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by
running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install
and import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):

Version    Name                                Repository           Description
-------    ----                                ----------           -----------
1.0        nx                                  PSGallery            Module with DSC Resources for Linux

PS C:\Users\admin01> Install-Module nx

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
PS C:\Users\admin01> Get-Module nx -ListAvailable

    Directory: C:\Program Files\WindowsPowerShell\Modules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0        nx

PS C:\Users\admin01>

初めて Find-Module / Install-Module などを使用する場合は NuGet Provider のインストールが必要になりますので、表示に従ってインストールします。

nx モジュールをインストールすると、Linux 向けの DSC リソースを利用できるようになります。Linux 向けの DSC リソースは nx から始まるリソース名となっています。(今のところ)

PS C:\Users\admin01> Get-DscResource

ImplementedAs   Name                      ModuleName                     Version    Properties
-------------   ----                      ----------                     -------    ----------
Binary          File                                                                {DestinationPath, Attributes, Ch...
Binary          nxArchive                                                           {DestinationPath, SourcePath, Ch...
Binary          nxEnvironment                                                       {Name, DependsOn, Ensure, Path...}
Binary          nxFile                                                              {DestinationPath, Checksum, Cont...
Binary          nxFileLine                                                          {ContainsLine, FilePath, Depends...
Binary          nxGroup                                                             {GroupName, DependsOn, Ensure, M...
Binary          nxPackage                                                           {Name, Arguments, DependsOn, Ens...
Binary          nxScript                                                            {GetScript, SetScript, TestScrip...
Binary          nxService                                                           {Controller, Name, DependsOn, En...
Binary          nxSshAuthorizedKeys                                                 {KeyComment, DependsOn, Ensure, ...
Binary          nxUser                                                              {UserName, DependsOn, Descriptio...
Binary          SignatureValidation                                                 {SignedItemType, TrustedStorePath}
PowerShell      Archive                   PSDesiredStateConfiguration    1.1        {Destination, Path, Checksum, Cr...
PowerShell      Environment               PSDesiredStateConfiguration    1.1        {Name, DependsOn, Ensure, Path...}
PowerShell      Group                     PSDesiredStateConfiguration    1.1        {GroupName, Credential, DependsO...
Composite       GroupSet                  PSDesiredStateConfiguration    1.1        {DependsOn, PsDscRunAsCredential...
Binary          Log                       PSDesiredStateConfiguration    1.1        {Message, DependsOn, PsDscRunAsC...
PowerShell      Package                   PSDesiredStateConfiguration    1.1        {Name, Path, ProductId, Argument...
Composite       ProcessSet                PSDesiredStateConfiguration    1.1        {DependsOn, PsDscRunAsCredential...
PowerShell      Registry                  PSDesiredStateConfiguration    1.1        {Key, ValueName, DependsOn, Ensu...
PowerShell      Script                    PSDesiredStateConfiguration    1.1        {GetScript, SetScript, TestScrip...
PowerShell      Service                   PSDesiredStateConfiguration    1.1        {Name, BuiltInAccount, Credentia...
Composite       ServiceSet                PSDesiredStateConfiguration    1.1        {DependsOn, PsDscRunAsCredential...
PowerShell      User                      PSDesiredStateConfiguration    1.1        {UserName, DependsOn, Descriptio...
PowerShell      WaitForAll                PSDesiredStateConfiguration    1.1        {NodeName, ResourceName, Depends...
PowerShell      WaitForAny                PSDesiredStateConfiguration    1.1        {NodeName, ResourceName, Depends...
PowerShell      WaitForSome               PSDesiredStateConfiguration    1.1        {NodeCount, NodeName, ResourceNa...
PowerShell      WindowsFeature            PSDesiredStateConfiguration    1.1        {Name, Credential, DependsOn, En...
Composite       WindowsFeatureSet         PSDesiredStateConfiguration    1.1        {DependsOn, PsDscRunAsCredential...
PowerShell      WindowsOptionalFeature    PSDesiredStateConfiguration    1.1        {Name, DependsOn, Ensure, LogLev...
Composite       WindowsOptionalFeatureSet PSDesiredStateConfiguration    1.1        {DependsOn, PsDscRunAsCredential...
PowerShell      WindowsPackageCab         PSDesiredStateConfiguration    1.1        {Ensure, Name, SourcePath, Depen...
PowerShell      WindowsProcess            PSDesiredStateConfiguration    1.1        {Arguments, Path, Credential, De...


PS C:\Users\admin01>

この状態になれば、Windows ホスト上でも Linux 用の DSC Configuration を記述しコンパイル(MOF ファイルを生成)できるようになります。

以下のスクリプト(DSC Configuration)を記述して、ps1 ファイルとして保存します。

※パスワード及び SSH 公開鍵の値は適切なものに変更してください。

Configuration LinuxConfig {

    param (
        [parameter(mandatory)]
        [string[]]$Node
    )

    Import-DscResource -Module nx

    Node $Node {

        nxGroup TestGroup {
            GroupName = "testgrp"
            Ensure = "Present"
        }

        nxUser TestUser {
            UserName = "testuser"
            Ensure = "Present"
            Password  = '$6$fZAne/Qc$MZejMrOxDK0ogv9SLiBP5J5qZFBvXLnDu8HY1Oy7ycX.Y3C7mGPUfeQy3A82ev3zIabhDQnj2ayeuGn02CqE/0'
            HomeDirectory = "/home/testuser"
            Description = "test user"
            GroupID = "testgrp"
            DependsOn = "[nxGroup]TestGroup"
        }

        nxSshAuthorizedKeys ScugjSSHKey {
            UserName = "testuser"
            Key = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCX8+lLrYjJYYJv0XPIinEkuUpudcj2Z7TzFMxY+QEFfKXIOC8a2hOmA5kSOchYowDQjujVWOJv07cB9756ce2CJ9BGEmRKUq1ws0fUix9fTziN7n7f/I2UO6rOkUoZwcUdNVXeDdx0CR8IWxXrP1q490nLwFYfL/Tee6RVmn9DVPx6uS/ZAJkBqDcD189BpeKcps18y8tcYUaIe7ner7j30bj+6icqOgYLfHShc62L8DK6v8YDumLY76PhHGCkCZwl8SA4upuMEQJeROcOaSsIBMq4KU1Ljezgu54L4VCIyN71itw/wtIx+7gVagVjx0sGm4BxDWNoyM3ObpFaTSqx testuser@linux'
            Ensure = "Present"
            KeyComment = "SSH RSA for testuser"
            DependsOn = "[nxUser]TestUser"
        }

        nxPackage Apache2 {
            Name = "httpd"
            Ensure = "Present"
            PackageManager = "yum"
        }

        nxService Apache2Service {
            Name = "httpd"
            State = "running"
            Enabled = $true
            Controller = "systemd"
            DependsOn = "[nxPackage]Apache2"
        }

        nxFile TestFile {
            Type = "File"
            Ensure = "Present"
            DestinationPath = "/var/www/html/welcome.html"
            Contents = "<h1>Merry Christmas!!</h1>"
            DependsOn = "[nxPackage]Apache2"
        }

    }

}

Configuration の PUSH による Linux の構成

Linux ターゲットに対しても Windows と同様、Pull と Push 両方の展開方法を利用できます。Pull を使用する場合は、Windows の場合と同様、Pull サーバーの場所などを LCM (ローカル構成マネージャー、Linux の場合は Linux DSC エージェント)へ設定しておく必要があります。

ここでは Windows ホストから構成を Push してみます。前述の通り、Windows ホストから Linux 向けの Configuration をコンパイルして Push する場合は、nx モジュールを事前にインストールしておく必要があります。

※Linux ホストと同じ仮想ネットワークにデプロイされている Windows ホストから Push します。異なるネットワークから構成を Push する場合は、CIM セッションを確立できるよう FW など(Azure の場合は NSG など)の構成が必要となる場合があります。

まずは、作成した Configuration を PowerShell 上でロードしておきます。その後、MOF ファイルを生成します。

PS C:\Windows\system32> $Node = "centos72"
PS C:\Windows\system32> LinuxConfig -Node $Node -OutputPath $env:TEMP

    Directory: C:\Users\admin01\AppData\Local\Temp

Mode                LastWriteTime         Length Name                                                                                                                                                                                                            
----                -------------         ------ ----                                                                                                                                                                                                            
-a----       12/23/2016  12:34 PM           6590 centos72.mof                                                                                                                                                                                                    

PS C:\Windows\system32> 

ターゲットとなる Linux ホストへ接続性があることを確認しておきます。

PS C:\Windows\system32> Test-Connection $Node

Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
TESTVM01      centos72        10.0.0.5                                                  32       3        
TESTVM01      centos72        10.0.0.5                                                  32       0        
TESTVM01      centos72        10.0.0.5                                                  32       2        
TESTVM01      centos72        10.0.0.5                                                  32       8        

PS C:\Windows\system32>

接続に使用する Credential の情報を入力します。root アカウントのパスワードを入力します。また、接続は SSL により保護されますが、SSL で使用される証明書がデフォルトでは自己署名証明書となっているため、証明書のチェックなどをスキップするよう接続オプションを構成します。(本番環境では、外部又は社内の認証局から発行された証明書を使用したほうが良いでしょう。)

PS C:\Windows\system32> $cred = Get-Credential -UserName "root" -Message "Enter password."
PS C:\Windows\system32> $opt = New-CimSessionOption -UseSsl:$true -SkipCACheck:$true -SkipCNCheck:$true -SkipRevocationCheck:$true
PS C:\Windows\system32> $s = New-CimSession -ComputerName $Node -Credential $cred -Port:5986 -Authentication Basic -SessionOption:$opt -OperationTimeoutSec:90
PS C:\Windows\system32> Get-CimSession

Id           : 1
Name         : CimSession1
InstanceId   : e37e1c4a-1162-43b5-908f-367ffd3384d9
ComputerName : centos72
Protocol     : WSMAN

PS C:\Windows\system32>

CIM セッションを確立できたら、DSC Configuration を PUSH します。

PS C:\Windows\system32> Start-DscConfiguration -Path $env:TEMP -CimSession $s -Wait -Verbose -Force
VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Time taken for configuration job to complete is 15.693 seconds

PS C:\Windows\system32> 

Windows と異なり、Linux の場合は各リソースの構成状況が表示されません。(現時点では。)何かエラーが発生した場合は、エラーが表示されます。

構成が正常に完了した場合、httpd がインストールされ、welcome.html が配置されているはずです。

[admin01@centos72 ~]$ sudo rpm -qa | grep httpd
[sudo] password for admin01:
httpd-tools-2.4.6-45.el7.centos.x86_64
httpd-2.4.6-45.el7.centos.x86_64
[admin01@centos72 ~]$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2016-12-23 12:44:00 UTC; 9min ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 4589 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           tq4589 /usr/sbin/httpd -DFOREGROUND
           tq4590 /usr/sbin/httpd -DFOREGROUND
           tq4591 /usr/sbin/httpd -DFOREGROUND
           tq4592 /usr/sbin/httpd -DFOREGROUND
           tq4593 /usr/sbin/httpd -DFOREGROUND
           mq4594 /usr/sbin/httpd -DFOREGROUND

Dec 23 12:44:00 centos72 systemd[1]: Starting The Apache HTTP Server...
Dec 23 12:44:00 centos72 httpd[4589]: AH00558: httpd: Could not reliably de...ge
Dec 23 12:44:00 centos72 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[admin01@centos72 ~]$ ls -lha /var/www/html/welcome.html
-rw-r--r--. 1 root root 26 Dec 23 12:44 /var/www/html/welcome.html
[admin01@centos72 ~]$ cat /var/www/html/welcome.html
<h1>Merry Christmas!!</h1>[admin01@centos72 ~]$

ブラウザでアクセスすると、配置したページを表示できます。

dsclinux-161223-03dsclinux-161223-04

また、テストユーザーも生成できています。

[admin01@centos72 ~]$ id testuser
uid=1001(testuser) gid=1001(testgrp) groups=1001(testgrp)
[admin01@centos72 ~]$

まとめ

Linux でも DSC を用いて構成を行うことができます。まだまだ DSC リソースが充実していないため、できることが限られている印象はありますが、PowerShell for Linux の開発と併せて DSC リソースも充実していくことを期待です。

GitHub 上で開発が進められているため、フィードバックしやすい部分もありますので、バグを発見された方は是非ご報告を!

今回まとめきれなかった Azure Automation DSC で Linux をオンボードする方法は、また何れまとめたいと思います。

Written by kazu

2016/12/23 at 22:06

Azure Automation DSC を使ってみる

with one comment

この記事は、PowerShell Advent Calendar 2016 の14日目です。

Microsoft Azure Automation DSC とは

Azure Automation DSC は、Azure Automation アカウントを作成することで利用可能な機能の一つです。シンプルに言うと、DSC Pull サーバー相当の機能を Azure のサービスとして利用できます。これにより、自分で DSC サーバーを用意(Windows Server で構築)することなく、管理対象のサーバーを Azure へ接続するだけで、DSC による構成管理を行えます。

そもそも DSC とは?

Desired State Configuration (DSC)は PowerShell をベースとした構成管理のためのテクノロジーです。ChepAnsible などと同じく、対象の構成を管理するためのものです。Configuration as Code を実現するという点においても似ています。

余談:Configuration as Code と Infrastructure as Code

Configuration as Code と Infrastructure as Code は同じような概念ですが、対象としている範囲が若干違います。

  • Infrastructure as Code は、主にインフラのファブリック構成をコードとして定義し、管理するものです。
  • Configuration as Code は、主に各機器(ノード)の設定をコードとして定義し、管理するものです。

両方をまとめて、広義の Infrastructure as Code として取り扱う場合もあります。Microsoft Azure 利用者の場合、Azure 内の(利用者としての)インフラ(どのような VM や仮想ネットワークを作成して、どうつなげるか)は ARM (Azure Resource Manager)が担っていますが、ARM テンプレートに記載される構成が Infrastructure as Code の部分、作成された仮想マシンの内部を設定する DSC が Configuration as Code となるイメージです。

PowerShell DSC と Azure Automation DSC

PowerShell DSC は特にサーバーがなくても(Configuration を対象に PUSH できれば)利用できます。ローカルノードを構成したいだけであれば、PowerShell DSC を PUSH モードで利用することが一番お手軽です。オンプレミスでもクラウド上の仮想マシンでも、Windows でも Linux でも PowerShell DSC を利用できます。(Linux で使用する場合は、それなりに準備が必要です。)

Azure Automation DSC は PowerShell DSC の PULL サーバー(及びレポートサーバー)相当の機能を提供します。このため、DSC で集中管理を行いたい場合に、DSC のためのサーバーをわざわざ自分で用意する必要がなくなります。オンプレミスの危機でもクラウド上の仮想マシンでも、Windows でも Linux でも、Azure Automation DSC の管理対象とすることができます。さらに、Azure の Windows 仮想マシンの場合は、Azure Automation DSC との連携を簡単に設定できるようになっています。(※)

(※)通常、DSC を PULL モードで使用する場合は、ローカルノード(管理対象)側で、PULL サーバの場所などを設定する必要があります。(当たり前ですが、PULL サーバがどこにあるか分からないと、接続できないですので。)Azure Automation DSC を利用する場合、同じサブスクリプション内の Windows 仮想マシンであれば、ポータルから紐づけを行うことができるようになっており、VM の内部で設定を行う必要がありません。

Azure Automation DSC を使用して、Azure の Windows 仮想マシンを管理する

ここからは Step-by Step で。

  1. Azure 管理ポータルから「新規」→「Monitoring + management」→「オートメーション」を選択します。
    aadsc-161214-001
  2. 「Automation アカウント」を作成します。「名前」は管理用の名前ですので、何でも OK です。その他の項目は、VM を作成する場合と同じです。アクションアカウントは、作成しておいたほうが後々面倒なことになりません。
    aadsc-161214-002
  3. Automation アカウントを新規に作成すると、以下のリソースが作成されます。
    aadsc-161214-003
  4. 管理対象となる VM をデプロイしておきます。既に存在する VM へ設定を行う場合は、改めてデプロイする必要はありません。VM デプロイ時に特殊な設定は不要で、デプロイされている VM を後から紐づけることができます。尚、ARM(Azure Resource Manager)管理の Virtual Machine (クラシック仮想マシンではないもの)で、OS が Windows Server となるものを選択すると、設定時の手間が少ないです。(以下はその手順を記載しています。)
    aadsc-161214-005aadsc-161214-006aadsc-161214-007aadsc-161214-008aadsc-161214-009aadsc-161214-010
  5. 以下の PowerShell スクリプト(DSC Configuration)を作成し、適当な名前で保存します。
    Configuration SampleConfig {
        
        Node "WebServer" {
    
            WindowsFeature IIS {
                Name = "Web-Server"
                Ensure = "Present"
            }
    
            WindowsFeature IISTools {
                Name = "Web-Mgmt-Tools"
                Ensure = "Present"
            }
    
            WindowsFeature xTelnet {
                Name = "Telnet-Client"
                Ensure = "Absent"
            }
            
        }
    
        Node "DNSServer" {
    
            WindowsFeature DNS {
                Name = "DNS"
                Ensure = "Present"
            }
    
            WindowsFeature DNSTools {
                Name = "RSAT-DNS-Server"
                Ensure = "Present"
            }
    
            WindowsFeature xTelnet {
                Name = "Telnet-Client"
                Ensure = "Absent"
            }
    
        }
    
    }
    
  6. Azure ポータルで、作成した Azure Automation アカウントを選択します。Automation アカウントの管理画面は以下の構成となっています。

    aadsc-161214-004

    Azure Automation DSC で主に使用するのは「リソース」内の「DSC 構成」と「DSC ノード」です。標準の DSC モジュール以外を使用する場合は。「資産」も使用します。(今回は使用しません。)

  7. 「DSC 構成」から「構成を追加」を選択し、先ほど作成した DSC Configuration ファイルをアップロードします。「名前」欄は、DSC Configuration で記載した Configuration 名が自動で入力されます。

    aadsc-161214-011
  8. 「DSC 構成」に先ほど登録した構成(SampleConfig)が追加されていることを確認します。

    aadsc-161214-012
  9. 追加した構成の名前(SampleConfig)を選択し、「コンパイル」をクリックします。DSC Configuration のコンパイルが実行されます。コンパイル ジョブはキューイングされた後、順次実行されますので、ジョブが完了するまで待ちます。

    aadsc-161214-013

    aadsc-161214-014

    aadsc-161214-015

  10. コンパイル ジョブが完了すると、コンパイルした DSC Configuration 内で定義された DSC 構成が利用できる状態になります。「プル サーバーで使用可能」の「ノード構成」に定義したノード構成が表示されていることを確認します。

    aadsc-161214-016
  11. 「DSC ノード」から「Azure VM の追加」を選択し、「Virtual Machine – オンボードする仮想マシンの選択」をクリックします。

    aadsc-161214-017
  12. 構成対象とする VM を選択します。尚、ここで選択できるのは ARM 管理の Virtual Machine で、OS が Windows のもののみです。クラシック仮想マシンの Windows については、仮想マシンの拡張機能の設定から操作を行います。Linux の場合は、OS にログインして構成スクリプトを実行する必要があります。

    aadsc-161214-018
  13. 「登録 – 登録データの構成」を選択し、先ほど選択した VM に対して紐づける DSC 構成を選択します。コンパイル済みの DSC ノード構成が表示されるため、プルダウンから選択します。その他のオプションは、オンプレミスの PowerShell DSC でプル サーバーを使用する際定義するものと同じです。(詳細は省略します。)

    aadsc-161214-019
  14. 「作成」をクリックして VM とノード構成の紐づけを作成します。正常に作成が完了すると、プル サーバーから DSC ノード構成が配布される(各管理対象ノードが構成を取得しに行く)状態となります。

    aadsc-161214-020
  15. しばらく待つと、各管理対象ノードが Azure Automation DSC プル サーバーから構成を取得し、取得した構成をもとに自身を再構成します。

    aadsc-161214-021

    一度構成を適用した後は、定期的にチェックが実行され結果がレポートサーバー(Azure Automation DSC プル サーバー)上に保存されます。各レポートの行を選択すると、詳細を表示できます。

まとめ

Azure Automation DSC は DSC サーバーを自前で用意する必要がないので楽。Azure 上の仮想マシンを管理対象とする場合にはとても楽。

機会があれば、Linux の DSC、及び Linux を Azure Automation DSC で管理する方法もまとめたいと思います。

Written by kazu

2016/12/14 at 00:00

PowerShell 10th Anniversary

leave a comment »

PowerShell がリリースされてから 10 年になります。初期の PowerShell (1.0 など)は本当にどうしようもない状態でしたが、今や Windows Server を管理するうえでは欠かせないツールとなっています。

今年は Windows 以外のプラットフォームで動作する PowerShell (PowerShell on Linux / macOS)がリリースされたり、一部のモジュールやプロジェクトが OSS 化されるなど、PowerShell にとって大きな転換点になっていると感じます。今後の PowerShell に期待です。

10 周年イベント

PowerShell 10 周年を記念したイベントが Channel9 で行われています(いました)。

日本時間だとちょうど平日の深夜(2016/11/14 深夜 ~ 2016/11/15 午前)だったため、全てライブで参加(視聴)できた方は少ないかと思います。セッションの録画が Channel9 で公開されています(本記事執筆時点で、順次公開中)ので、興味のある方は視聴してみると良いかと思います。

Written by kazu

2016/11/15 at 08:55

カテゴリー: PowerShell

Tagged with

PowerShell スクリプトのコマンドヘルプの書き方(簡易版)

leave a comment »

PowerShell では Get-Help コマンドレットでコマンドのヘルプを出力できます。自作したスクリプト(モジュール化などはしていない、単純な ps1 スクリプトファイル)であっても、ヘルプ情報を埋め込むことができます。

書き方

ヘルプ トピックの作成方法は、about_Comment_Based_Help に記載されています。

スクリプトファイルの先頭(Requires の直後)に、ブロックコメントで必要な情報を記載します。(ブロックコメントではなく 1 行ずつコメント化しても認識しますが、複数行に渡ることが多いため通常はブロックコメントを使用します。)

記述方法のサンプルは以下の通りです。

<#
    .SYNOPSIS
        Windows Server 2016 RTM の NanoServerImageGenerator を修正し、インターフェース名が ASCII 以外の場合にもアドレスを設定できるようにします。
    
    .DESCRIPTION
        Windows Server 2016 RTM の NanoServerImageGenerator は、インターフェース名が ASCII 文字列以外で表現されることを想定していません。そのため、デフォルトインターフェース名が ASCII 外の環境、例えば "イーサネット" となっている日本語環境では、IP アドレスを正しく設定できません。

        このスクリプトは、NanoServerImageGenerator モジュールを修正し、インターフェース名が ASCII 以外の環境においても、New-NanoServerImage で指定した IP アドレスが正しく設定されるよう、モジュールを修正します。
    
    .PARAMETER Path
        NanoServerImageGenerator モジュールのフォルダーを指定します。指定したフォルダー内のモジュールファイルが直接修正されます。
    
    .INPUTS
        なし。パイプラインからの入力には対応していません。
    
    .OUTPUTS
        System.Int32
        正常終了した場合は 0 を、それ以外の場合は 1 を返します。
    
    .EXAMPLE
        .\Modify-NanoServerImageGenerator.ps1 -Path C:\Temp\NanoServer\NanoServerImageGenerator
        C:\Temp にインストールメディアの NanoServer フォルダーをコピーした場合、NanoServer フォルダー内の NanoServerImageGenerator フォルダーを指定してください。
    
    .NOTES
        This script is only for Windows Server 2016 RTM (10.0.14393).
        This script is tested with Windows Server 2016 Evaluation 10.0.14393.0 JA-JP only.
        Use this at your own risk!
#>

ヘルプ キーワード

ヘルプ キーワードはドット(.)で始まります。

  • .SYNOPSIS
    関数またはスクリプトの簡単な説明。
  • .DESCRIPTION
    関数またはスクリプトの詳細な説明。
  • .PARAMETER <パラメーター名>
    パラメーターの説明。
  • .EXAMPLE
    関数またはスクリプトの使用方法(使用例)。
  • .INPUTS
    入力オブジェクトの .NET Framework 型。
  • .OUTPUTS
    出力オブジェクトの .NET Framework 型。
  • .NOTES
    関数またはスクリプトに関する追加情報。
  • .LINK
    「関連リンク」セクションに表示される内容。

キーワードは他にもありますが、簡単なスクリプトであれば上記以外を使用するシーンは少ないと思います。

スクリプトの説明を、通常のコメントとしてスクリプト内に埋め込むのもよいですが、PowerShell として用意されている方法がありますので、なるべくスクリプトのヘルプ トピックを記述するくせをつけると良さそうです。

Written by kazu

2016/09/29 at 03:24

日本語版 Nano Server イメージ作成時に IPv4 アドレスを設定する

leave a comment »

昨日の記事で日本語版は時期尚早と書きましたが、どうしても日本語版を使用したい方向け。

なぜ IPv4 アドレスを設定できないのか

New-NanoServerImage (Nano Server Image Generator モジュール)が、「イーサネット インタフェースの名前が日本語であること」(日本語環境だとデフォルトインタフェース名は「イーサネット」)を想定していないからです。

もう少し仕組みを詳しく

New-NanoServerImage で指定した IPv4 アドレスは、SetupComplete.cmd というファイルに書き込まれ、初回起動時に設定が試みられます。SetupComplete.cmd の中身は単純に netsh を呼び出しているだけで、その際に InterfaceNameOrIndex パラメータで指定したインタフェース名(またはインデックス番号)が渡されます。

日本語版の場合、デフォルトインタフェース名は「イーサネット」ですので、InterfaceNameOrIndex パラメータにも「イーサネット」(など)を指定すればよいはずですが、RTM メディアに含まれているモジュールでは正しく設定されません。

残念なことに、New-NanoServerImage は、SetupComplete.cmd を生成する際、ファイルのエンコードを強制的に ASCII に設定します。ですので、ASCII で表現できない「イーサネット」という文字列は正しく保持されず、起動時に netsh が実行されるものの不明なインタフェース名としてコマンドがエラーになります。結果として IPv4 アドレスは正しく設定されません。

つまり

以下の何れかでアドレスを正しく設定できます。

  1. インタフェース名ではなくインタフェース インデックス番号で対象を指定する
  2. Nano Server のイメージ作成後、イメージをマウントして SetupComplete.cmd を修正し、正しいエンコードで保存する
  3. New-NanoServerImage が SetupComplete.cmd を書き込む際のエンコードを変更する

Nano Server はインタフェースインデックス番号があまり変動しない(インストールの都度変わることがほぼない?経験上であり、仕様上どうなのかは不明)ようなので、一度番号が分かれば 1 の方法でもよいかもしれません。ただし、一度インストールしてみるなど、何らかの方法でインデックス番号を知る必要があります。

2 の方法は、、、面倒ですね。

ということで、3 の方法を実現するためのスクリプトを作成しました。(GitHub 上で公開しています。)

#Requires -Version 5
#Requires -RunAsAdministrator

[Cmdletbinding()]
param
(
    [Parameter(Mandatory)]
    [string]$Path
)

## Initialize
$ErrorActionPreference = "Stop"
# Target Module File
$target = $Path + "\NanoServerImageGenerator.psm1"
# Original FileHash (SHA256)
$hash = "5DDA7841FEDC064F2696D1155717E9094621722C0F2645D1062453D4047C997B"
# Target line
$line2508 = @'
    Set-Content -Value $SetupCompleteCommand -Path "$Script:TargetSetupCompleteFilePath" -Encoding UTF8
'@

## Check target
if(!(Test-Path $target)) {
    Write-Output "モジュールが存在しません。"
    Write-Verbose -Message ("Path: {0}" -f $Path)
    Write-Verbose -Message ("Target: {0}" -f $target)
    exit 1
}

$h = Get-FileHash -Algorithm SHA256 $target
if($hash -ine $h.Hash) {
    Write-Output "モジュールがオリジナルの状態ではありません。"
    Write-Verbose -Message "モジュールのハッシュ値が想定と異なります。"
    Write-Verbose -Message ("Expected Hash (SHA256): {0}" -f $hash)
    Write-Verbose -Message ("Actual Hash (SHA256): {0}" -f $h.Hash)
    exit 1
}

## Copy & Modify
Copy-Item -Path $target -Destination ($target + ".original") -Force
$c = Get-Content -Path $target -Encoding UTF8
$c[2508] = $line2508
Set-Content -Path $target -Value $c -Encoding UTF8

Write-Output "FailoverClusters モジュールを修正しました。"
return 0

このスクリプトは、NanoServerImageGenerator モジュールを書き換え、SetupComplete.cmd を UTF-8 で生成するように動作を変更します。

実行する際は、Path パラメータに書き換え対象の NanoServerImageGenerator モジュールを含んでいるフォルダーを指定してください。例えば、

PS> .\Modify-NanoServerImageGenerator.ps1 -Path C:\Temp\NanoServer\NanoServerImageGenerator

詳しくは、Get-Help .\Modify-NanoServerImageGenerator.ps1 でヘルプを参照してください。

※ご利用は自己責任でお願いします。

Written by kazu

2016/09/28 at 00:15

カテゴリー: PowerShell, Windows Server

Tagged with ,

Windows Server 2016 Nano Server と日本語環境

leave a comment »

Windows Server 2016 が RTM となり、評価版がダウンロードできるようになりました。

結論

日本語版 Nano Server を使用するのは時期尚早です。やめましょう。

どうしても利用したい方は、以下を理解したうえで自己責任でどうぞ。

日本語版で困ること

Nano Server のイメージを作成する際に、静的 IP アドレスを正しく設定できない

New-NanoServerImage で IPv4Address などを指定しても、IP アドレスが設定されません。DHCP を使用する場合は問題ありませんが、静的アドレスを使用したい場合は、Recovery Console 側で設定操作が必要です。

Recovery Console が文字化けする

Recovery Console は日本語対応していないため、日本語で出力される部分はもれなく文字化けします。例えば、時刻表示やネットワーク インタフェース名、Windows Firewall のルール名などが文字化けします。

img002618img002625

RTM の Nano Server では Recovery Console でできることが増えているため、相対的に不便さ倍増です。

新規に作成した Gen 2 仮想マシンが存在すると、仮想マシン管理サービスがクラッシュする

Hyper-V の役割をインストールして Hyper-V ホストとして使用することを考えている方も多いと思いますが、日本語版 Nano Server 上で新規に Gen 2 仮想マシンを作成し、PowerShell 上で Get-VMFirmware を実行すると、Hyper-V 仮想マシン管理サービス(Hyper-V Virtual Machine Management Services / vmms)がもれなくクラッシュします。

Gen 2 仮想マシンの状態や、セキュアブートの設定には依存しません。VM が停止状態であっても、セキュアブートが無効に設定されていてもクラッシュします。(これはおそらく、セキュアブート テンプレートに不整合が発生しているためと思われます。(次項参照))

vmms がクラッシュしても仮想マシンは停止しませんが、Hyper-V マネージャや PowerShell などから管理ができなくなります。

Gen 2 仮想マシンのセキュアブート テンプレートを変更できない

日本語 Nano Server 上で新規に Gen 2 仮想マシンを作成すると、セキュアブート テンプレートを選択するリストが表示されないため、テンプレートを選択できません。また、この状態で仮想マシンの電源をオンにすると、セキュアブートテンプレートの互換性に問題がある旨、警告が表示されます。

英語版 Nano Server

img002639

日本語版 Nano Server

img002640

img002641

なんとなく、セキュアブート テンプレートが壊れているか、内部的に不整合な状態になっている気がします。

デフォルト タイムゾーンが US に設定される

日本語版イメージを作成すると、言語環境や時刻、通貨表記などは日本語(日本環境)になりますが、タイムゾーンは米国およびカナダ(UTC-8)が設定されます。(いっその事すべて US 環境がデフォルトなら問題は少なかったかもしれないのに…。)

img002629

なお、タイムゾーンは起動後にコマンドで変更できますので、大きな問題ではありません。

最後に

Nano Server は、他の Windows Server 2016 (Core / Desktop)と異なり CBB (Current Branch for Business)で提供されます。(Windows Server は LTSB ; Long Term Service Branch)で提供されるため、不具合の改修やアップデート(に伴う仕様変更)も早いと思われます。

もう少ししたら、日本語版でも問題なく利用できるようになるかもしれません。

Written by kazu

2016/09/27 at 04:41

System Center User Group Japan 第15回勉強会で登壇しました

leave a comment »

System Center User Group Japan (SCUGJ)第15回勉強会で登壇させていただきました。今回は、クラウドと OSS (Open Source Software)がテーマということで、PowerShell DSC for Linux と Azure Automation DSC のお話をさせていただきました。

資料は SlideShare に掲載しています。また、デモで使用したサンプルコードは GitHub 上で公開しています。

PowerShell DSC for Linux と Azure Automation DSC については、別途記事にまとめる予定です。