1、What's the Asible?
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
1.1、Ansible's structure
- Inventory
- Modules
- Ad Hoc Commands
- Playbooks
- Tasks
- Variables
- Templates
- Handlers
- Roles
Host Inventory : 主机库,用于存放管控的主机列表。
Core Modules : 核心模块
Custom Modules : 自定义模块
Ad Hoc Commands :
Playbooks : 剧本,按照设定的顺序执行完成任务。
Tasks : 任务
Variables : 变量
Templates : 模板
Handlers : 处理器
Roles : 角色,用于调度不同的playbooks.
2、How to use Ansible?
安装环境 : CentOS7
所需软件包 : Ansible(epel源)
2.1、Ansible's configuration files
-
主配置文件
- /etc/ansible/ansible.cfg
-
Host Inventory
[webserver] 192.168.0.14 192.168.0.15 [dbserver] 192.168.0.14
2.2、ansible命令
ansible
: 事先定义在hosts文件中的主机列表
-m module_name : 指定模块的名称
-a args : 指定模块的参数
[options] : 命令的其它参数
使用实例
ansible webserver -m shell -a "ss -tnl" #查看webserver主机列表中的主机的TCP端口是否处于监听状态
ansible webserver -m yum -a "name=httpd state=present" #安装httpd服务
2.3、ansible-doc命令
ansible-doc [-l] [-s] [module...]
- -l : 列出可用的模块
- -s Module : 查看指定模块的用法
2.4、ansible常用模块
2.4.1 command模块
- 功能
- 在远程主机上运行一个命令,直接给出要执行的命令,但不能运行管理
类命令。
- 在远程主机上运行一个命令,直接给出要执行的命令,但不能运行管理
- 使用示例
-
ansible all -a "ls /home" (默认模块,可以省略模块名称)
[root@localhost ~]# ansible all -a "ls /home" 192.168.0.15 | SUCCESS | rc=0 >> Packages test test1 test2 test3 testfile 192.168.0.14 | SUCCESS | rc=0 >> Packages test test1 test2 test3 testfile
-
2.4.2 shell模块
-
功能
- 启动一个shell进程来执行命令,支持管道传送。
-
使用示例
ansible 192.168.0.14 -m shell -a "ss -tnl | grep 80"
[root@localhost ~]# ansible 192.168.0.14 -m shell -a "ss -tnl | grep 80"
192.168.0.14 | SUCCESS | rc=0 >>
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::80 :::*
2.4.3、copy模块
- 功能
- 复制文件,把管理端的文件复制到远程主机上
- 使用格式
- src : 管理端文件路径
- dest : 目标主机文件存放路径
- mode : 文件的权限
- owner : 文件的属主
- 使用示例
ansible 192.168.0.14 -m copy -a "src=/etc/ansible/ansible.file/httpd.conf dest=/etc/httpd/conf/httpd.conf"
2.4.4、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"
2.4.5、file模块
- 功能
- 文件的创建和删除
- 使用格式
-a "path= mode= owner= group= state={directory|link|hard|touch|file|absent} src= "
- 使用示例
ansible 192.168.0.14 -m file -a "path=/home/test1 state=directory"
ansible webserver -m file -a "src=/etc/fstab path=/home/fstab state=link"
2.4.6、yum模块
- 功能
- 程序包的管理
- 使用格式
-a "name= conf_file= state={present|latest|absent} enablerepo= disablerepo= "
- 使用示例
ansible webserver -m yum -a "name=httpd state=absent"
2.4.7、service模块
- 功能
- 管理服务
- 使用格式
-a "name= state={started|stoped|restarted} enabled= runlevel= "
- 使用示例
ansible webserver -m service -a "name=httpd state=started"
2.4.8、user模块
- 功能
- 管理用户
- 使用格式
ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
- 使用示例
ansible webserver -m user -a "name=jrc system=true shell=/sbin/nologin uid=333"
2.4.9、group模块
- 功能
- 管理组
- 使用格式
-a "name= state={present|absent} gid= system="
- 使用示例
ansible webserver -m group -a "name=jrcgroup state=present system=true"
2.4.10、ping模块
- 功能
- 测试与被管理主机的连通性
- 使用示例
-
ansible all -m ping
[root@localhost ~]# ansible all -m ping 192.168.0.14 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.0.15 | SUCCESS => { "changed": false, "ping": "pong" }
-
2.4.11、script模块
- 功能
- 指定本地的脚本文件,到远程主机上执行一次
- 使用示例
ansible webserver -m script -a "/root/useradd.sh"
2.4.12、setup模块
- 功能
- 收集指定远程主机上的facts信息,将其收集的信息保存在各变量当中。
- 使用示例
ansible webserver -m setup
3、Playbooks剧本
Playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,而且可以多次执行。Playbooks使用YAML,类似于半结构化语言,声明式配置,可读性很高,易于与脚本语言交互。
3.1核心组件
- Tasks : 任务
- Variables : 变量
- facts : 可直接调用
- 自定义变量 : 通过命令行传递
- -e VARS, --extra-vars=VARS
- 主机变量 : 定义在Inventory中的主机之后的变量,直接传递给当个主机变量
- IP/HOSTNAME varaiable=value var2=value2
- 主机组变量 : 定义在主机组上的变量
- [groupname:vars]
variable=value
- [groupname:vars]
- Templates : 模板
- 包含了模板的文本文件
- Handlers : 处理器
- 在特定条件下触发
- 任务可通过"tags"打标签,而后可在ansible-playbook命令上使用-t指定进行调用
- 接收到其它任务的通知时触发
- 某任务的状态在运行为change时,可通过"notify
- 在特定条件下触发
- Roles : 角色
Playbooks的基本示例
- hosts: webserver
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: start nginx
service: name=nginx state=started
- name: change nginx
template: src=/etc/ansible/ansible.file/nginx.conf.j dest=/etc/nginx/nginx.conf
tags: change_conf
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
3.2、Playbook的条件测试
在某个tasks后面添加when子句,即可实现条件测试功能,when语句支持jinja2语法。
示例
- hosts: webserver
remote_user: root
tasks:
- name: install_httpd
yum: name=httpd state=present
when: ansible_os_family == "CentOS7"
- name: start_nginx
service: name=nginx state=started
3.2、Playbook的迭代
在task中调用内置的item变量,在某task后面使用with_items语句来定义元素列表。
示例
- hosts: webserver
remote_user: root
tasks:
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
- hosts: webserver
remote_user: root
tasks:
- name: add some groups
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11',group: 'group11' }
- { name: 'user12',group: 'group12' }
- { name: 'user13',group: 'group13' }
3.3、Roles 角色
roles实现了"代码复用",让playbook中的各元素组织起来,roles是以特定的层级结构组织起来的playbook元素。
注意 : 在/etc/ansible目录下,有roles的目录,在此目录下为每个不同的服务提供不同的目录,每一个服务相当于一个角色,这样就能实现管理的标准化和便捷化。
-
webserver/
- file/ : 用于存放文件,此角色用到的文件都应该放在此目录下。
- templates/ : jinja2模板文件存放位置。
- task/ : 存放任务列表文件,至少有一个main.yml的文件。
- handlers/ : 存放处理器列表文件,至少有一个叫做main.yml的文件。
- vars/ : 变量字典文件,至少有一个叫做main.yml的文件。
- meta/ : 元数据,用于定义角色的特殊设定及依赖关系。
dbserver/
....nginxserver/
....
示例 :
[root@localhost nginx]# vi tasks/main.yml
- name: install_nginx
yum: name=nginx state=present
- name: start_nginx
service: name=nginx state=started
- name: change_conf
template: src=nginx.conf dest=/etc/nginx/nginx.conf
notify: restart_nginx
[root@localhost nginx]# vi handlers/main.yml
- name: restart_nginx
service: name=nginx state=restarted
[root@localhost nginx]# vi vars/main.yml
user: daemon
group: daemon
将nginx.conf文件复制到templates目录下,作为模板,并将其中的 user nginx
改为 user {{ user }} {{ group }} ,作为一个变量使用。
在roles同级目录下创建 nginx.yml,调用角色nginx
- hosts: webserver
remote_user: root
roles:
- nginx