使用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