设为首页 收藏本站
查看: 786|回复: 0

[经验分享] Ansible自动化部署之Play book的使用

[复制链接]

尚未签到

发表于 2018-7-29 13:33:49 | 显示全部楼层 |阅读模式
  一、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=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
  示例2:在playbook中定义变量的方法
[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
  示例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
  算数运算:
  +,- , * , / , // , % **
  比较操作:
  ==, != , >=  ,<=
  逻辑运算:
  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的格式要求比较严格,因此在部署时一定要注意格式的书写。文中若有不当之处望见谅。各位可以在评论处留言支出不当之处。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543114-1-1.html 上篇帖子: Ansible 基础 下篇帖子: Ansible自动化部署之ROLES
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表