はじめに
Ansibleへの入門として、Ansibleインストールからplaybookの実行までの一連の流れをまとめました。
Ansibleとは
『Ansible』とはRed Hat社が開発するオープンソースの構成管理ツールです。
構成管理ツールは Chef、Puppetなどのツールもありますが、『エージェントレス』であり設定ファイルの記述がシンプルでわかりやすいため、構成管理ツールの中でもハードルが低く使いやすいのが特徴です。
Ansibleを使えるようになると以下のメリットがあります。
- 工数の削減が期待できる
- 品質が向上する
- 不要なオペレーションやアクセスをなくすことができる
例えば、50台のサーバに同一の設定を行う場合、手作業で行うとミスが発生する可能性があります。それに対し、作業を自動化した場合は全台に同一の設定を実行することができるため、人的ミスを少しでも防ぐことができかつ工数の短縮も図ることができます。
また、不要なオペレーションやアクセスをなくすことができるため、誤動作の防止にもつながります。
Ansibleを理解する
Ansibleは手作業で行うことを自動化するツールです。Ansibleを理解するには自動化を行う前に手作業で目的の動作が行われるか検証するのが良いと思います。
手作業で問題が発生しなかった作業をplaybook化するイメージです。
Ansibleを効率的に学習する前に、まずは大まかな操作(Ansibleの導入からPlaybookの実行まで)を知る必要があると思います。。
また、手順や操作方法が分かるようになれば学習するべき内容を絞り出すことができ、理解がより深まってくると思います。
当サイトでは、単純すぎず複雑すぎない手順を用意いたしました。
Ansibleの操作手順
実際にAnsibleをインストールし操作を行います。当サイトではhttpdのインストール、
httpd.confの修正、firewallの設定、selinuxの設定を行う操作を記述致します。
目次
- Ansibleを操作するサーバを準備(以降コントロールノードと呼ぶ)
- 構築対象となるサーバを準備(以降ターゲットノードと呼ぶ)
- コントロールノードにansibleをインストール
- sshの設定(公開鍵認証)
- Ansible疎通確認
- ターゲットノードで設定を行い内容を手作業で確認
- playbook作成
- playbook実行
- ターゲットノードで設定が変更されているか確認
項番1,2の手順は様々な環境が存在するため、省略いたします。
OSがインストールされており、ネットワークの設定済みの環境を使用します。
使用環境
- CentOS7.7(コントロールノード)
- CentOS7.6(ターゲットノード)
- Ansible 2.9.6
- Python 2.7.5
3. コントロールノードにAnsibleをインストール
インストールの手順は以下です。 (yum を使用したインストール方法)
[root@Kensyo ~]# yum install epel-release -y
[root@Kensyo ~]# yum install ansible
[root@Kensyo ~]# ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
※Ansibleの特定のバージョンをインストールしたい場合は『pip』を使用しインストールします。
[root@Kensyo ~]# yum install epel-release -y
[root@Kensyo ~]# yum install python-pip
[root@Kensyo ~]# pip install ansible==2.4.0
[root@Kensyo ~]# ansible --version
ansible 2.4.0.0
config file = None
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
また、『 virtualenv 』を使用してAnsibleのバージョンを複数試すことができます。
書籍「Ansible 実践ガイド3版」には『virtualenv』を使用した記載があります。
4. SSHの設定(公開鍵認証)
ssh-keygenを実行すると、鍵の格納先等の入力を求められますが、何も入力せずにEnterを押してください。
[root@Kensyo ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:v7zExC+aMo1hrLrcw8znr8fuTjR9uyX3rESFuyKSD/Y root@Kensyo
The key's randomart image is:
+---[RSA 2048]----+
| |
| . |
| . .|
| o o |
| . S + . o |
| +. * o o . |
| + o =* * = = |
| . .* =o+X + B o |
| +o.+oXB E.. ..o|
+----[SHA256]-----+
[root@Kensyo ~]#
鍵は以下に格納されています。
[root@Kensyo ~]# cd .ssh
[root@Kensyo .ssh]# ls
id_rsa id_rsa.pub
authorized_keysの作成をします。
[root@Kensyo .ssh]# cat id_rsa.pub >> authorized_keys
[root@Kensyo .ssh]# ls
authorized_keys id_rsa id_rsa.pub
パーミッションを変更します。『authorized_keys』はパーミッションを変更しないとSSH接続ができない場合があります。
[root@Kensyo .ssh]# chmod 600 authorized_keys
ターゲットノードに鍵を転送します。ターゲットノードのrootパスワードを求められるので入力してください。
[root@Kensyo ~]# scp -pr .ssh/ root@192.168.181.103:~/
The authenticity of host '192.168.181.103 (192.168.181.103)' can't be established.
ECDSA key fingerprint is SHA256:eEiyRWa/YH1QimVPOTZvmUE+EpKRY6GzmSoNTcO8WfI.
ECDSA key fingerprint is MD5:8f:36:d7:45:30:70:96:fc:c2:cb:c5:d2:59:0e:aa:3c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.181.103' (ECDSA) to the list of known hosts.
root@192.168.181.103's password:
id_rsa 100% 1679 1.4MB/s 00:00
id_rsa.pub 100% 393 506.6KB/s 00:00
authorized_keys 100% 393 331.3KB/s 00:00
ターゲットノードでコピーされているか確認します。
[root@targetnode ~]# ls .ssh/
authorized_keys id_rsa id_rsa.pub
ssh接続を行います。鍵認証が問題なければパスワードなしで接続ができます。
[root@Kensyo ~]# hostname
Kensyo
[root@Kensyo ~]# ssh root@192.168.181.103
[root@targetnode ~]# hostname
targetnode
[root@targetnode ~]# ログアウト
Connection to 192.168.181.103 closed.
[root@Kensyo ~]#
5. Ansible疎通確認
疎通確認をするためにまずインベントリファイルを作成する必要があります。
インベントリとは、ターゲットノードの接続情報を記載したファイルです。
[root@Kensyo ~]# cd /etc/ansible/
[root@Kensyo ansible]# ls
ansible.cfg hosts roles
インベントリファイル『hosts』がデフォルトで存在しますので接続情報を記載します。記載内容を以下とします。
1行目、[〇〇]でグループ名を設定します。今回[target]と命名しましたが、各自分かりやすいものを設定してください。
2行目、ターゲットノードのホスト名を記載しスペースを空け『 ansible_host=”IP アドレス” 』を記載します。
[root@Kensyo ansible]# vi hosts
[target]
targetnode ansible_host=192.168.181.103
ansibleコマンドを実行し疎通確認を行います。
[root@Kensyo ansible]# ansible all -i hosts -m ping
targetnode | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
pingモジュールを使用し疎通しています。『all』はインベントリに記載しているすべてのターゲットノードが対象になります。
『ansible target -i hosts -m ping』でも疎通は可能です。この場合はtargetグループに記載されているターゲットノードが対象になります。
上記のように「SUCCESS」で「”ping”: “pong”」となっていれば成功です。
6. ターゲットノードで設定を行い内容を手作業で確認
ターゲットノードを操作します。
本検証ではhttpdのインストールとconfigファイルの修正、firewallの設定、selinuxの設定を行います。
作業開始前にスナップショット等、手作業構築前に復元できるようにしてください。
手作業構築後はplaybookで構築確認を行うため手作業構築前の状態に戻してください。
パッケージがインストールされているか確認します。
[root@targetnode ~]# rpm -qa | grep httpd
[root@targetnode ~]#
インストールされていない為、インストールを行います。
[root@targetnode ~]# yum install httpd
[root@targetnode ~]# rpm -qa | grep httpd
httpd-2.4.6-90.el7.centos.x86_64
httpd-tools-2.4.6-90.el7.centos.x86_64
configファイルを修正します。接続ポートを変更します。
[root@targetnode ~]# cd /etc/httpd/conf
[root@targetnode conf]# cp -p httpd.conf httpd.conf.org
[root@targetnode conf]# vi httpd.conf
(中略)
#Listen 80
Listen 8080
(中略)
httpdサービスを起動します。
[root@targetnode conf]# systemctl start httpd
[root@targetnode conf]# systemctl enable httpd
[root@targetnode conf]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running)
firewallの設定を行います。先ほど設定した88番ポートを許可するように設定します。
[root@targetnode conf]# firewall-cmd --add-port=88/tcp --zone=public --permanent
[root@targetnode conf]# systemctl reload firewalld
[root@targetnode conf]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running)
selinuxの設定を行います。
[root@targetnode conf]# cd /etc/selinux
[root@targetnode selinux]# cp -p config config.org
[root@targetnode selinux]# vi config
SELINUX=disabled
selinuxの設定を『disabled』に変更したらターゲットノードを再起動します。
[root@targetnode selinux]# reboot
ターゲットノードの操作が行えるようになったら、Google Chrome等のブラウザを開きURL欄に
[http://ターゲットノードのIPアドレス:8080]を入力しEnterを押してください。テストページが表示されたら手作業の設定は終了です。この一連の流れをplaybookにしていきます。
ターゲットノードを復元し手作業前の状態に戻してください。
7. playbookの作成
playbookは手作業工程の手順をもとに作成します。
コントロールノードで操作してください。
playbookを格納したりするためにroles配下にディレクトリの階層を作成します。作成後の階層は以下のようなイメージとなります。rolesディレクトリ配下に設定値別にディレクトリを作成。その配下に 『tasks』『templates』『vars』『defaults』『handlers』『meta』『files』ディレクトリが作成され、各ディレクトリに役割があります 。『tasks』ディレクトリは必須です。
今回は 『tasks』『handlers』『templates』『vars』を使用します。
最終的に完成する階層は以下のようになります。
[root@Kensyo ansible]# tree --charset=C
.
|-- ansible.cfg
|-- hosts
|-- roles
| |-- firewall
| | |-- handlers
| | | `-- main.yml
| | `-- tasks
| | |-- firewall.yml
| | `-- main.yml
| |-- httpd
| | |-- handlers
| | | `-- main.yml
| | |-- tasks
| | | |-- configuration.yml
| | | |-- install.yml
| | | `-- main.yml
| | |-- templates
| | | `-- httpd.conf.j2
| | `-- vars
| | `-- main.yml
| `-- selinux
| |-- handlers
| | `-- main.yml
| `-- tasks
| |-- main.yml
| `-- selinux.yml
`-- site.yml
7.1. httpdタスクの作成
httpdのディレクトリを作成します。
[root@Kensyo ansible]# pwd
/etc/ansible
[root@Kensyo ansible]# cd roles
[root@Kensyo roles]# mkdir httpd
[root@Kensyo roles]# cd httpd
[root@Kensyo httpd]# mkdir tasks
[root@Kensyo httpd]# cd tasks
[root@Kensyo tasks]# pwd
/etc/ansible/roles/centos/httpd/tasks
httpdパッケージのインストールするタスクを作成します。
ファイル名はわかりやすいように命名してください。『yum』モジュールを使用しパッケージをインストールします。
[root@Kensyo tasks]# vi install.yml
---
- name: httpdのインストールを行います
yum:
name: httpd
state: present
configファイルの修正するタスクを作成します。
[root@Kensyo tasks]# vi configuration.yml
---
- name: バックアップの確認をします。/etc/httpd/conf/httpd.conf
stat:
path: /etc/httpd.conf.org
register: httpd_conf_org
- name: バックアップを取得します。
copy:
src: /etc/httpd/conf/httpd.conf
dest: /etc/httpd/conf/httpd.conf.org
remote_src: yes
when: not httpd_conf_org.stat.exists
- name: httpd.confの修正をします。
template:
src: httpd.conf.j2
dest: /etc/httpd/coonf/httpd.conf
owner: root
group: root
mode: '0644'
notify: start
- meta: flush_handlers
playbookの詳細を記載します。
下記解説
『name』は作成者以外の人でも何のタスクなのかわかりやすく記載してください。
『stat』モジュールを使用しています。 指定したファイルが存在しているかどうか調べてくれるモジュールです。
『path』が対象ファイルのパスを示しています。
『register』はタスクの実行結果を変数として保存してくれます。 (今回は『stat』モジュールで調べた結果を変数として保存してくれます。)
---
- name: バックアップの確認をします。[/etc/httpd/conf/httpd.conf]
stat:
path: /etc/httpd.conf.org
register: httpd_conf_org
下記解説
『copy』モジュールを使用しています。本来はコントロールノードにあるファイルをターゲットノードに転送するモジュールですが、
『remote_src』を使用している為、 ターゲットノードでファイルをコピーしターゲットノードでファイルをペーストしています。
『src』がコピー元のパスです。『dest』がコピー先のパスになります。
『when』を使用し実行条件を制御します。バックアップファイルがターゲットノードにない場合のみ実行したいというように制御します。
『not httpd_conf_org.stat.exists』は先頭に『not』をつけ『ファイルが存在しない場合に実行する』となります。
『httpd_conf_org.stat.exists』は『httpd_conf_org』ネストの『stat』ネストの『exists』の値を表しています。
Ansibleは冪等性(何度実行しても同じ結果になること)を意識してplaybookを作成します。
copyモジュールでバックアップを一度作成し、 もう一度playbookを実行すると上書きされてしまうため、条件分岐を使用してバックアップを作成します。
- name: バックアップを取得します。[/etc/httpd/conf/httpd.conf]
copy:
src: /etc/httpd/conf/httpd.conf
dest: /etc/httpd/conf/httpd.conf.org
remote_src: yes
when: not httpd_conf_org.stat.exists
下記解説
タスクを作成する際はまず、公式ページから想定するモジュールがあるか探します。ない場合は他のモジュールを駆使し設定していきます。
本記事執筆時には、httpd.configを修正するようなモジュールがないため、『template』モジュールを使用しています。
『src』はテンプレートファイルの名前を記載します。絶対パスで記載しても構いません。
ファイル名で記載するとroles配下のtemplatesのファイル名を探しに行きます。
『dest』はコピー先のパスを記載します。『owner』『group』はファイルの所有権を記載します。『mode』はパーミッションです。
『notify』はタスク終了時に『handlers』ディレクトリに記載されている同名のタスクを実行します(サービスの再起動などによく使われます。)
『- meta: flush_handlers』を記載することによりhandlersは 『- meta: flush_handlers』 が記載されているタスクで実行されます。
『handlers』はplaybook実行の全タスクの最後に実行されるため、指定のタスクで再読み込み等行うことが可能になります。
- name: httpd.confの修正をします。
template:
src: httpd.conf.j2
dest: /etc/httpd/coonf/httpd.conf
owner: root
group: root
mode: '0644'
notify: start
- meta: flush_handlers
次にmain.ymlを記載します。基本的にはmain.ymlには設定値を記載せず、記載しているタスクを読み込ませる方が、後々メンテナンスしやすいため良いです。
『import_tasks』を使用し作成したタスクを読み込むようにしています。
[root@Kensyo tasks]# vi main.yml
- import_tasks: install.yml
- import_tasks: configuration.yml
『templates』配下に修正するconfigファイルを記載します。今回修正するのは接続ポートです。『jinja2』を使用し変数にしています。
『Listen {{ n.port }}』が設定したいところです。前後は変数を入れるための形式です。
『{{ n.port }}』は『Listen_port』という変数の『port』の値を呼び出し記述されます。
[root@Kensyo tasks]# cd /etc/ansible/roles/httpd/
[root@Kensyo httpd]# mkdir template
[root@Kensyo httpd]# cd template/
[root@Kensyo template]# vi httpd.conf.j2
(中略)
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
#Listen 80
{% for n in Listen_port %}
Listen {{ n.port }}
{% endfor %}
(中略)
『templates』で記載した変数を『vars』ディレクトリで明示的に記載します。
『vars』ディレクトリは変数を設定するところです。
[root@Kensyo template]# cd /etc/ansible/roles/httpd/
[root@Kensyo httpd]# mkdir vars
[root@Kensyo httpd]# cd vars/
[root@Kensyo vars]# vi main.yml
Listen_port:
- port: 8080
『handlers』を記載します。今回はデフォルトでインストールしてもサービスは起動されない状態でしたので、サービスを起動するように記載します。
『service』モジュールを使用しています。
[root@Kensyo tasks]# /etc/ansible/roles/httpd/
[root@Kensyo httpd]# mkdir handlers
[root@Kensyo httpd]# cd handlers
[root@Kensyo handlers]# vi main.yml
- name: start
service:
name: httpd
state: started
enabled: yes
7.2. firewallタスクの作成
firewallのディレクトリを作成します。『firewall』の設定にはモジュールが存在します。そのため、手作業時に行ったコマンドを記載するのではなく、モジュールの記載方法に沿ってタスクを作成します。
記載内容はhttpdの時と変わりません。モジュールが 違うため設定内容が変わっているだけになります。
[root@Kensyo handlers]# cd /etc/ansible/roles/
[root@Kensyo roles]# mkdir firewall
[root@Kensyo roles]# cd firewall
[root@Kensyo firewall]# mkdir tasks
[root@Kensyo firewall]# cd tasks
[root@Kensyo tasks]# vi firewall.yml
---
- name: ポートを開放します
firewalld:
port: 8080/tcp
zone: public
permanent: yes
state: enabled
notify: reload
- meta: flush_handlers
httpd同様にmain.ymlとhandlersの設定も記載します。今回は変数を使用した記載は必要ないため『vars』ディレクトリは作成していません。
[root@Kensyo tasks]# vi main.yml
- import_tasks: firewall.yml
[root@Kensyo tasks]# cd /etc/ansible/roles/firewall/
[root@Kensyo firewall]# mkdir handlers
[root@Kensyo handlers]# vi main.yml
---
- name: reload
service:
name: firewalld
state: reloaded
7.3. selinuxタスクの作成
同様にselinuxもディレクトリを作成します。
selinuxは設定後に再起動が必要なため、rebootモジュールを使用しターゲットノードを再起動させます。ターゲットノードが再起動してもplaybookの実行は途切れません。
[root@Kensyo handlers]# cd /etc/ansible/roles/
[root@Kensyo roles]# mkdir selinux
[root@Kensyo roles]# cd selinux
[root@Kensyo selinuxq]# mkdir tasks
[root@Kensyo selinux]# cd tasks
[root@Kensyo tasks]# vi selinux.yml
---
- name: selinuxを無効にします
selinux:
state: disabled
policy: targeted
notify: reboot
[root@Kensyo tasks]# vi main.yml
- import_tasks: selinux.yml
『handlers』を作成します。
[root@Kensyo tasks]# cd /etc/ansible/roles/selinux/
[root@Kensyo selinux]# mkdir handlers
[root@Kensyo selinux]# cd handlers
[root@Kensyo handlers]# vi main.yml
---
- name: reboot
reboot:
以上までが各種設定のタスクの作成になります。
次にsite.ymlを作成します。
[root@Kensyo tasks]# cd /etc/ansible
[root@Kensyo ansible]# vi site.yml
---
- hosts: all
gather_facts: false
remote_user: root
roles:
- httpd
- firewall
- selinux
『site.yml』はansible-playbookコマンドを実行する際に指定するplaybookです。 各『roles』を読み込み実行するように記載します。
『hosts』はhostsファイルに記載している情報を記載します。
(グループごと、ターゲットノードごとに指定できます。allはすべて該当されます。)
『gather_facts』はターゲットノードの情報をタスク実行前に取得します。任意で指定します。環境により処理時間が長いことがあるので今回は無効にしています。
『remote_user』ターゲットノードに接続するユーザを指定します。一般ユーザを記載したりすることもあります。
『roles』作成したroleを読み込ませています。記載した順(上から下に)に実行されるため、注意してください。
playbook作成章冒頭にディレクトリの階層を記載しましたが同様に作成されているでしょうか。
[root@Kensyo ansible]# tree --charset=C
.
|-- ansible.cfg
|-- hosts
|-- roles
| |-- firewall
| | |-- handlers
| | | `-- main.yml
| | `-- tasks
| | |-- firewall.yml
| | `-- main.yml
| |-- httpd
| | |-- handlers
| | | `-- main.yml
| | |-- tasks
| | | |-- configuration.yml
| | | |-- install.yml
| | | `-- main.yml
| | |-- templates
| | | `-- httpd.conf.j2
| | `-- vars
| | `-- main.yml
| `-- selinux
| |-- handlers
| | `-- main.yml
| `-- tasks
| |-- main.yml
| `-- selinux.yml
`-- site.yml
8. playbookの実行
ターゲットノードに実行します。
[root@Kensyo ansible]# pwd
/etc/ansible
[root@Kensyo ansible]# ansible-playbook site.yml -i hosts -k
SSH password:
ansible-playbookコマンドを使用します。『-i』を使用しインベントリファイルを指定します。
『-k』を使用しsite.ymlで指定した『remote_user』のパスワードを入力します。
実行するとSSH passwordが要求されます。
PLAY RECAP *************************************************************************************
targetnode : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
『ok』『changed』等の数字は環境により変わります。
実行後に『failed=1』失敗となっていないことを確認してください。
9. ターゲットノードで設定が変更されているか確認
Google Chrome等のブラウザを開きURL欄に[http://ターゲットノードのIPアドレス:8080]を入力しEnterを押してください。テストページが表示されたらplaybookは正常に記載でき実行できたことになります。
できない場合
ターゲットノードを確認し実際に設定したい状態になっていますでしょうか。
もし設定できていなければ、タスクを見直し修正等行ってください。手作業で設定できることは確認している為、タスクの記載に誤りがあると思われます。
おわりに
今回の検証は1台のターゲットノードに対して実行しました。そのため手作業の方が早く、Ansibleの必要性を感じるのは難しいかもしれません。
例えば、50台や100台に複数の設定を行う場合、手作業とAnsibleの自動化どちらが効率が良いでしょうか?
Ansibleを使用すれば様々な作業を自動化することができるのでぜひご活用ください。
参考
Ansible公式サイトでよく使用するモジュールの一覧先https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
初心者向け書籍『Ansible 構築・運用ガイドブック』
初心者~中級者向け書籍『Ansible実践ガイド』
非常に丁寧な解説ありがとうございました。
欲をゆうなら、ssh のあたりは、PermitRootLogin など多少の設定が必要なので、そのあたりもフォローしてくれると更に良いかなと思いました。
Akihito YAKOSHI様 Ansible入門者向け学習ガイド(CentOS編)をご覧いただきましてありがとうございます。
本Ansible学習ガイドは、Ansibleを構築するのに最低限の設定のみを記載しており、セキュアな設定部分などは省略して解説してます。
理由と致しましては、学習ガイドを参照いただく方がCentOSの初心者でもある可能性を考えております。
手が止まってしまうリスクをなるべく減らしたい思いがありましたので、本学習ガイドでは任意で設定する部分は省略させていただきました。
ですが、確かにAkihito YAKOSHI様からご要望がありましたセキュリティを考慮した考え方など、Ansibleを業務的に操作するには必要になります。
ですので、この学習ガイドを軸に、知識の肉付けができればよいのではないかと考えております。
本Ansible学習ガイドでは、SSHの設定などセキュリティを考慮した手順は記載していませんが、
今後新たに、Ansibleを使用するにあたっての第2、第3ステップに進むための参考資料を作成しようと考えておりますので、その際は参考にしてください。