Linux之Ansible
Ansible简介
Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基于Python研发,糅合了人多老运维工具的优点实现了批量操作系统配置,批量程序的部署,批量运行命令等功能。
Ansible的特性:
-
模块化设计
- 调用特定的模块来完成特定任务
-
基于pythone语言实现
- 由paramiko,PyYAML(半结构化语言)和jinja2三个关键模块实现
-
部署简单
- 是agent less类型
-
主从模式工作
-
支持自定义模块
-
支持playbook
-
易于使用
-
支持多层部署
-
支持异构IT环境
Ansible的组件
img-
ansible core
- 核心模块
-
host inventory
- 主机库,能够管控的主机列表,没有放进这个列表的,都不能进行管控
-
connection plugins
- 连接插件,一般默认基于ssh协议连接
-
modules
- core modules(自带模块)
- custom modules(自定义模块)
-
plugins
- 为ansible扩展功能
-
playbook
- 剧本,按照所设定编排的顺序执行完成安排的任务
ansible的配置文件
-
主配置文件
- /etc/ansible/ansible.cfg
-
host inventory定义管控主机
- /etc/ansible/hosts (遵循INI风格,中括号中的字符是组名,一个主机 可以属于多个组)
[webservers] node1.zhenping.me node2.zhenping.me 172.16.36.70 172.16.36.71
ansible安装
- yum install ansible
ansible命令
-
使用格式
-
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-
-a
:指定模块的参数 -
-f #
:一次要管理几个主机,默认为5个 -
-m MOUDULE
: 指定模块 -
<host-pattern>
: 事先需要定义的hosts文件中的主机列表 -
-i PATH
: 指明使用的host inventory文件路径
-
-
ansible-doc命令
获取模块列表,及模块使用格式
-
使用格式
-
ansible-doc [-l] [-m MODULE]
-
-l
: 列出支持的核心模块 -
-s MODULE
: 查看模块的用法
-
-
ansible常用模块
一、command模块
-
功能
- 能在远程节点运行一个命令,但不能运行有管理的命令,command模块的参数非为kv格式,而是直接给出要执行的命令
-
使用示例
-
ansible all -a 'ntpdate 172.16.0.1'
(其是默认模块,可省略模块名称)
-
[root@Centos7 ~]# ansible all -a 'ntpdate 172.16.0.1'
172.16.36.61 | success | rc=0 >>
29 Feb 19:36:07 ntpdate[2360]: step time server 172.16.0.1 offset 135.642843 sec
172.16.36.60 | success | rc=0 >>
29 Feb 19:36:07 ntpdate[2402]: step time server 172.16.0.1 offset 135.687205 sec
172.16.36.71 | success | rc=0 >>
29 Feb 19:36:13 ntpdate[2345]: step time server 172.16.0.1 offset -28665.158303 sec
172.16.36.70 | success | rc=0 >>
29 Feb 19:36:13 ntpdate[32087]: step time server 172.16.0.1 offset -28664.450998 sec
二、user模块
-
功能
管理用户
-
使用格式
-
ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
- name= : 创建的用户名
- state= : present新增,absent删除
- force= : 删除用户的时候删除家目录
- system= : 创建系统用户
- uid= : 指定UID
- shell= : 指定shell
- home= : 指定用户家目录
-
-
使用示例
ansible webserver -m user -a "name=zhenping state=present system=true"
ansible webserver -m user -a "name=zhenping state=absent"
三、group模块
-
功能
组管理
-
使用格式
-a "name= state={present|absent} gid= system="
-
使用示例
ansible webserver -m group -a "name=user1 state=present system=true"
四、cron模块
-
功能
定义cron任务
-
使用格式
-a "name= state= minute= hour= day= month= weekday= job= state={present|absent"
-
使用示例
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &> /dev/null' name='sync time' state=present"
五、ping模块
-
功能
测试网络连通性, ping模块没有参数
-
使用格式
ansible all -m ping
-
使用示例
[root@Centos7 ~]# ansible all -m ping
172.16.36.61 | success >> {
"changed": false,
"ping": "pong"
}
172.16.36.60 | success >> {
"changed": false,
"ping": "pong"
}
172.16.36.70 | success >> {
"changed": false,
"ping": "pong"
}
172.16.36.71 | success >> {
六、file模块
功能
文件创建和删除
使用格式
-
-a "path= mode= owner= group= state={directory|link|hard|touch|file|absent} src= "
- path= : 目标
- src= : 原文件
- state= : 文件类型
使用示例
ansible webserver -m file -a "path=/root/fstab src=/etc/fstab state=link"
~]# ansible webserver -m file -a "path=/root/testfile state=directory"
七、copy模块
功能
文件复制,把管理端的文件复制到远程主机各一份
使用格式
-a "src= dest= mode= owner= "
使用示例
ansible webserver -m copy -a "src=/root/testfile.txt dest=/root/testfile.ansible"
八、yum模块
功能
实现程序包安装及管理
使用格式
-
-a "name= conf_file= state={present|latest|absent} enablerepo= disablerepo= "
- state=latest : 安装最新版本
- conf_file= : 使用指定repo的配置文件
使用示例
ansible webserver -m yum -a 'name=nginx state=absent'
九、service模块
功能
实现服务管理
使用格式
-a "name= state={started|stoped|restarted} enabled= runlevel= "
使用示例
ansible webserver -m service -a "name=nginx state=started enabled=true
十、shell模块
功能
运行shell命令,其是启动一个子shell进程来运行命令,它可以支持管道传送
使用格式
-a 'command'
使用示例
ansible webserver -m shell -a "echo "zhenping.me" | passwd --stdin user1"
十一、script模块
功能
指定本地的脚本文件,到远程主机运行一次
使用格式
-a "/path/to/script"
使用示例
*ansible webserver -m script -a '/root/test.sh'
十二、setup模块
功能
收集远程指定主机的facts信息,其将收集的信息保存在各变量中,变量引用方法为:直接引用名称
使用示例
ansible 172.16.36.71 -m setup
[root@Centos7 ~]# ansible 172.16.36.71 -m setup
172.16.36.71 | success >> {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.16.36.71"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fed1:dcb5"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "05/20/2014",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-229.el7.x86_64",
"LANG": "zh_CN.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rhgb": true,
"ro": true,
"root": "UUID=cdd3548e-caf3-46cb-b81c-03f443325edc"
},
"ansible_date_time": {
"date": "2016-02-29",
"day": "29",
"epoch": "1456751201",
"hour": "21",
"iso8601": "2016-02-29T13:06:41Z",
"iso8601_micro": "2016-02-29T13:06:41.194636Z",
"minute": "06",
"month": "02",
"second": "41",
"time": "21:06:41",
"tz": "CST",
"tz_offset": "+0800",
"weekday": "Monday",
"year": "2016"
},
"ansible_default_ipv4": {
"address": "172.16.36.71",
"alias": "eno16777736",
"gateway": "172.16.0.1",
"interface": "eno16777736",
"macaddress": "00:0c:29:d1:dc:b5",
"mtu": 1500,
"netmask": "255.255.0.0",
"network": "172.16.0.0",
"type": "ether"
},
.........
playbooks剧本
简介
playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。其是使用YAML(Yet Another Markup Language),类似于半结构化语言,声明式配置,可读性较高。易于与脚本语言交互
核心组件
-
Tasks
:任务 -
Variables
: 变量-
inventory参数:(用于hosts定义的主机后面,多个使用空格分隔)
- ansible_ssh_port : 指定ssh端口
- ansible_ssh_user : 指定ssh用户
- ansible_ssh_pass : 指定ssh用户登录认证密码,明文密码
- ansible_sudo_pass : 指明sudo时候的密码
[webserver] 172.16.36.70 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=zhenping.me
-
-
template
: 模板 -
Handles
: 处理器 -
Roles
: 角色,用于调度不同的playbooks
YAML语法格格式
-
任何数据结构都用缩进进来标识,可以嵌套
-
每一行是一个键值数据key:value,使用冒号分隔,若想在一行标识需要使用{}和,将多个kv分隔开
-
列表使用
-
标识 -
示例:
- hosts: webserver
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: start nginx
service: name=nginx state=started enabled=true
- name: install php-fpm
yum: name=php-fpm state=present
- name: start php-fpm
service: name=php-fpm state=started enabled=true
vars
handlers
- hosts: dbserver
remote_user: root
tasks:
- name: install mysql
yum: name=mysql state=present
playbook的变量
变量命名方式
字母、数字和下划线组成,仅能以字母开头
变量的各类
-
facts
- 由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中,无须声明,可直接调用
-
自定义变量
- 通过命令行传递
- ~]# ansible-playbook test.yml -extra-vars "hosts=www user=zhenping"
- 通过roles传递
- 通过命令行传递
-
主机变量
- 定义在inventory中的主机之后的变量,直接传递给单个主机的变量
[webserver] 172.16.36.70 username=zhenping pass=zhenping 172.16.36.71
-
主机组变量
- 定义在inventory中的组上的变量
[webserver] 172.16.36.70 172.16.36.60 [webserver:vars] var1=value var2=value
playbook调用变量的示例
- hosts: webserver
remote_user: root
vars:
user: user2
pass: 123321
tasks:
- name: add user
user: name={{ user }} state=present
- name: set password
shell: /bin/echo {{ pass }} | passwd --stdin {{ user }}
手动运行playbook脚本时,传递变量(手动传递时,优先级要高于脚本中的变量)
ansible-playbook script.yml --extra-vars "username=ubunt"
ansible-playbook script.yml -e VARS
playbook的条件测试
在某task后面添加when子句,即可实现条件测试功能,when语句支持jinja2语法
####当主机的操作系统为redhat系列操作系统时,才执行yum安装
- hosts : webserver
remote_user : root
tasks :
- name: yum install keepalived
yum: name=keepalived state=present
when: ansible_os_family == "ReaHat"
- name: say hello
shell: /bin/echo "hello world"
playbook的迭代
在task中调用内置的Item变量,在某task后面使用with_items语句来定义元素列表
- hosts: webserver
remote_user: root
tasks:
- name: user add
user: name={{ item }} state=present
with_items:
- testuser1
- testuser2
- testuser3
- testuser4
- hosts: webserver
remote_user: root
tasks:
- name: user add
user: name={{ item.name }} state=present group={{ item.groups }}
with_items:
- { name: 'tom2', groups: 'tom' }
- { name: 'tom2', groups: 'tom2' }
playbook--handlers: 处理器、触发器
只有在其关注的条件满足时,才会被触发执行的任务
示例:只有原配置文件被修改了,才会重新加载服务
- hosts: webserver
remote_user: root
tasks:
- name: yum install nginx
yum: name=nginx state=present
- name: start nginx
service: name=nginx state=started enabled=true
- name: copy configuration file
copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=reloaded
Roles: 角色
roles用于实现“代码复用”,让playboo中的各元素组织起来,roles以特定的层次型格式组织起来的playbook元素(vars,tasks,template,handlers),可被playbook以roles的名字直接调用
roles目录结构
-
webserver/
: 主机组文件夹-
files/
: 存放文件,此角色中用到的所有文件均放置于此目录中 -
templates/
: jinja2模板文件存放位置 -
tasks/
: 任务列表文件,可以有多个,但至少有一个叫做main.yml的文件,其它文件要被main.yml包含 -
handlers/
: 处理器列表文件,可以有多个,至少有一个叫做main.yml的文件,其它文件要被main.yml包含 -
vars/
: 变量字典文件,可以有多个, 但至少有一个叫做main.yml的文件,其它文件要被main.yml包含 -
meta/
: 元数据,用于定义此角色的特殊设定及依赖关系等
-
示例:
~]# cd /etc/ansible/soles
~]# mkdir -pv webserver/{files,vars,tasks,handlers,meta,templates}
~]# cd webserver/
~]# vim vars/main.yml
user: daemon
group: daemon
~]# vim tasks/main.yml
- name: remove nginx
yum: name=nginx state=absent
- name: install apache
yum: name=httpd state=present
- name: start & enable httpd
service: name=httpd state=started enabled=true
- name: install configuration file
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: restart httpd servic
~]# vim handlers/main.yml
- name: restart httpd service
service: name=httpd state=restarted
~]# cp /etc/httpd/conf/httpd.conf /root/webserver/template/httpd.conf.j2 #准备示例文档
~]# vim templates/http.conf.j2
....
User {{ user }}
Group {{ group }}
....
~]# cd ../.. #与roles同级的目录
~]# vim webserver.yml
- hosts: webserver
remote_user: root
roles:
- webserver
~]# ansible-playbook webserver.yml
PLAY [webserver] **************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.36.70]
ok: [172.16.36.71]
TASK: [webserver | remove nginx] **********************************************
ok: [172.16.36.70]
ok: [172.16.36.71]
TASK: [webserver | install apache] ********************************************
ok: [172.16.36.70]
ok: [172.16.36.71]
TASK: [webserver | start & enable httpd] **************************************
ok: [172.16.36.71]
ok: [172.16.36.70]
TASK: [webserver | install configuration file] ********************************
ok: [172.16.36.70]
ok: [172.16.36.71]
PLAY RECAP ********************************************************************
172.16.36.70 : ok=5 changed=0 unreachable=0 failed=0
172.16.36.71 : ok=5 changed=0 unreachable=0 failed=0
#####可以为roles传递变量
~]# vim dbserver.yml
- hosts: 172.16.36.60
remote_user: root
roles:
- { role: webserver, user=nobody }
- { role: dbserver, user=mysql } #可以调用多个role
######使用tags参数,只调用某个tasks(以下示例只触发了install config的任务)
~]# vim roles/webserver/tasks/main.yml
- name: remove nginx
yum: name=nginx state=absent
- name: install apache
yum: name=httpd state=present
- name: start & enable httpd
service: name=httpd state=started enabled=true
- name: install configuration file
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: restart httpd service
tags: conf
[root@Centos7 ~]# ansible-playbook -t conf webserver.yml
PLAY [webserver] **************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.36.71]
ok: [172.16.36.70]
TASK: [webserver | install configuration file] ********************************
ok: [172.16.36.70]
ok: [172.16.36.71]
PLAY RECAP ********************************************************************
172.16.36.70 : ok=2 changed=0 unreachable=0 failed=0
172.16.36.71 : ok=2 changed=0 unreachable=0 failed=0