ansible-02

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible-02相关的知识,希望对你有一定的参考价值。

回顾:运维工具,ansible
运维工具:
OS Provision(系统操作统一化):
实体机管理:pxe, cobbler
虚拟机管理:
Configuration配置管理工具: puppet(最流行), saltstack, chef, cfengine, ...
Command and Control命令批量操作工具:fabric, func
Deployment(程序发布或部署):基于灰度模型,摘除相关主机,上线服务
不能直接把服务器直接down掉,因为当前主机的服务还有其他主机进行连接

ansible: agentless工具,基于ssh
不需要在远程主机上安装ansible客户端,但是需要进行ssh连接,需要相应的帐号与密码
也可以使用sudo连接,但是对于权限的指派一定要到位,否则会产生各种问题

ansible命令的用法:
ansible:命令直接执行
ansible-playbook:提前定义好流程,使用剧本

ansible命令的执行需要借助模块
常用模块:command, shell, cron, copy, file, ping, yum, service, user, setup, hostname, group, script

playbook基本组件:
hosts:应用的远程主机
remote_user:登录用户名
tasks:任务列表
handlers:触发执行
variables:变量
templates:模版
roles:角色

ansible的使用-02

1.常用模块

1.1 group模块

添加或删除组
            name=
            state=:present(添加),absent(删除)
            system=:1或true为添加系统组
            gid=
  1. ansible all -m group -a "name=test state=present system=1 gid=600"
  2. ansible all -m group -a "name=test2 state=present gid=1010"

1.2 script模块:

运行本地的脚本在远程主机上。依赖于某个文件才能运行,需要指定某个脚本文件的路径(本地的脚本文件),它会自动复制到远程主机上运行
            -a "/PATH/TO/SCRIPT_FILE"
类似于command或shell。这个路径是本机文件路径。

1.3 template模块:

基于模板方式生成一个文件复制到远程主机
            src=:源地址
            dest=:目标地址
            owner=:属主
            group=:属组
            mode=:权限0644

2. playbook的其它组件

2.1 变量:

变量的定义:
ansible facts:系统变量可以直接调用
ansible-playbook  -e "var=value":自己定义变量,传递变量
host variable: host iventory:定义主机变量,在hosts文件中添加
group variable:组变量定义方式。定义的变量对于组内所有主机生效
[groupname:vars]
var=value
roles

变量调用:{{ variable }}
 
在playbook中定义变量的方法:
            vars:
            - var1: value1
            - var2: value2

2.2 模板:templates

模板文件是一种文本文件,嵌套有脚本(使用模板编程语言编写)
python中的嵌入式编程语言是Jinja2

jinjia2的语法:
字面量:
字符串:使用单引号或双引号;
数字:整数,浮点数;
列表:[item1, item2, ...],值可变数据类型
元组:(item1, item2, ...),值不可变
字典:{key1:value1, key2:value2, ...}
布尔型:true/false

算术运算:
+, -, *(乘), /(除), //(整除), %(取余), **(次方)

比较操作:
==(等值比较), !=(不等值比较), >, >=, <, <=

逻辑运算:
and, or, not
示例:   
nginx配置文件中修改配置文件nginx.conf.j2:
  1. worker_processes {{ ansible_processor_vcpus }};
  2. #或者worker_processes {{ ansible_processor_vcpus-1 }}; #使用减法运算
  3. lsiten {{ http_port }}; #设置监听端口,也可以使用我们自定义的变量(在hosts文件中对每一个分别设置)
在/etc/ansible下添加playbook文件如下:
  1. - hosts: websrvs
  2.   remote_user: root
  3.   tasks:
  4.   - name: install nginx
  5.     yum: name=nginx state=present
  6.   - name: install conf file
  7.     template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  8.     notify: restart nginx
  9.     tags: instconf
  10.   - name: start nginx service
  11.     service: name=nginx state=started
  12.   handlers:
  13.   - name: restart nginx
  14.     service: name=nginx state=restarted  
  1. ansible-playbook nginx.conf.yaml
 
                 模板配置文件 :nginx.conf.j2
                    worker_processes {{ ansible_processor_vcpus }};
                    listen {{ http_port }};

2.3 条件测试

判断系统版本,系统类型,根据这些不同做出不同的应对
  1. ansible all -m setup | grep ansible_os_family #查看系统家族,CentOS显示RedHat

        条件测试:
            when语句:在task中使用,jinja2的语法格式
  1. tasks:
  2. - name: install conf file to centos7
  3.   template: src=files/nginx.conf.c7.j2
  4.   when: ansible_distribution_major_version == "7" #如果是CentOS7的时候
  5. - name: install conf file to centos6
  6.   template: src=files/nginx.conf.c6.j2
  7.   when: ansible_distribution_major_version == "6"   #如果是CentOS6时
  1. scp [email protected].18.100.69:/etc/nginx/nginx.conf files/nginx.conf.c6.j2 #把远程主机(CentOS6)上的文件拉取到本地

2.4 循环

        循环:迭代,需要重复执行的任务;
            对迭代项的引用,固定变量名为”item“
            而后,要在task中使用with_items给定要迭代的元素列表;
                列表方法:
                    1.字符串
                    2.字典:每一个元素是一个字典

列表方法1:字符串 
            - name: install some packages
              yum: name={{ item }} state=present
              with_items:
              - nginx
              - memcached
              - php-fpm
  1. - hosts: all
  2. remote_user: root
  3. tasks:
  4. - name: install some packages
  5. yum: name={{ item }} state=present
  6. with_items:
  7. - nginx
  8. - memcached
  9. - php-fpm
  1. ansible-playbook item.yaml #如果没有定义好yum源,出现问题就会终止

列表方法2:字典
  1. - hosts: all
  2. remote_user: root
  3. tasks:
  4.   - name: add some groups
  5.     group: name={{ item }} state=present
  6.     with_items:
  7.     - group11
  8.     - group12
  9.     - group13
  10.   - name: add some users
  11.     user: name={{ item.name }} group={{ item.group }} state=present
  12.     with_items:
  13.     - { name: ‘user11‘, group: ‘group11‘ } #键值与键值之间用“:”隔开
  14.     - { name: ‘user12‘, group: ‘group12‘ }
  15.     - { name: ‘user13‘, group: ‘group13‘ }
  1. ansible-playbook useradd.yaml

2.5 角色(roles):

如何实现yaml定义的模块重用?
服务器角色并不单一
如果能够把配置的每个配置段独立化,模块化
角色调用,直接调用服务器主机的公共模块,谁用谁调,直接方便
好处:跟远程主机分离,调用方便

角色集合:其实就是一个目录,角色名就是目录名
            roles/
                mysql/
                httpd/
                nginx/
                memcached/
 
角色的格式:
        每个角色,以特定的层级目录结构进行组织:
            mysql/
                files/ :存放由copy(复制的文件)或script(脚本文件)模块等调用的文件;
                templates/:template模块查找所需要模板文件的目录;
                tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;(基本组件,必须有)
                handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
                default/:设定默认变量时使用此目录中的main.yml文件;
  1. mkdir -pv roles/{httpd,nginx,mysql}/{files,templates,tasks,handlers,vars,meta,default}
        在playbook调用角色方法1:
        一个主机上可以调用多个角色
            - hosts: websrvs
              remote_user: root
              roles:
              - mysql
              - memcached
              - nginx
 
        在playbook调用角色方法2:传递变量给角色
            - hosts:
              remote_user:
              roles:
              - { role: nginx, username: nginx }
                键role用于指定角色名称;后续的k/v用于传递变量给角色;

 例:
  1. mkdir /etc/ansible/roles/nginx
  2. cp /root/working/files/nginx.conf.j2 templates/ #复制准备好的配置文件/templates文件夹中
  1. #在roles/nginx/tasks/main.yaml中配置
  2. - name: install nginx packages
  3. yum: name=nginx state=present
  4. - name: install conf file
  5. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  6. - name: start nginx
  7. service: name=nginx state=started enabled=true
  1. #创建执行文件nginx.yaml
  2. - hosts: all
  3. remote_user: root
  4. roles:
  5. - nginx
  1. ansible-playbook --check nginx.yaml
  2. ansible-playbook nginx.yaml
技术分享

定义一个触发器:
  1. #创建roles/nginx/handlers/main.yaml
  2. - name: restart nginx
  3. service: name=nginx state=restarted
  1. #在tasks/main.yaml中重新定义
  2. - name: install nginx packages
      yum: name=nginx state=present
    tags:install
    - name: install conf file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
    notify: restart nginx #定义通知机制,当模版发生改变时就通知handlers模块,重启服务
    tags:conf
    - name: start nginx
      service: name=nginx state=started enabled=true
    tags:nginxst
  1. ansible-playbook -t install,conf nginx.yaml

使用变量:
1.直接定义
  1. #编辑user.yaml
  2. - hosts: all
  3. romote_user: root
  4. vars:
  5. - username: testuser1
  6. - groupname: testgroup1
  7. tasks:
  8. - name: creat group
  9. group: name={{ groupname }} state=present
  10. - name: creat user
  11. user: name={{ username }} state=present
从命令行传递参数,直接把下面定义的变量覆盖掉,例:
  1. ansible-playbook -e "groupname=mygrp1" -e "username=myuser1" myuser.yaml
2.在角色中定义变量
  1. #在要传给远程主机的nginx配置文件中修改
  2. user {{ username }};
  3. #在roles/nginx/vars/main.yaml
  4. username: daemon #一定要确保定义的用户在远程主机上存在(前面不需要再添加横线“-”)
  1. ansible-playbook --check nginx.yaml
  2. ansible-playbook nginx.yaml
  3. ansibel-playbook -e "username=adm" --check nginx.yaml
  4. ansibel-playbook -t conf -e "username=adm" nginx.yaml #直接修改
3.在playbook调用角色方法:传递变量给角色
  1. - hosts: all
  2.   remote_user: root
  3.   roles:
  4.   - { role: nginx, username: nginx }
ansible-playbook运行过后可以看到,运行nginx的用户为nginx

注意:1.键role用于指定角色名称;后续的k/v用于传递变量给角色;
           2.还可以基于条件测试实现角色调用;
            roles:
            - { role: nginx, when: "ansible_distribution_major_version == ‘7‘ " }
               只有当系统主版本号为“7”的时候,才会运行nginx角色
            这里可以定义n个角色
  1. - hosts: all
  2. remote_user: root
  3. roles:
  4. - { role: nginx, username: nginx, when: "ansible_distribution_major_version == ‘7‘ " }
例:
  1. mkdir -pv /etc/ansible/roles/memcached/tasks
  2. vim tasks/main.yaml
  3. #下面是main.yaml的内容
  4. - name: install package
  5. yum: name=memcached state=present
  6. - name: start memcached
  7. service: name=memcached state=started enabled=true
  8. vim mem.yaml
  9. #下面是mem.yaml的内容
  10. - hosts: all
  11. remote_user: root
  12. roles:
  13. - { role: nginx, when: ansible_distribution_major_version == ‘7‘ }
  14. - { role: memcached, when: ansible_hostname == ‘memcached‘ }
  15. ansible-playbook mem.yaml

例:如何设置memcached所使用的空间是系统闲置空间的1/4?
把/etc/sysconfig/memcached中的“CACHESIZE="64" ”改为1/4
  1. mkdir roles/memcached/templates
  2. scp [email protected].18.100.69:/etcsysconfig/memcached ./roles/memcached/templates #从远程主机上下载配置文件
  3. ansible all -m setup

  4. vim ./roles/memcached/templates/memcached
  5. #将CACHESIZE="64"改为
  6. CACHESIZE="{{ ansible_memtotal_mb //4 }}"
  7. mv ./roles/memcached/templates/memcached{,.j2} #改后缀名j2
  8. vim ./roles/memcached/tasks/main.yaml

  9. #以下是main.yaml中的内容
  10. - name: install package
  11. yum: name=memcached state=present
  12. - name: install conf file
  13. templates: src=/etc/ansible/roles/templates/memcached.j2 dest=/etc/sysconfig/memcached
  14. notify: restart memcached
  15. tags: memconf
  16. - name: start memcached
  17. service: name=memcached state=started enabled=true
  18. mkdir memcached/handlers
  19. vim ./handlers/main.yaml

  20. #main.yaml
  21. - name: restart memcached
  22. service: name=memcached state=restarted

  23. ansible-playbook /etc/ansible/roles/mem.yaml
  24. 或者ansible-playbook -t memconf /etc/ansible/roles/mem.yaml

实战项目:

使用ansible一键搞定:
        主/备模式高可用keepalived+nginx(proxy)
        两台主机:httpd+php
        一台主机:mysql-server或mariadb-server;
 建议sudo的时候把sudo用户加到管理员组里面,给与与root用户相同的权限
    http://www.ansible.com.cn

































































以上是关于ansible-02的主要内容,如果未能解决你的问题,请参考以下文章

学习自动化运维工具-ansible

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板