Ansible配合aws使用入门
ansible是一整套的部署脚本,以python实现的,还是很有些粉丝了,在学习过程中,需要了解它和aws配合的使用,特地从头进行了学习,进行了一系列的记录如下。
安装
$pip3 install virtualenv
$virtualenv -p /usr/bin/python3 myEnv
$source myEnv/bin/activate
$(myEnv) xx $ pip3 install awscli
pip3 install ansible
pip3 install boto3
pip3 install botocore
pip3 install boto
boto是aws的python api实现。
inventory file
定义所有的服务器ip 用 ansible -i指定。
$vim hosts
[local]
localhost ansible_connection=local ansible_python_interpreter=/home/chenzhen/compx527/bin/python
[myserver]
2.2.2.2
[webservers]
#1.1.1.1 ansible_ssh_private_key_file=/home/ubuntu/.ssh/oof1-ec2-key.pem
支持对不同服务器进行分组管理。下面的例子在调webservers这个组的机器。
ansible -i inventories/hosts webservers -m ping
模块
-i指定机器列表,-m指定运行的模块,还可以传参数,直接在后面加。ansible支持核心模块、额外模块和自定义模块。
ping模板并不是ICMP的ping,是ansibe自己实现的ping,用来检测server是否可用可登录且有python。
要开发自己的模块,需要会python和json包,返回的都是json。执行ansible时传入的参数都以key=value的串传到python脚本里,需要自己解析。用shlex可以简单读入所有空格间隔的串,再在里面找=号。
在后面提到的playbooks中,大量使用模块以下知识:
很重要的是模块要有幂等性,就是不怕多次执行。
有两个特殊的module一个是command一个是shell,它们不是key=value的,面是直接像正常在Linux用。执行成功返回非0。
module里的action太长的话,可以像python一样折行缩进。一种特殊的action是template,用来发配置文件的。
playbooks
ansible直接命令一个一个操作执行的过程是ad-hoc的执行,playbooks提供了编排的能力,可以把一堆操作顺序配置起来。比如说,上传代码+复制配置+重启tomcat+重启nginx等放在一个playbooks里,确保每个执行成功后才执行下一个。下例是一个play(多个play在一起形成playbooks)。一个play里可以多个task,这多个task都是顺序的,必须在一个或一批机器完成才执行下一个task。一个task就是一个模块。
---
- hosts: webservers
vars: # vars定义的变量,可以后文中使用 {{http_port}}。
http_port: 80
max_clients: 200
romote_user: root
# 以上指定了host和user,支持通配符啥的代表一批机器,sudo: yes 给sudo权限。再加sudo_user: xxx 切到其他用户也ok。
tasks:
- name: update nginx
yum: pkg=nginx state=latest
# 实际上,到每个taks里,还可以指定运行的远程用户,还是remote_user: xxx。
- name: write config
template: src=/srv/nginx.js dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: ensure nginx is running
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
handlers就像函数一样,把一群task放在一起,配合notify使用。以上文件notify配合handlers翻译为:当template指定的文件内容被改动时,重启nginx。
综上,关键的因素有:hosts\play\task\template\notify\handlers。
对应基本上就是:机器\任务列表\单个操作\配置文件\配置变化\配置变化后的定义行动。
Run a Playbook
ansible-playbook main.yml -f 10
-f 10代表以10个并行跑,速度更快。默认为5。
如果想看影响哪些机器,可以执行:
ansible-playbook main.yml --list-hosts
重用大法:roles & include
roles角色,主要是考虑以角色来区分操作,操作DB和操作nginx肯定是不一样的任务。
include主要是为了重用各处的task或者play。
简单说,关系就是 roles–> include –> m * play + n * task + x * play and so on。
roles其实是一些约定大于配置的设计,一旦使用了role,则在固定的目录下寻找文件,如果有则include,如果没有也不报错。roles/x/task|handlers|vars|meta|files|templates/main.yml。 当然也可以直接指定目录,这就复杂一点了。
还支持在role前role后定义 pre_taks和post_tasks。
通过dependencies来定义 不同的role的依赖关系或各种公共配置。进而控制先后顺序,比如先安装db,后初始化db,再安装php,上传代码,等等。
–tags xxx 在playbook使用时,会去只运行关键字一致的部分代码。
defaults/main.yml存的是变量,其他大多是存的module(tasks)。
帮助文档
action众多,难免有不认识的,所以这个命令犹为关键,ansible-doc ping。
也可以直接写python代码调用ansible,无缝。
https://docs.ansible.com 直接按module搜,非常有用。
aws协作
有两个办法上传文件到s3:command + aws c3 cp && s3_sync
如果使用了command + aws 命令,必须注意先运行 aws configure。
inventories/hosts总是有localhost的原因是为了在本地dry run。