AnsibleとOpenStackによる統合された自動化

Ansibleソリューションは、最大限の柔軟性を保証します。 これにより、コミュニティはAnsibleモジュールを使用して、OpenStackテクノロジーとの組み合わせを含む、多くのレベルで頻繁に実行される操作を自動化する新しい方法を見つけることができます。



このブログでは、最も人気のある自動化ソフトウェア(ソフトウェア)であるAnsibleの多数の使用方法と、最も人気のあるクラウドインフラストラクチャソフトウェアであるOpenStackについて説明します。 Ansibleを使用して、Full-Stack Automationでの生活を楽にする方法と理由を理解するのに役立ちます。



画像






まず、上の図に示されている統合自動化のレベルについて説明します。 以下に、機器(サーバー、データストレージシステム、ネットワーク機器)があります。 次はオペレーティングシステム(LinuxまたはWindows)です。 Linuxでは、OpenStackをインストールして、データセンターの物理リソースから抽象化し、コンピューティングリソース、ネットワーク、ストレージのソフトウェアバージョンをデプロイできます。 OpenStackの上に、テナント固有のサービスがデプロイされ、アプリケーションが実行される仮想マシンが作成されます。 最後に、オペレーティングシステム管理(LinuxまたはWindows)を提供して、本当に必要なアプリケーションとワークロード(データベース、Webサーバー、モバイルアプリケーションサーバーなど)を展開する必要があります。 コンテナー(たとえば、DockerやRkt)を使用する場合、これらのアプリケーションをイメージにパッケージ化し、ゲストOSに展開します。 さらに、アプリケーションサーバーの概念はいくつかの言語で登場しており、別のレイヤー(たとえば、J2EE)が追加されています。



Ansibleソリューションが提供する管理機能



Ansibleは、各レイヤーを管理するためのモジュールを提供します。 ネットワーク機器であっても、より正確には、IOSやNXOSなどのネットワークオペレーティングシステムの場合、技術的な観点からこれにアプローチすると、Ansibleネットワークモジュールの完全なリストを参照してください。



1.オペレーティングシステムとの標準的な対話:パッケージのインストール、コンテンツまたはファイルのアクセス許可の変更または適用、サービスの管理、ユーザーとユーザーグループの作成と削除など。





2.サービスとしてのインフラストラクチャ(IaaS)の概念を実装するためのソフトウェア:IaaSソフトウェアと関連コンポーネント(データベース、ロードバランサー、構成ファイル、サービス、およびその他のサポートツール)をインストールします。





3.仮想リソース:サイズ、アクセス権、コンテンツ、セキュリティプロファイル、ネットワーク接続設定などを決定して、仮想マシンやインスタンスなどのリソースを構成します。





4.ゲストOS:コンポーネントはホストOSのコンポーネントに似ています。 しかし、あなたが持っているゲストシステムの数をどのように知るのでしょうか?





5.コンテナ管理モジュール(オプション)。







6.リースソフトウェア:データベース、Webサーバー、ロードバランサー、データ処理モジュールなど





Python仮想環境に最新バージョンのAnsibleをインストールするためのベストプラクティス



既に理解しているように、一部の機能はAnsibleの最新バージョン(2.2など)でのみ使用可能です。 ただし、OSのバージョンには古いバージョンが含まれている場合があります。 たとえば、RHEL 7またはCentOS 7では、Ansible 1.9のみが見つかります。



Ansibleは、システムの複数のバージョンを禁止しないPythonで書かれたコマンドラインツールであるため、アセンブリが提供するAnsibleのセキュリティ強化は必要ない場合があり、最新バージョンを試してみることができます。



ただし、他のPythonソフトウェアと同様に、多くの依存関係があるため、システムのライブラリで未検証の新しいライブラリを使用することはお勧めしません。 ライブラリはシステムの他のコンポーネントと共有でき、未検証の新しいバージョンは他のアプリケーションを混乱させる可能性があります。 最も簡単な方法は、すべての依存関係を含むAnsibleの最新バージョンを、非特権アカウントの下の隔離されたフォルダーにインストールすることです。 これがPython仮想環境 (virtualenv)になります。すべてを正しく行うと、複雑なオーケストレーション用の最新のAnsibleモジュールを安全に試すことができます。 もちろん、この方法を実稼働環境適用することはお勧めしません 。 これは、DevOpsスキルの向上に役立つ演習にすぎません。



1.必要なコンポーネント(pip、virtualenv)をインストールします



この場合、必要なのは「システム全体の」Pythonライブラリーであるvirtualenvwrapperだけです。 また、sudo pip installコマンドを実行しないでください。これにより、Pythonシステムライブラリが新しい未検証バージョンに置き換えられます。 この場合、virtualenvwrapperライブラリのみを信頼できます。 仮想環境は、 非特権ユーザーアカウントで新しいPythonモジュールをインストールおよびテストするための効率的なメカニズムです。



$ sudo yum install python-pip $ sudo pip install virtualenvwrapper $ sudo yum install python-heatclient python-openstackclient python2-shade
      
      





また、アカウントがsudoer以外の場合、次のコマンドを使用できます。



 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py --user .local/bin/pip install virtualenvwrapper --user export PATH=$PATH:~/.local/bin #Remember to include this in your .bashrc
      
      





2. Ansibleの最新バージョンを展開する新しい仮想環境をインストールします



開始するには、仮想環境を保存するためのディレクトリを作成します。



 $ mkdir $HOME/.virtualenvs
      
      





次に、.bashrcファイルに次の行を追加します。



export WORKON_HOME = $ HOME / .virtualenvs

ソース/usr/bin/virtualenvwrapper.sh



次に、このファイルに対してソースコマンドを実行します。



 $ source ~/.bashrc
      
      





この時点で、シェルリンクが作成されますが、最初の起動時のみです。 環境のリストを表示するにはworkonコマンドを実行します;空にしないでください。 次に、 ansible2という新しいvirtualenv環境を作成します。これは自動的にアクティブ化され、RPMを使用してデフォルトでインストールされたパッケージにアクセスします。



 $ mkvirtualenv ansible2 --system-site-packages
      
      





deactivateと入力してvirtualenvを終了し、workonと入力して再入力します。



 $ deactivate $ workon ansible2
      
      





3.新しいvirtualenv環境に入り、PIP経由でAnsible2をインストールします(通常のユーザーとして、root権限なしで)



シェルでコマンドを入力する要求が変更され、virtualenvという名前が括弧内に示されていることがわかります。



 (ansible2) $ pip install ansible
      
      





このコマンドは、RPMで利用可能なシステム全体のPythonパッケージを使用して、Ansible 2の依存関係のみをインストールします(以前に使用したsystem-site-packagesフラグのおかげです)。 開発ブランチを試してみたい場合の代替手段。



 (ansible2) $ pip install git+git://github.com/ansible/ansible.git@devel
      
      





 (ansible2) $ ansible --version
      
      





virtualenv環境とそのすべての依存関係を削除する必要がある場合は、rmvirtualenv ansible2コマンドを入力するだけです。



注 上記のコマンドが機能しない場合は、GCCおよびOpenSSLライブラリがシステムにインストールされていることを確認してください。Pythonの依存関係には最新の暗号化モジュールが使用されているためです。



4. OpenStackクライアントの依存関係のインストール



以下のコードスニペットの最初のコマンドは、OpenStack APIの最新の安定バージョンを持っていることを保証しますが、pip installコマンドを使用して最新のコマンドラインツール(CLI)を取得することもできます。 2番目のコマンドは、特定のCLIツールに関係なく、ansibleを使用してOpenStack APIの最新バージョンに接続するためのPython Shadeライブラリの最新バージョンを提供します。



 (ansible2) $ yum install python-openstackclient python-heatclient
      
      





 (ansible2) $ pip install shade --upgrade
      
      





5.展開をテストする



 (ansible2) $ ansible -m ping localhost localhost | SUCCESS => { "changed": false, "ping": "pong" }
      
      





注 virtualenv仮想環境の外部でこのバージョンのansibleを実行することはできないため、usiの前に必ずworkon ansible2コマンドを実行してください。



Ansibleを使用したOpenStack Orchestration



熱心な読者は、OpenStackのオーケストレーションにAnsibleを使用すると、Heatがこのプラットフォームの公式オーケストレーションモジュールであるという事実を無視していることに気付くでしょう。 実際、Ansible PlaybookはHOTテンプレートとほぼ同じ機能を提供します(HOTは、 AWS CloudFormationの生まれ変わりであるHeatのYAMLベースの構文です)。 それでも、多くのDevOpsプロフェッショナルは、新しい構文の学習に時間を浪費しないことを好み、ハイブリッドインフラストラクチャのプロセス全体を既に統合しています。



Ansibleチームはこれを理解しているため、OpenStackプロジェクトの公式ライブラリであるShadeを使用して、OpenStack APIを呼び出すためのインターフェースを作成します。 この記事の執筆時点では、Ansible 2.2には次のAPIを呼び出すためのモジュールが含まれていました。





Ansibleの観点からは、システムがOpenStackクレデンシャルをロードし、さまざまなOpenStack APIでHTTP接続を作成できるサーバーとの相互作用を整理する必要があります。 このサーバーがマシン(localhost)の場合、Ansibleはローカルで動作し、Keystone資格情報をロードして、OpenStackとの対話を開始します。



例を見てみましょう。 Ansible OpenStackモジュールを使用してNovaに接続し、Cirrosイメージで小さなインスタンスを起動します。 はじめに、これまでにこれを行ったことがない場合は、最新のCirrosイメージをダウンロードします。 現在のユーザーの既存のSSHキーを使用します。 このプレイブックは、Githubのこのリンクからダウンロードできます



 --- # Setup according to Blogpost "Full Stack automation with Ansible and OpenStack". Execute with "ansible-playbook ansible-openstack-blogpost.yml -c local -vv" # # # # # # - name: Execute the Blogpost demo tasks hosts: localhost tasks: - name: Download cirros image get_url: url: http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img dest: /tmp/cirros-0.3.4-x86_64-disk.img - name: Upload cirros image to openstack os_image: name: cirros container_format: bare disk_format: qcow2 state: present filename: /tmp/cirros-0.3.4-x86_64-disk.img - name: Create new keypair from current user's default SSH key os_keypair: state: present name: ansible_key public_key_file: "{{ '~' | expanduser }}/.ssh/id_rsa.pub" - name: Create the test network os_network: state: present name: testnet external: False shared: False #provider_network_type: vlan #provider_physical_network: datacentre register: testnet_network - name: Create the test subnet os_subnet: state: present network_name: "{{ testnet_network.id }}" name: testnet_sub ip_version: 4 cidr: 192.168.0.0/24 gateway_ip: 192.168.0.1 enable_dhcp: yes dns_nameservers: - 8.8.8.8 register: testnet_sub - name: Create the test router ignore_errors: yes #for some reasons, re-running this task gives errors os_router: state: present name: testnet_router network: nova external_fixed_ips: - subnet: nova interfaces: - testnet_sub - name: Create a new security group os_security_group: state: present name: secgr - name: Create a new security group allowing any ICMP os_security_group_rule: security_group: secgr protocol: icmp remote_ip_prefix: 0.0.0.0/0 - name: Create a new security group allowing any SSH connection os_security_group_rule: security_group: secgr protocol: tcp port_range_min: 22 port_range_max: 22 remote_ip_prefix: 0.0.0.0/0 - name: Create server instance os_server: state: present name: testServer image: cirros flavor: m1.small security_groups: secgr key_name: ansible_key nics: - net-id: "{{ testnet_network.id }}" register: testServer - name: Show Server's IP debug: var=testServer.openstack.public_v4
      
      





開始後、インスタンスのIPアドレスが表示されます。 書き留めます。 これで、Ansibleを使用して、SSH経由でこのインスタンスに接続できます。 デフォルトのNovaネットワークは、ワークステーションからの接続をサポートしていると想定されています(この場合、サービスプロバイダーのネットワークを介して)。



OpenStack Heatとの比較



Heatの代わりにAnsibleを使用すると、長所と短所があります。 たとえば、Ansibleを使用する場合、作成したリソースを追跡し、それらが不要になったら手動で(逆順で)削除する必要があります。 Neutronポート、フローティングIP、ルーターでは特に困難になります。 ただし、Heatの場合、スタックを削除するだけで、作成されたすべてのリソースが自動的に削除されます。



上記の例を、次のGithub gistリポジトリからダウンロードできる類似の(ただし、類似ではない)Heatテンプレートと比較します。



 heat_template_version: 2015-04-30 description: > Node template. Launch with "openstack stack create --parameter public_network=nova --parameter ctrl_network=default --parameter secgroups=default --parameter image=cirros --parameter key=ansible_key --parameter flavor=m1.small --parameter name=myserver -t openstack-blogpost-heat.yaml testStack" parameters: name: type: string description: Name of node key: type: string description: Name of keypair to assign to server secgroups: type: comma_delimited_list description: List of security group to assign to server image: type: string description: Name of image to use for servers flavor: type: string description: Flavor to use for server availability_zone: type: string description: Availability zone for server default: nova ctrl_network: type: string label: Private network name or ID description: Network to attach instance to. public_network: type: string label: Public network name or ID description: Network to attach instance to. resources: ctrl_port: type: OS::Neutron::Port properties: network: { get_param: ctrl_network } security_groups: { get_param: secgroups } floating_ip: type: OS::Neutron::FloatingIP properties: floating_network: { get_param: public_network } port_id: { get_resource: ctrl_port } instance: type: OS::Nova::Server properties: name: { get_param: name } image: { get_param: image } flavor: { get_param: flavor } availability_zone: { get_param: availability_zone } key_name: { get_param: key } networks: - port: { get_resource: ctrl_port }
      
      





OpenStackモジュールと組み合わせて動的インベントリを使用する



次に、多くのインスタンスを作成したが、それらのIPアドレスを書き留めておかないとどうなるか見てみましょう。 OpenStackのDynamic Inventoryツール使用するすばらしい例は、レンタルした仮想化リソースの現在の状態を分析し、サーバーのすべてのIPアドレスを取得して、たとえばカーネルのバージョンを確認できるようにすることです。 たとえば、これはAnsible Towerソリューションを使用して透過的に行われます。このソリューションは、定期的にインベントリを実施し、管理対象のOpenStackサーバーの更新されたリストを生成します。



これらの操作を実行する前に、〜/ .config / openstack、/ etc / openstack、または/ etc / ansibleディレクトリに古いcloud.yamlファイルがないことを確認してください。 動的インベントリスクリプトは、最初に環境変数(OS_ *)を検索し、次にリストされたファイルを検索します。



 #ensure you are using latest ansible version $ workon ansible2 $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/openstack.py
      
      





 $ chmod +x openstack.py
      
      





 $ ansible -i openstack.py all -m ping
      
      





 bdef428a-10fe-4af7-ae70-c78a0aba7a42 | SUCCESS => { "changed": false, "ping": "pong" } 343c6e76-b3f6-4e78-ae59-a7cf31f8cc44 | SUCCESS => { "changed": false, "ping": "pong" }
      
      





興味のある方は、上記のインベントリスクリプトが返すすべての情報を表示できます。そのためには、次の操作を行います。



$ ./openstack.py –list



 { "": [ "777a3e02-a7e1-4bec-86b7-47ae7679d214", "bdef428a-10fe-4af7-ae70-c78a0aba7a42", "0a0c2f0e-4ac6-422d-8d9b-12b7a87daa72", "9d4ee5c0-b53d-4cdb-be0f-c77fece0a8b9", "343c6e76-b3f6-4e78-ae59-a7cf31f8cc44" ], "_meta": { "hostvars": { "0a0c2f0e-4ac6-422d-8d9b-12b7a87daa72": { "ansible_ssh_host": "172.31.1.42", "openstack": { "HUMAN_ID": true, "NAME_ATTR": "name", "OS-DCF:diskConfig": "MANUAL", "OS-EXT-AZ:availability_zone": "nova", "OS-EXT-SRV-ATTR:host": "compute-0.localdomain", "OS-EXT-SRV-ATTR:hypervisor_hostname": "compute-0.localdomain", "OS-EXT-SRV-ATTR:instance_name": "instance-000003e7", "OS-EXT-STS:power_state": 1, "OS-EXT-STS:task_state": null, "OS-EXT-STS:vm_state": "active", "OS-SRV-USG:launched_at": "2016-10-10T21:13:24.000000", "OS-SRV-USG:terminated_at": null, "accessIPv4": "172.31.1.42", "accessIPv6": "", (....)
      
      





おわりに



Heatは非常に便利ですが、単一の言語を使用してITリソース全体を定義および自動化することを提案しているため、Ansibleを学習してオーケストレーションにこのソリューションを使用することを好む人もいます。 この記事が実用的な観点からあなたの役に立つことを願っています。 OpenStackリソースを実行するためのAnsibleの基本的な使用法について説明しました。 AnsibleおよびAnsible Towerの機能に興味があり、評価したい場合は、 リソースにアクセスしてください。 別のブログ投稿で説明されているように、コールバックを介してAnsible Towerと対話するHeatを実装することから始めるのが適切です。



さらに、Red Hat OpenStackプラットフォームについて詳しく知りたい場合は、当社のサイトで多くの貴重なリソース(ビデオやホワイトペーパーを含む)を見つけることができます。



All Articles