44232111 发表于 2017-2-6 10:27:14

Ansible自动化部署之Play book的使用

一、Ansible Play book 的使用   1、Playbook的核心元素   2、Play books简介   3、Play book的基础    (1)主机与用户    (2)tasks任务列表    (3)task定义示例    (4)Play book使用示例   4、Play book变量的使用    (1)变量的定义示例   5、Play book中notifyh和handlers的使用.    示例:触发   6、Play book中tags的使用   7、tepmplates 模板的使用    jinja2语言    示例:模板安装nginx    when条件判断    迭代with_items

一、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=httpdstate=started    示例2:    注意:shell和command模块后面直接跟命令,而非key=value类的参数列表                   tasks:                     - name: disable selunx                     command: /sbin/setenforce 0(4)Play book使用示例    示例1:添加用户
1
2
3
4
5
6
7
8
9
10
11
   # 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
    # 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)向组中的主机传递相同的变量                 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)变量的定义示例:         
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   变量定义位置 /etc/ansible/hosts
   普通变量
      
       172.16.250.240http_port=80
       172.16.252.18   http_port=8080
   组变量
      
      http_port=80
      
      172.16.250.240
      172.16.252.18   
      在playbook中定义变量的方法
                Vars:
                - var1:value1
                - var2:value2
      命令行指定变量
       nsible-playbook -e调用




示例1:hosts定义变量使用方法

1
2
3
4
5
6
7
8
9
10
11
12
#vim /etc/ansible/hosts

172.16.250.90 hname=node1
# cd /apps/yaml/
# vim hosname.yml
---
- hosts: web
remote_user: root
tasks:
- name: sethostname
    hostname:name={{ hname }}
# ansible-playbookhosname.yml




示例2:在playbook中定义变量的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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                                                                                                                                                         
#ansible-playbookuser1.yml




示例3:命令行参数传递

1
2
3
4
5
6
7
8
9
利用命令行定义变量传递参数至剧本安装memcached。
#vim forth.yml
---
- hosts: web
remote_user: root
tasks:
- name: install $pkname
yum: name={{pkname }} state=present      
# 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最佳的应用场景是用来重启服务,或者触发系统重启操作的。除此之外很少会用到的。示例:触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
利用notify、handlers触发式重启服务。
# 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
#ansible-playbookweb-2.yml




6、Play book中tags的使用
         tags即标签,tags可以和一个play(就是很多个task)或者一个task进行捆绑。然后再执行play book时只需指定相应的tags即可仅执行与tags绑定的task。示例:执行指定tags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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
# ansible-playbook -tinstconfweb-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 语言:                   字面量:                            字符串:使用单引号或双引号;                            数字:整数,浮点数                            列表:                            元组:(item1item2…,)                            字典:{key1:value,key2:value….}                                     布尔型: true/filase                            算数运算:                                     +,- , * , / , // , % **                            比较操作:                                     ==, != , >=,<=                            逻辑运算:                                     and,or, not,                            流表达式                                     For、IF、when
示例:模板安装nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
模板配置文件nginx.conf.j2
Worker_porcesses {{ ansible_precossor_vcpus }}#注意空格哦。
此变量执行ansible all -m setup(收集到的远程主机的变量) 即可查看到
Worker_porcesses {{ ansible_precossor_vcpus +1 }}
此表达式也可。此处只为表示可支持算数运算。

# 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
# ansible-playbooknginx.yml




when条件判断   
1
2
3
4
5
6
7
8
9
10
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
示例1:
字符串方式
- name: install some package
   yum:name={{ item }}state=present
   with_items:
   - nginx
   - memecached
   - php-fpm
示例2:
字典方式
    - name: addsome 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的格式要求比较严格,因此在部署时一定要注意格式的书写。文中若有不当之处望见谅。各位可以在评论处留言支出不当之处。


imissmylove 发表于 2017-6-1 15:34:19

多谢楼主分离
页: [1]
查看完整版本: Ansible自动化部署之Play book的使用