Ansible是配置管理和应用部署工具,
Ansible默认通过SSH协议管理服务器。
安 装
pip3 install ansible
# Mac也可以用brew安装
brew install ansible
定 义 服 务 器 的 清 单 列 表 文 件
创建/etc/ansible/hosts
文件,文件内容:
[webservers]
10.211.55.3 ansible_ssh_user=parallels
10.211.55.4 ansible_ssh_user=root
[dbservers]
#设置别名
Ubuntu ansible_ssh_host=10.211.55.4 ansible_ssh_user=parallels
#设置本地的连接类型
localhost ansible_connection=local
# 把一个组作为另一个组的子成员
[southeast:children]
webservers
servers
[other]
# foo.example.com
# db[01:20].jason.com #db01到db20这20个服务器
# db-[a:f].example.com
# db.jason.com:5501 #使用5501作为ssh连接端口
hosts文件参考:Inventory文件
使用
ansible
Usage: ansible <host-pattern> [options]
# -m MODULE_NAME, --module-name=MODULE_NAME
# module name to execute (default=command)
# -a MODULE_ARGS, --args=MODULE_ARGS
# module arguments
# -f FORKS, --forks=FORKS
# specify number of parallel processes to use
# (default=5)
# -f表示同时执行,提高并发效率
➜ ~ ansible all -m command -a"whoami" -f 3
10.211.55.3 | CHANGED | rc=0 >>
parallels
Ubuntu | CHANGED | rc=0 >>
parallels
localhost | CHANGED | rc=0 >>
zhoujie
host-pattern
参考Working with Patterns
-m
参考:全部模块
# 创建一个默认权限的文件,用ansible修改文件权限
➜ ~ touch /tmp/file
➜ ~ ls -l /tmp/file
-rw-r--r-- 1 zhoujie wheel 0 Oct 13 12:10 /tmp/file
# 可以修改目标文件权限、用户组
➜ ~ ansible localhost -m file -a"dest=/tmp/file mode=666 owner=zhoujie group=wheel"
➜ ~ ls -l /tmp/file
-rw-rw-rw- 1 zhoujie wheel 0 Oct 13 12:10 /tmp/file
➜ ~ ansible 10.211.55.3 -a"ls /tmp/file"
10.211.55.3 | FAILED | rc=2 >>
ls: cannot access '/tmp/file': No such file or directorynon-zero return code
# 把本地文件复制到目标服务器下
➜ ~ ansible 10.211.55.3 -m copy -a"src=/tmp/file dest=/tmp/file"
➜ ~ ansible 10.211.55.3 -a"ls /tmp/file"
10.211.55.3 | CHANGED | rc=0 >>
/tmp/file
# “state=present”确保安装,但是不更新。
# 如果使用“state=latest”表示确保安装到最新版;
# “state=absent”表示确保没有安装。
# 不同的系统安装包的模块不同,apt模块仅限Debian/Ubuntu系统
➜ ~ ansible 10.211.55.3 -m apt -a"name=nginx state=present"
#使用Git克隆最新的代码到目录
➜ ~ ansible 10.211.55.3 -m git -a"repo=https://github.com/zhoujie903/superlists.git dest=/home/parallels/sites/superlists version=HEAD"
# 下载文件
➜ ~ ansible 10.211.55.3 -m get_url -a"url=http://download.redis.io/redis-stable.tar.gz dest=/tmp/redis-stable.tar.gz"
ansible-playbook
剧本(Playbooks)是Ansible的配置、部署、编排语言。它们可以被描述为一个需要远程主机执行的命令集合。
剧本文件:playbook.yml, 使用YAML格式
---
- hosts: all
vars:
host: "www.superlist.com"
tasks:
- name: Deadsnakes PPA to get Python 3.6
apt_repository:
repo='ppa:fkrull/deadsnakes'
- name: make sure required packages are installed
apt: pkg=nginx,git,python3.6,python3.6-venv state=present
- name: add nginx config to sites-available
#.j2为模板文件,模板文件里一般使用上面vars字段定义的变量
template: src=./nginx.conf.j2 dest=/etc/nginx/sites-available/{{ host }}
notify:
- restart nginx #这里的值为下面handlers:name的值
- name: add symlink in nginx sites-enabled
file:
src=/etc/nginx/sites-available/{{ host }}
dest=/etc/nginx/sites-enabled/{{ host }}
state=link
notify:
- restart nginx
- name: write gunicorn service script
template:
src=./gunicorn.service.j2
dest=/etc/systemd/system/gunicorn-{{ host }}.service
notify:
- restart gunicorn
handlers:
- name: restart nginx #上面有2个任务都发出了notify,这个handler只执行一次
service: name=nginx state=restarted
- name: restart gunicorn
systemd:
name=gunicorn-{{ host }}
daemon_reload=yes
enabled=yes
state=restarted
playbook文件里可以包含的几个重要概念:hosts
、vars
、tasks
、handlers
playbook文件里还可包含的重要概念:roles
[见下文]
大概的意思:对hosts
中匹配到的每台主机按顺序执行tasks
中定义的每个任务,
handlers
只有在全部tasks
执行完时且有任务发出notify
时,才会执行相应的操作,不然不执行。
- 运行剧本文件:
ansible-playbook [options] playbook.yml [playbook2 ...]
- 检查格式是否正确:
ansible-playbook --syntax-check playbook.yml
- 提供密码:
ansible-playbook playbook.yml -K
-K
是"ask for privilege escalation password"
- 运行部分任务:
ansible-playbook -t "delete, create" playbook.yml
,
-t
是"-t TAGS, --tags=TAGS only run plays and tasks tagged with these values"
- 从某个任务为起点:
ansible-playbook playbook.yml --start-at-task="install packages"
- 条件执行:当
bool_var: false
时,TASK [create file]
任务不执行
➜ Desktop ansible-playbook playbook.yml
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [create file] *************************************************************
changed: [localhost]
TASK [delete file] *************************************************************
ok: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0
Roles
当我们刚开始学习运用 playbook 时,可能会把 playbook 写成一个很大的文件,到后来可能你会希望这些文件是可以方便去重用的,所以需要重新去组织这些文件。
Roles
基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。
基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles
目录结构:
playbook.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
rolename/
tasks/
defaults/
meta/
一个 playbook[playbook.yml] 如下:
---
- hosts: webservers
roles:
- common
- rolename
这个 playbook 为一个角色 ‘x’[rolename] 指定了如下的行为:
- 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
- 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
- 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
- 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中
- 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
- 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
- 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
- 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。
ansible-galaxy
Ansible Galaxy是一个免费网站,
用于查找,下载,评级和审查各种社区开发的Ansible角色,
可以成为您自动化项目快速启动的绝佳方式。
比如用ansible在Mac上安装Homebrew
ansible-galaxy install geerlingguy.homebrew
ansible-galaxy
: Perform various Role related operations.
网友评论