ansble为一款批量化处理系统配置的服务,对批量化系统部署、批量程序部署、批量运行命令、批量修改服务、批量安装软件包、批量修改配置等诸多功能。ansible基于SSH架构,含有丰富的模块,支持win、路由器、交换机远程操作。
查看playbook的网址:https://galaxy.ansible.com
ansible:192.168.4.10
node01:192.168.4.21
node02:192.168.4.22
node03:192.168.4.23
2.1.1、hosts文件配置
[root@ansible ~]# vim /etc/hosts
192.168.4.10 ansible
192.168.4.21 node01
192.168.4.22 node02
192.168.4.23 node03
2.1.2、创建密钥并传送每个节点
[root@ansible ~]# ssh-keygen
[root@ansible ~]# for i in 192.168.4.{21,22,23}; do ssh-copy-id $i; done
2.1.3、安装ansible
[root@ansible ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@ansible ~]# yum -y install ansible
2.1.4、ansible的管理文件
[root@ansible ansible]# cd /etc/ansible/
[root@ansible ansible]# tree
.
├── ansible.cfg
├── hosts
└── roles
[root@ansible ansible]# vim ansible.cfg
10 [defaults]
11 deprecation_warnings = False # 关闭红色警告消息
14 inventory = /etc/ansible/hosts # 清单文件,存放ansible管理的计算节点信息
2.1.5、清单文件
[root@ansible ansible]# vim hosts
44 [test] # 定义主机组
45 node01 # 定义主机组包含的具体主机
46 [proxy]
47 node02
48 [webserver]
49 node[02:03]
50 [cluster:children] # 嵌套组(chileren为关键字)
51 proxy # 嵌套组中包含其它组
52 webserver
2.1.6、验证
[root@ansible ansible]# ansible node01 -m ping # node01按主机名,-m调用模块
node01 | SUCCESS => { # SUCCESS单词代表成功
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@ansible ansible]# ansible test -m ping # test按主机组
[root@ansible ansible]# ansible all -m ping # all所有主机
2.1.7、ansible_facts用于采集被管理设备的系统信息
[root@ansible ansible]# ansible node01 -m setup
2.1.8、输出
剧本运行时会列出每个任务和执行结果。ok
代表任务管理的机器状态已经完成,因为在任务中定义的状态已经为真,所以 Ansible 不需要执行任何操作。changed
表示 Ansible 已经执行了指定的任务。在这种情况下,任务中定义的机器状态不为真,所以执行指定的操作使其为真。在彩色终端上,TASK
行会以彩色显示。我的终端配色为“amber-on-black”,TASK
行显示为琥珀色,changed
是棕色,ok
为绿色,错误是红色。
通过命令执行ansible,格式:ansible 目标主机或组 -m 模块 -a 参数
[root@ansible ~]# ansible-doc -l # 查看ansible支持的所有模块
[root@ansible ~]# ansible-doc ping # 查看ping模板的详细用法
名称 | 作 用 |
ping | 用ansible主机ssh远程被管理主机,检查对方是否有python |
command | 默认模块,可以省略不写,作用是传命令给被控制端主机,在被控制端主机执行这个命令。变量是不可用的,还有像< , > , | , ; , & 都将不可用。 |
shell | 可以让命令传给被控制端主机,在被控制端主机执行这个命令 |
script | 把脚本拷贝给所有被管理主机,在被管理主机执行脚本 |
file | 创建文件、创建目录、修改文件权限,所有者、所属组、删除文件、删除目录、创建文件的链接 |
copy | 可以把控制端的文件拷贝给被控制端主机 |
fetch | 可以把被控制端的文件拷贝给控制端主机 |
lineinfile | 修改文件内容,一次修改文件的一行(以行为单位) |
replace | 修改文件内容,一次修改文件一个字符(以字符或单词为单位) |
user | 创建用户,配置用户信息(uid,组,密码,登录shell,家目录等),删除用户 |
yum_repository | 可以修改/etc/yum.repos.d目录下的YUM配置文件 |
yum | 安装软件,卸载软件,升级软件 |
service | 管理服务,启动服务,关闭服务,重启服务,设置开机自启动 |
lvg | 创建卷组 |
lvol | 创建逻辑卷 |
注意!!!
ansible-adhoc:ansible-adhoc是通过命令行自动化管理服务器,但是不适合批量复杂的操作
playbook【剧本】:重复的,复杂的任务,可以提前写到剧本里面,以后随时可以执行剧本
- hosts: test
remote_user: root
tasks:
- name: create user use variable
user: name={{user}} state=present
- name: install httpd server
yum: name=httpd state=latest name=httpd-devel state=latest
- name: start httpd service
service: name=httpd state=started enabled=yes
- name: copy httpd.conf to group1:/etc/httpd/conf/
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
notify:
- restart httpd service
handlers:
- name: restart httpd service
service: name=httpd state=restarted
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次。handlers最佳的应用场景是用来重启服务,或者触发系统重启操作,除此以外很少用到了。
注意: handlers 需要notify调用,他和tasks不同的是 tasks每次都会调用,heandlers触发才调用,比如配置文件修改了,在执行playbook的时候,就会将管理机上的新改的copy到被管理机,那么就会触发headlers重启服务,否则不会执行heanlers
vars:
- user: ansible
其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。
yum: name={{item}} state=latest
with_items:
- httpd
- httpd-devel
默认ansible在遇到error会立刻停止,则不再往下执行。如果希望它还能继续往下执行,则需要添加ignore_errors: yes。放在hosts下面就是设置全局,这样下面任何任务失败都忽略
---
- hosts: node1
tasks:
- service:
name: hehe
state: started
ignore_errors: yes
- file:
path: /tmp/service.txt
state: touch
案例:内存小于100M,则关闭计划任务
---
- hosts: node1
tasks:
- service:
name: crond
state: stopped
when: ansible_memfree_mb < 100
案例:当系统为RedHat,则执行block的任务块
---
- hosts: node1
tasks:
- block:
- yum:
name: httpd
- service:
name: httpd
state: started
when: ansible_distribution == "RedHat"
---
- hosts: node01
tasks:
- block:
- file:
name: /tmp/xyz/file1.txt
state: touch
rescue:
- file:
name: /tmp/file2.txt
state: touch
always:
- file:
name: /tmp/file3.txt
state: touch
---
- hosts: node01
tasks:
- user:
name: "{{item.iname}}"
password: "{{item.ipass | password_hash('sha512')}}"
loop:
- { iname: 'tom' , ipass: '123456' }
- { iname: 'jerry' , ipass: '654321' }
把ansible需要做的任务以及相关素材,放到一个目录下,这个目录就是role(角色)
roles: ansible模块,类似于函数,完成一个任务的指令。每一个roles都有自己特定的目录结构,就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。
5.1.1、roles的目录结构
role目录要求有子目录,子目录的名称和作用是红帽定义死的,不可改变!
defualts/main.yml:定义变量的缺省值,优先级较低
files目录:存储静态文件的目录,如tar包、音乐、视频等
handlers/main.yml:定义handlers
meta/main.yml:写作者、版本等描述信息
README.md:整个角色(role)的描述信息
tasks/main.ym:定义各tasks任务的地方。
templates目录:存放动态数据文件的地方(文件中包含了变量的模板文件)
vars/main.yml:定义变量,优先级高
注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.
分析:假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。
5.2.1、roles目录下创建角色
需定制三个角色: httpd、mysql、php,ansible默认角色必须放在ansible里面的roles目录
5.2.2、创建httpd角色
[root@ansible ansible]# ansible-galaxy init roles/httpd
- Role /etc/ansible/roles/httpd was created successfully
[root@ansible ansible]# ls roles/httpd/
defaults files handlers meta README.md tasks templates tests vars
[root@ansible ansible]# ls roles/httpd/files/
httpd.conf phpinfo.php
[root@ansible ansible]# vim roles/httpd/tasks/main.yml
---
# tasks file for /etc/ansible/roles/httpd
- name: httpd httpd-devel httpd-manual软件安装
yum: name={{item}} state=latest
with_items:
- httpd
- httpd-devel
- httpd-manual
---
# tasks file for /etc/ansible/roles/httpd
- name: httpd httpd-devel httpd-manual软件安装
yum: name={{item}} state=latest
with_items:
- httpd
- httpd-devel
- httpd-manual
- name: 创建apache管理用户www
user: name={{item}} state=present
- name: 设置apache开机启动,并启动服务
service: name=httpd enabled=yes state=started
- name: 拷贝配置文件,初始化业务
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
# 定义通知调用,当配置文件更新,需要重启服务
notify:
- restart apache
- name: 拷贝php测试页面
copy: src=/etc/ansible/roles/httpd/files/phpinfo.php dest=/var/www/html/
[root@ansible ansible]# vim roles/httpd/vars/main.yml
---
# vars file for /etc/ansible/roles/httpd
user: www
5.2.3、创建mysql角色
[root@ansible ansible]# ansible-galaxy init roles/mysql
- Role /etc/ansible/roles/mysql was created successfully
[root@ansible ansible]# ls roles/mysql/
defaults files handlers meta README.md tasks templates tests vars
[root@ansible ansible]# vim roles/mysql/tasks/main.yml
---
# tasks file for /etc/ansible/roles/mysql
- name: mysql用户创建
user: name={{user}} state=present
- name: mysql软件安装
yum: name={{item}} state=latest
with_items:
- mariadb
- mariadb-server
- name: 启动服务,并设置开机启动
service: name=mariadb enabled=yes state=started
- name: 改变mysql文件的所有者为mysql
file: path='/usr/lib/mysql' owner={{user}} group={{user}} recurse=yes
[root@ansible ansible]# vim roles/mysql/vars/main.yml
---
# vars file for /etc/ansible/roles/mysql
user: mysql
5.2.3、创建php角色
[root@ansible ansible]# ansible-galaxy init roles/php
- Role roles/php was created successfully
[root@ansible ansible]# ls roles/php/
defaults files handlers meta README.md tasks templates tests vars
[root@ansible ansible]# ls roles/php/files/
www.conf
[root@ansible ansible]# vim roles/php/tasks/main.yml
---
# tasks file for roles/php
- name: 安装php
yum: name={{item}} state=latest
with_items:
- php
- php-mysqlnd
- php-gd
- php- ldap
- php-odbc
- php-pear
- php-xml
- php-xmlrpc
- php-mbstring
- php-snmp
- php-soap
- curl
- curl-devel
- php-bcmath
- php-fpm
- name: copy www.conf to /etc/php-fpm.d
copy: src=/etc/ansible/roles/php/files/www.conf dest=/etc/php-fpm.d force=yes
notify:
- restart php-fpm
[root@ansible ansible]# vim roles/php/handlers/main.yml
---
# handlers file for roles/php
- name: restart php-fpm
service: name=php-fpm state=restarted
5.2.4、编写lamp的playbook文件调用前面定义好的三个角色
[root@ansible ansible]# vim lamp.yml
---
- hosts: node01
remote_user: root
roles:
- httpd
- mysql
- php
执行lamp的playbook文件
[root@ansible ansible]# ansible-playbook lamp.yml