در این مقاله نگاهی خواهیم داشت به نحوه اتوماتیک نمودن دستورات Exchange Shell از طریقPowerShell، برای این منظور از نرم افزار Ansible استفاده خواهیم نمود.
روی سرور مورد نظر، Exchange Shell نصب شده تا امکان ایجاد حسابهای ایمیل Office 365 فراهم شود.
دستورات مورد نیاز:
Enable-Remotemailbox test.user -RemoteRoutingAddress test.user@0365.com
Set-Remotemailbox test.user -EmailAddressPolicyEnabled $false
Set-Remotemailbox test.user -PrimarySmtpAddress test.user@new.com
Set-Remotemailbox $username -EmailAddresses @{Remove="test.user@old.com"} اهداف اجرای این دستورات به شرح زیر هستند:
- ایجاد کاربر در Office 365
- غیرفعالسازی گزینه “بهروزرسانی خودکار آدرس ایمیل براساس سیاست اعمالشده” جهت اعمال تنظیمات سفارشی
- تغییر آدرس پیشفرض ایمیل
- حذف آدرس ایمیل پیشفرض ایجاد شده توسط سیاست فعلی (این مورد بهعنوان بخشی از فرآیند مهاجرت سرویس انجام میشود)
نحوه دسترسی به Exchange Shell از طریق پاورشل
دستورات بالا در محیط مستقیم Exchange Shell بدون مشکل اجرا میشوند. اما برای اجرای آنها از طریق انسیبل نیاز است که دسترسی به Exchange Shell از طریق پاورشل فراهم شود تا بتوان از ماژول win_shell برای دریافت خروجی استفاده کرد.
با اجرای دستور زیر میتوان محیط Exchange را در پاورشل بارگذاری کرد:
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
بنابراین، ساختار کامل پاورشل به صورت زیر خواهد بود:
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Enable-Remotemailbox test.user -RemoteRoutingAddress test.user@0365.com
Set-Remotemailbox test.user -EmailAddressPolicyEnabled $false
Set-Remotemailbox test.user -PrimarySmtpAddress test.user@new.com
Set-Remotemailbox $username -EmailAddresses @{Remove="test.user@old.com"}
با این روش، پاورشل به درستی به Exchange Shell متصل میشود و میتواند دستورات مربوطه را اجرا کند.
اتصال Ansible به پاورشل
در این مرحله، متغیرها از طریق انسیبل به پاورشل ارسال میشوند. در این حالت، مشکل فراردهی (escaping) به دلیل وجود نویسههای خاص و کوتیشنها پیش میآید. کارآمدترین روش برای مدیریت این موضوع، تعریف متغیرها در داخل اسکریپت پاورشل است تا از پیچیدگی فراردهی جلوگیری شود.
در playbook زیر، برای نمونه از مقادیر ثابت استفاده شده است؛ اما در کد واقعی این مقادیر از نقشهای دیگر در انسیبل دریافت میشوند.
---
- name: Email Creation Via Exchange Shell
hosts: localhost
gather_facts: no
vars:
_name: test.user
_O365_domain: '@O365.com'
_default_email: new.com
- set_fact:
_joined_O365: "{{ _name }}{{ _O365_domain}}"
_default_email: "{{ _name }}@{{ _default_email }}"
_remove_email: "{{ _name }}@old.com"
- name: Create Email Using Exchange Management Shell
ansible.windows.win_shell: |
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Enable-Remotemailbox "{{ _name }}" -RemoteRoutingAddress "{{ _joined_O365 }}"
Set-Remotemailbox "{{ _name }}" -EmailAddressPolicyEnabled $false
Set-Remotemailbox "{{ _name }}" -PrimarySmtpAddress "{{ _default_email }}"
در این بخش، تغییر متغیرها بهراحتی صورت گرفته و نیازی به استفاده از کوتیشنهای پیچیده نیست. در پاورشل نیازی به الزام استفاده از کوتیشن دوتایی نیست.
حذف ایمیل پیشفرض
در مرحله بعدی، باید دستور حاوی نویسههای خاص مانند @، {} و " " اجرا شود که نیاز به دقت بیشتری در ساختار دارد. به جای تلاش برای فراردهی این کاراکترها در انسیبل، پیشنهاد میشود متغیرها ابتدا در پاورشل تعریف شوند:
- name: Remove Default Email
ansible.windows.win_powershell:
script: |
$username = '{{ _name }}'
$remove = '{{ _remove_email }}'
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Set-Remotemailbox $username -EmailAddresses @{Remove="$remove"}
استفاده از پاورشل در کنار انسیبل برای مدیریت حسابهای Office 365 و Exchange یک روش قدرتمند و قابل اتکاست. با اضافهکردن Snap-in و تعریف متغیرها بهدرستی، میتوان از پیچیدگیهای پاورشل عبور کرد و عملیاتها را بهشکل ساختاریافته و خودکار انجام داد.
اگر از دستورات بالا در محیطهای مشابه استفاده میکنید، میتوانید این ساختار را بهراحتی توسعه دهید و در نقشهای دیگر انسیبل نیز استفاده نمایید.

