一、AnsiblePlay book 的使用
1、Playbook的核心元素
Hosts: 主机,部署目标 Tasks: 任务,ansible,执行目的 Varlables: 变量 Templates: 包含了模板语法的文本文件; Handlers: 有特定条件触发的任务 Roles : 角色 (特别介绍)
2、Play books简介
简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
Playbooks可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
Playbooks 的格式是YAML(详见:YAML 语法),语法做到最小化,意在避免 playbooks 成为一种编程语言或是脚本,但它也并不是一个配置模型或过程的模型.
playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表.
在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务是一个对 ansible 模块的调用。
3、Play book的基础
(1)主机与用户
Hosts:运行指定任务的目标主机 ()可以是一个或多个冒号分隔的主机组)
remoute_user: 在远程主机上执行任务的用户;
(2)tasks任务列表
每个play包含了一个task列表(任务列表),每一个task在其对应的所有主机上(通过host parttern匹配到的所有主机)执行完毕之后才执行下一task。注意:一个paly中的所有hosts 都会获取相同的任务指令,也就是将一组选出的hosts映射到task上,所有主机执行task任务中的命令。
每一个task的目标在于执行一个moudle,通常是带有特定的参数来执行,在参数中可以使用变量(variables).
modules是具有“幂等”性的,意思是如果在执行module时此前已经执行过一次,目标主机不会作出任何改变,假设新一次的执行有所改动,那moudle只会改变必要的已经改变的地方,原有的已经执行过的结果不会发生任何改变。
每一个task必须有一个名称name,这样在运行play book时,从其输出的任务执行信息中可以很好的判断属于哪个task,如果没有定义name, action的值将会用作输出信息中标记的特定的taask。
(3)task定义示例
示例1:
下面是一种基本的task定义,server module 使用key=value格式的参数,这也是大多数moudle使用的参数格式:
tasks: - name: apache start service:name=httpd state=started 示例2: 注意:shell和command模块后面直接跟命令,而非key=value类的参数列表 tasks: - name: disable selunx command: /sbin/setenforce 0
(4)Play book使用示例
示例1:添加用户
[root@centos7_1 yaml]# cat user.yaml --- - hosts: all remote_user: root tasks: - name: create user1 user: name=user1 system=true uid=307 - name: create user2 user: name=user1 system=true uid=308 [root@centos7_1 yaml]# ansible-playbook user.yaml
#可添加—check 选项执行前检查
4、Play book变量的使用
(1)facts: 可直接调用
(2)ansible-playbook 命令的命令行中的自定义变量
-e EXTRA_VARS, –extra-vars=EXTRA_VARS #命令行中定义变量传递至yaml文件。
(3)通过roles传递变量
(4)Host Inventory
(a)向不同的主机传递不同的变量;
IP/HOSTANME varable=value var2=value2
在hosts 组ip后添加变量
(b)向组中的主机传递相同的变量
[group:var]
arable=value
注意:Inventory参数:
用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量。 ansible_ssh_host
ansible_ssh_user
ansible_ssh_port
ansible_ssh_pass
ansible_sudo_pass
….
查看远程主机的全部系统信息
ansible all -m setup #收集到的远程主机的变量
(1)变量的定义示例:
变量定义位置 /etc/ansible/hosts
普通变量
[web]
172.16.250.240 http_port=80
172.16.252.18 http_port=8080
组变量
[web:var1]
http_port=80
[web]
172.16.250.240
172.16.252.18
在playbook中定义变量的方法
Vars:
– var1:value1
– var2:value2
命令行指定变量
nsible-playbook -e 调用
示例1:hosts定义变量使用方法
[root@centos7_1 ~]#vim /etc/ansible/hosts [web] 172.16.250.90 hname=node1 [root@centos7_1 ~]# cd /apps/yaml/ [root@centos7_1 yaml]# vim hosname.yml --- - hosts: web remote_user: root tasks: - name: sethostname hostname:name={{ hname }} [root@centos7_1 yaml]# ansible-playbook hosname.yml
[root@centos7_1yaml]# vim user1.yml --- - hosts: web remote_user: root vars: #定义变量 - username: testuser1 #变量列表 - groupname: testgroup1 tasks: - name: crete group group: name={{ groupname }} state=present - name: crate user user: name={{ username }} state=present [root@centos7_1 yaml]#ansible-playbook user1.yml
示例2:在playbook中定义变量的方法
示例3:命令行参数传递
利用命令行定义变量传递参数至剧本安装memcached。
[root@centos7_1 yaml]#vim forth.yml --- - hosts: web remote_user: root tasks: - name: install $pkname yum: name={{pkname }} state=present [root@centos7_1yaml]# ansible-playbook -e pkname=memcached forth.yml
5、Play book中notifyh和handlers的使用
notify这个action可用于每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成之后一次性地执行指定操作。
在notify中列出的操作称为handler,即notify中调用handler中定义的操作。
handler也是也写task的列表,通过名字来引用,他们和一般的task没有什么区别。
handler是由通知者进行notify,如果没有被notify,handler是不会执行的。
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handler也只会被执行一次。
handlers最佳的应用场景是用来重启服务,或者触发系统重启操作的。除此之外很少会用到的。
示例:触发
利用notify、handlers触发式重启服务。
[root@centos7_1yaml]# vim web-2.yml --- - hosts: web remote_user: root tasks: - name: install httpdpackage yum: name=httpdstate=present - name: install configurefile copy: src=/apps/work/files/httpd.confdest=/etc/httpd/conf/ #该文件与目标主机文件不完全一致变回触发。 notify: restart httpd - name: start httpd service service: name=httpdstate=started handlers: - name: restart httpd service: name=httpd state=restarted [root@centos7_1 yaml]#ansible-playbook web-2.yml
6、Play book中tags的使用
tags即标签,tags可以和一个play(就是很多个task)或者一个task进行捆绑。然后再执行play book时只需指定相应的tags即可仅执行与tags绑定的task。
示例:执行指定tags
[root@centos7_1yaml]# vim web-3.yml --- - hosts: web remote_user: root tasks: - name: install httpd package yum: name=httpd state=present - name: install configure file copy: src=/apps/work/files/httpd.conf dest=/etc/httpd/conf/ tags: instconf #tags - name: start httpd service service: name=httpd state=started [root@centos7_1 yaml]# ansible-playbook -tinstconf web-3.yml #指定tags instconf 执行。 ansible-playbookweb-3.yml --tags=" instconf " 执行此命令同样仅执行instconf 标签内容。
7、tepmplates 模板的使用
template是文本文件,嵌套有脚本(使用模板编程语言编写)的配置文件。
讲到template模板就不得不先介绍template使用语言 jinja2。
jinja2语言
Jinja2是基于python的模板引擎,功能比较类似于PHP的smarty,J2ee的Freemarker和velocity。它能完全支持 unicode,并具有集成的沙箱执行环境,应用广泛。
Jinja2 语言:
字面量:
字符串:使用单引号或双引号;
数字:整数,浮点数
列表:[item1,item2 …..]
元组:(item1item2…,)
字典:{key1:value,key2:value….}
布尔型: true/filase
算数运算:
+,- , * , / , // , {5749fe182deba6f703e69800a8cc3afb9894ad400f350437bd2be724fa41f418} **
比较操作:
==, != , >= ,<=
逻辑运算:
and,or, not,
流表达式
For、IF、when
示例:模板安装nginx
模板配置文件nginx.conf.j2
Worker_porcesses {{ ansible_precossor_vcpus }} #注意空格哦。
此变量执行ansible all -m setup (收集到的远程主机的变量) 即可查看到
Worker_porcesses {{ ansible_precossor_vcpus +1 }}
此表达式也可。此处只为表示可支持算数运算。
[root@centos7_1 yaml]# vim nginx.yml --- - hosts: web remote_user: root tasks: - name: install nginx yum: name=nginx state=present - name: install conf file template: src=/apps/work/files/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx tags: instconf - name: start nginx service service: name=nginx state=started handlers: - name: restart nginx service:name=nginx state=restarted [root@centos7_1 yaml]# ansible-playbook nginx.yml
when条件判断
when 语句:在task中使用。Jinja2的语法格式
tasks: - name: install conf file to Centos7 template:src=files/nginxconf.c7.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version==”7” - name: install conf file to Centos6 template:src=files/nginxconf.c6.j2 dest=/etc/nginx/nginx.conf when:ansible_distribution_major_version ==”6” 以上语法表示若查询远程主机系统为centos6则执行,install conf file to Centos6。 若为cenos7则执行install conf file to Centos7。
迭代with_items
循环迭代,需要重复执行的任务;对迭代项引用,固定变量名为item,而后在task中使用with_items给定迭代的元素列表;
列表方法:
字符串
字典
示例1:
字符串方式 - name: install some package yum:name={{ item }} state=present with_items: - nginx - memecached - php-fpm 示例2: 字典方式 - name: add some groups group: name={{ item }} state=present with_items: - group1 - group2 - group3 - name: add some user user: name={{ item.name }} group=`item`.`group` state=present with_items: - {name: 'user1',group: 'group1'} - {name: 'user2',group: 'group2'} - {name: 'user3',group: 'group3'}
ansible的格式要求比较严格,因此在部署时一定要注意格式的书写。文中若有不当之处望见谅。各位可以在评论处留言支出不当之处。
二、ansible的roles介绍:
ansible的roles用于层次性、结构化地组织palybook。roles能够根据层次型结构自动装载变量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。
rules的组成:
root@node1 playbook]# tree roles/ roles/ \\ansible所有的信息都放到此目录下面对应的目录中 └── nginx \\角色名称 ├── default \\为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件; ├── files \\存放有copy或script等模块调用的文件 ├── handlers \\此目录总应当包含一个main.yml文件,用于定义各角色用到的各handler ├── meta \\应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持 ├── tasks \\至少包含一个名为main.yml的文件,定义了此角色的任务列表,可使用include指令 ├── templates \\template模块会自动在此目录中寻找Jinja2模板文件 └── vars \\应当包含一个main.yml文件,用于定义此角色用到的变量
roles介绍完了,那么我们就利用ansible的roles来配置nginx
1、首先按照上面的要求创建要用到的目录
[root@node1 playbook]# mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default}
2、准备nginx配置文件
准备nginx.conf配置文件,使用模板文件配置 [root@node1 playbook]# cd roles/nginx/templates/ [root@node1 ~]# ansible all -m setup | grep ansible_processor_cores "ansible_processor_cores": 1, \\获取ansible的要调用的相关函数 [root@node1 playbook]# cd roles/nginx/templates/ \\模板文件一定要放到此目录 [root@node1 templates]# vim nginx.conf worker_processes {{ ansible_processor_cores }}; \\调用获取到的函数
准备nginx的default.conf文件 [root@node1 playbook]# ls -l roles/nginx/files/ -rw-r--r--. 1 root root 1290 Nov 12 2014 default.conf
3、准备nginx的rpm包
[root@node1 playbook]# ls -l roles/nginx/files/ -rw-r--r--. 1 root root 1290 Nov 12 2014 default.conf -rw-r--r--. 1 root root 319456 Mar 29 20:44 nginx-1.4.7-1.el6.ngx.x86_64.rpm
4、在tasks目录中配置任务列表
[root@node1 playbook]# cd roles/nginx/tasks/ [root@node1 tasks]# vim main.yml - name: copy nginx.rpm copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm - name: install nginx shell: yum -y install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm - name: provides nginx.conf template: src=nginx.conf dest=/etc/nginx/nginx.conf tags: nginxconf notify: - server restart - name: provides default.conf copy: src=default.conf dest=/etc/nginx/conf.d/default.conf tags: nginxconf - name: server start service: name=nginx enabled=true state=started
5、在handlers目录中配置定义handler信息
[root@node1 playbook]# cd roles/nginx/handlers/ [root@node1 handlers]# vim main.yml - name: server restart service: name=nginx state=restarted
6、在roles同一级目录中创建site.yml文件
[root@node1 playbook]# cat site.yml - hosts: nginx remote_user: root roles: - nginx
7、应用配置:
[root@node1 playbook]# ansible-playbook site.yml PLAY [nginx] ****************************************************************** GATHERING FACTS *************************************************************** ok: [172.16.2.13] TASK: [nginx | copy nginx.rpm] ************************************************ ok: [172.16.2.13] TASK: [nginx | install nginx] ************************************************* changed: [172.16.2.13] TASK: [nginx | provides nginx.conf] ******************************************* changed: [172.16.2.13] TASK: [nginx | provides default.conf] ***************************************** changed: [172.16.2.13] TASK: [nginx | server start] ************************************************** changed: [172.16.2.13] NOTIFIED: [nginx | server restart] ******************************************** changed: [172.16.2.13] PLAY RECAP ******************************************************************** 172.16.2.13 : ok=7 changed=5 unreachable=0 failed=0
8、在node2主机上查看nginx是否已启动
[root@node2 ~]# ss -tpln | grep 80 LISTEN 0 128 *:80 *:* users:(("nginx",8934,8),("nginx",8936,8))
9、roles目录总体结构:
[root@node1 playbook]# tree roles/ roles/ └── nginx ├── default ├── files │ ├── default.conf │ └── nginx-1.4.7-1.el6.ngx.x86_64.rpm ├── handlers │ └── main.yml ├── meta ├── tasks │ └── main.yml ├── templates │ └── nginx.conf └── vars
到此ansible常用的知识已介绍完毕,仅个人学习总结,大家有疑问的话可以一起交流。