使用Ansible进行网络连通性确认并执行playbook

ansible 是一种自动化工具。

这是一个用于配置管理服务器和云基础设施的工具。
通过在名为Playbook的YAML文件中编写任务,并让ansible执行,可以进行各种操作。
由于Playbook具有幂等性,即使多次执行相同的文件,结果也会相同。
(幂等性是指执行一次或多次操作结果相同的概念)

YAML是一种

YAML(YAML Ain’t Markup Language)是一种用于表示结构化数据的格式。
通过缩进来表示数据结构,使其非常易读。
此外,在YAML中,数据仅由数组、哈希和标量(数字、字符串和布尔值)表示。

基础设施即代码

用代码来管理基础架构的配置和自动化。可以进行版本控制和类似软件开发的CI,也可以构建基础架构。
有了这种概念,我明白了为什么像ansible这样通过代码来编写配置是一种好的选择。

亲身试用一下

我在工作中只使用过几次,当我试图在自己的环境中模仿这段代码时,遇到了各种问题。
如果你打算开始使用,我建议按照ansible的教程进行操作。
下面是我遇到问题的部分,如果按照教程进行操作,应该就不会出现这种情况。

做过的事情 (Zuò guò de

创建一个用于Ansible的目录,然后在那里创建以下文件,并应用到web服务器上。
所要做的是完全按照file:~中所写的内容,即在/tmp目录下创建hoge目录,并将其权限设置为775,所有者和组设置为apache。

- hosts: all
  user: root
  tasks:
    - name: Create hoge directory
      file: path=/tmp/hoge state=directory mode=0775 owner=apache group=apache

使用平时常用的命令来执行!(存在各种设置不足)

$ ansible-playbook site.yml -i "0.0.0.0"(適用させたいサーバのipアドレス)

[WARNING]: Host file not found: 0.0.0.0

[WARNING]: provided hosts list is empty, only localhost is available


PLAY RECAP *********************************************************************

据调查,似乎必须在库存文件中写入主机。库存文件默认情况下是/usr/local/etc/ansible/hosts,但由于可以使用-i选项来指定,因此我们将在ansible目录中创建hosts文件来进行对应。

$ ansible --help                                                                                                                                    (git)-[master]
Usage: ansible <host-pattern> [options]
(省略)
Options:
-i INVENTORY, --inventory-file=INVENTORY
                        specify inventory host path
                        (default=/usr/local/etc/ansible/hosts) or comma
                        separated host list.
[適当な名前]
0.0.0.0(適用させたいサーバのipアドレス)

在进行教程确认的同时继续前进。

从这附近开始查看教程,然后按照教程进行了通信检查。
我创建了hosts文件,但是现在出现了权限问题。。

$ ansible -i hosts 0.0.0.0 -m ping
0.0.0.0 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey).\r\n",
    "unreachable": true
}

看起来只需要在hosts文件中设置用户和私钥。

[適当な名前]
0.0.0.0 ansible_ssh_user=ec2-user ansible_ssh_private_key_file=~/.ssh/id_rsa

我会打乒乓球了!

$ ansible -i hosts 0.0.0.0 -m ping                                                                                                            (git)-[master]
0.0.0.0 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

干跑

既然准备好了,现在来试一下实际创建的playbook。使用ansible时,在执行之前进行dry-run是个好方法。以下是从下面的教程中引用的。

指定”check”选项时,虽然不会进行任何更改,但实际执行时会输出此结果。

$ ansible-playbook site.yml -i hosts -C                                                                                                             

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [0.0.0.0]

TASK [Create hoge directory] ***************************************************
changed: [0.0.0.0]

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

— 检查和 -C 是相同的。
通过检查,我们可以看到变更只发生在了一个地方,即 TASK [Create hoge directory] 的状态被标记为 changed,所以看起来符合预期。
现在只有一个任务,这很好,但如果任务变多或者多人共同操作时,
可能存在一些未应用的任务或者直接修改而不使用ansible的情况,
因此,在执行前进行 dry-run,确保没有意外的变更会是个好主意。

执行playbook

那么最后一次执行然后结束了。
然而却失败了。

$ ansible-playbook site.yml -i hosts                                                                                                                

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [0.0.0.0]

TASK [Create hoge directory] ***************************************************
fatal: [0.0.0.0]: FAILED! => {"changed": false, "failed": true, "gid": 500, "group": "ec2-user", "mode": "0775", "msg": "chown failed: failed to look up user apache", "owner": "ec2-user", "path": "/tmp/hoge", "size": 4096, "state": "directory", "uid": 500}
    to retry, use: --limit @/Users/username/workspace/aws/ansible/site.retry

PLAY RECAP *********************************************************************
0.0.0.0              : ok=1    changed=0    unreachable=0    failed=1

因为无法执行chown命令,所以将其更改为ec2-user。

/ansible/site.yml
- hosts: all
  user: root
  tasks:
    - name: Create hoge directory
      file: path=/tmp/hoge state=directory mode=0775 owner=ec2-user group=ec2-user # ここのownerとgroupを修正

补充

可能会被认为在dry-run中没有问题。但是,由于dry-run并没有实际执行,所以无法检测到需要执行才能发现的错误。
与本例相反的是,即使在dry-run中失败,实际执行时也可能没有问题。
例如,当创建一个像安装软件包→更改已安装软件包设置的任务时。
由于dry-run不会执行软件包安装,因此会收到“不存在这样的软件包!”的错误提示,但实际执行时,软件包将被安装,所以没有问题。

重新执行

终于完成了。就是这样!

$ ansible-playbook site.yml -i hosts

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [0.0.0.0]

TASK [Create hoge directory] ***************************************************
changed: [0.0.0.0]

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