ansible
目录:
介绍
ansible基于python语言实现,由paramiko,pyYaml,Jinja2等模块实现
还有些工具
- saltstask
- fabric
- capistrano
- cfengine
- chef
是一个模块化的程序
- core modules 基础模块
- custom modules 自定义模块
- plugins 插件,例如连接插件(connection plugins,ssh,不依赖agent来实现远程操作。)
- playbook
安装
epel源中会有ansible的
- ansible.cfg为主配置文件
- hosts主机清单,可以定义变量
- roles角色清单
由于ansible基于ssh来实现相关操作,所以需要ansible能够基于密钥的方式联系各个被管理节点,当然也可以通过写入用户密码的方式
-f
forks 一次执行几个-m
module_name 默认为command-a
arg 参数
ansible-doc -l
查看支持的模块
-s <module_name>
指定模块的详细内容
需要配置hosts,默认有示例
all所有主机
常见模块
- command 但是不能使用变量,可以用shell
- cron 可以在主机生成定时任务
-m cron -a 'minute="*/10" job="/bin/echo why" name="why test"'
,移除添加参数state=absent,默认为present安装 - user 创建用户
- group 创建组
- copy 复制文件
copy -a 'src=/etc/fstab dest=/tmp/fstab owner=root mode=640'
,也支持直接访问指定文件内容替代src,'content="Hello \nwhy"'
- file 设置文件的属性,软链等 file -a 'src=/etc/fstab path=/etc/fstab.link state=link'
- ping
- service 用于管理注册的service
- shell 执行命令,shell -a 'echo 123456|passwd --stdin why'
- script 将本地脚本复制到远程主机执行
- yum 安装程序包
- setup 收集远程主机的facts
Ansible会使用yaml的基础元素,定义变量,Inventory,条件测试
yaml相关参考yaml
playbook
变量
变量命名
仅能由数字,字母和下划线组成,只能以字母开头
facts
ansible可以使用facts变量
任务输出
ansible可以使用task的输出
tasks:
- shell: /usr/bin/foo
register: foo_result
ignore_errors: True
命令行传递
ansible-playbook test.yaml --extra-vars "host=www user=why"
通过roles传递
- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/tmp', port: 8000 }
Inventory
Inventory配置
默认为通过配置文件/etc/ansible
Inventory格式
默认可以协程主机名,如果不是默认端口,需要标注一下
node1.whysdomain.com:2222
主机分组,一个主机可以在多个组中
[web]
node1.whysdomain.com
node2.whysdomain.com
node3.whysdomain.com
[db]
node3.whysdomain.com
node4.whysdomain.com
如果和上述主机名遵循相同的规则,可以通过列表方式标示主机
[web]
node[1:3].whysdomain.com
[db]
node[3:4].whysdomain.com
主机变量
[web]
node1.whysdomain.com http_port=80
node2.whysdomain.com
node3.whysdomain.com
组变量
组内所有主机
[web]
node1.whysdomain.com
node2.whysdomain.com
node3.whysdomain.com
[web:var]
ntp_server=ntp.whysdomain.com
组嵌套
[nginx1]
web0[1:5].whysdomain.com
[nginx2]
web1[1:5].whysdomain.com
[web:children]
nginx1
nginx2
inventory参数
也可以在这些inventory参数指定ssh相关的user,passwd等
编写playbook
playbook的Tasks,Variables,Templates,Handler(在满足特定条件的时候触发)和roles
# 应用的目标主机
- host: web
# 参数
vars:
http_port: 80
max_clients: 256
# 执行用户
remote_user: root
# 接下来需要执行的命令
tasks:
- name: create nginx group
group: name=nginx system=yes gid=208
- name: yum nginx
yum: name=nginx
在执行的过程中,第一个任务的所有主机完成之后才会执行第二个任务,对于命令或者脚本不为零的情况,可以指定参数忽略错误信息或者对脚本做或操作
host: web
remote: root
tasks:
- shell: /usr/bin/foo
- ignory_errors: True
或
host: web
remote: root
tasks:
- shell: /usr/bin/foo || /bin/true
handler
host: web
remote: root
tasks:
- name: create nginx group
group: name=nginx system=yes gid=208
notify:
- restart_nginx
handlers:
- name: restart_nginx
service: name=nginx state=restart
使用变量
host: web
remote: root
vars:
- package: nginx
tasks:
- name: create {{ package }} group
group: name={{ package }} system=yes gid=208
notify:
- restart_nginx
handlers:
- name: restart_nginx
service: name=nginx state=restart
条件
when
host: web
remote: root
tasks:
- name: create nginx group
group: name=nginx system=yes gid=208
when: ansible_fqdn == 'node01.whysdomain.com'
with_items 迭代
host: web
remote: root
tasks:
- name: create nginx group
group: name={{ item }} system=yes gid=208
with_items:
- nginx
- httpd
也支持hash的方式
host: web
remote: root
tasks:
- name: create nginx group
group: name={{ item.name }} system=yes gid={{ item.gid }}
with_items:
- { name: 'nginx', gid: 208 }
- { name: 'httpd', gid: 209 }
templates
使用jijia2
tags
在某个或者某些task定义tag,然后执行ansible-playbook的时候指定tags参数就会执行带有该tag的task
host: web
remote: root
tasks:
- name: create nginx group
group: name=nginx system=yes gid=208
tag: always
特殊tag
always,不论指定了什么tags都会执行
roles
roles可以理解为yml的扩展