zoukankan      html  css  js  c++  java
  • ansible

     
     

    1章 自动化运维工具ansible

    1.1 保留yum安装的软件

    sed -i.org 's#keepcache=0#keepcache=1#g' /etc/yum.conf

    1.2 管理端m01安装

    yum install epel-release  -y

    yum install ansible -y

    1.3 客户端安装

    yum install libselinux-python -y

    1.4 编辑/etc/ansible/hosts

    [root@m01 scripts]# tail -6 /etc/ansible/hosts
    [oldboy]
    172.16.1.5

    172.16.1.6

    172.16.1.7

    172.16.1.8

    172.16.1.31

    172.16.1.41

    172.16.1.51

    172.16.1.61

     

    1.5 利用ansible远程批量执行命令

    语法

    ansible oldboy -m command -a 'uptime'

    oldboy为主机组的名字

    -m后边是模块的名字

    -m NAME, --module-name=NAME

               Execute the module called NAME

    -a后面是模块的名字,也可以是一个ip,针对一台机器来执行命令

    -a 'ARGUMENTS', --args='ARGUMENTS'

               The ARGUMENTS to pass to the module.

    远程执行命令

    ansible oldboy -m command -a 'uptime'

     

    ansible oldboy -m command -a ' sed -i.org 's#keepcache=0#keepcache=1#g' /etc/yum.conf '

     

    拷贝文件

    [root@m01 scripts]# cat yum.sh 
     yum install ipvsadm -y

     

    ansible oldboy -m copy -a "src=/server/scripts/yum.sh dest=/server/scripts/ owner=oldboy group=oldboy mode=0755"

     

    远程执行脚本

    ansible oldboy -m shell -a "/server/scripts/yum.sh"

    ansible的模块内容
    ansible-doc -l 
    详细查看copy模块的信息

    ansible-doc -s copy  

    1.6 模块的介绍

    1.7 批量安装服务的方法

    1)运用命令模块

    ansible oldboy -m yum -a "name=keepalived state=installed"

    2)运用yum模块

    ansible oldboy -m command -a 'yum install httpd -y'

    第2章 ansible

    Ansible的核心组件

    Ansible core

    Host inventory

    Core modules

    Custom modules

    Playbook(yaml,jinjia2)

    Connect plugin

    Ansible 的特性

    基于python语言实现,由Paramiko,pyyaml和jinjia2 三个关键模块

     

    常见模块

    Command:命令模块,默认模块,用于远程执行命令;区别于shell 、raw模块就是在命令中不支持管道|符号

    ansible all –a ‘date’

    cron: 定时任务模块

    state:

          present: 安装

          absent: 卸载

    ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"' 默认state=present

    ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent '

    user:指明创建用户名字

    ansible websrvs -m user -a 'name=mysql uid=306 system=yes'

    group:

    ansible websrvs -m group -a 'name=mysql gid=306 system=yes'

    copy:复制模块

    src 原文件的路径 可以是相对路径也可以是绝对路径 拷贝目录时结尾加/ 表示只拷贝里边的内容

    不加/ 表示连同目录一块拷贝

    dest 目标文件的路径

    content 取代src 表示直接以此处指定的信息生成为目标的文件内容

    ansible lbsrvs -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=600'

    ansible lbsrvs -m copy -a 'content="hello ansible megeedu " dest=/tmp/test.txt'

    [root@lb01 ~]# cat /tmp/test.txt

    hello ansible

     megeedu  

    file:设定文件属性

    path=: 指定文件路径,可以使用name或dest来替换

    创建文件的符号链接:

    src=:指明源文件

    path=:指明符号链接文件的路径

    ansible lbsrvs -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"

    service:指定运行状态

    enabled=:是否开机自启动,取值为true或者false  yes or no

    name=:服务名称

    state=:状态,取值有started,stopped,restarted;

    shell:在远程主机上运行命令

    尤其是利用管道运行负载的命令

     

    Script:将本地脚本复制到远程主机并运行之:注意:要使用相对路径指定脚本

    yum:安装程序包

    name=:指明要安装的程序包,可以带上版本号

    state=: present,latest,表示安装,absent表示卸载:

    setup:收集远程主机的facts

    每个被管理节点在接收并行管理命令之前,会将自己主机相关信息,如操作系统版本,ip地址等报告给远程的ansible主机

    [root@m01 ansible_test]# cat apache.yml

    - hosts: websrvs

      remote_user: root

      tasks:

      - name: install httpd package

        yum: name=httpd state=latest

      - name: install configuration file for httpd

        copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

      - name: start httpd service

    service: enabled=true name=httpd state=started

    =====================》

    [root@m01 ansible_test]# cat apache.yml

    - hosts: websrvs

      remote_user: root

      vars:

      - package: httpd

      - service: httpd

      tasks:

      - name: install httpd package

        yum: name={{ package }} state=latest

      - name: install configuration file for httpd

        copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

        notify:

        - restart httpd

     

      - name: start httpd service

        service: enabled=true name=httpd state=started

      handlers:

      - name: restart httpd

        service: name=httpd state=restarted

    2.1.1 主机变量

    [websrvs]

    #10.0.0.7 testvar='100.7' ansible_ssh_user=root ansible_ssh_pass=123456

    #10.0.0.8 testvar='100.8'

    2.2 引用变量

    [root@m01 ansible_test]# cat test.yml

    - hosts: websrvs

      remote_user: root

      tasks:

      - name: copy file

        copy: content='{{ansible_all_ipv4_addresses}},{{testvar}}' dest=/tmp/vars.ansible

    可以在playbook中定义 可以在/etc/ansible/hosts 中定义的   ansible facts 中的变量 都可以直接引用

    2.3 when条件测试

    [root@m01 ansible_test]# cat cond.yml

    - hosts: websrvs:lbsrvs

      remote_user: root

      vars:

      - username: user10

      tasks:

      - name: create {{username}} user

        user: name={{username}}

        when: ansible_fqdn == 'lb01'

    2.4 迭代

    当有需要重复行执行的任务时,可以使用迭代机制,其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可

    [root@m01 ~]# cat add_user.yml

    - hosts: websrvs

      remote_user: root

      tasks:

        - name: add several users

          user: name={{ item }} state=present groups=wheel

          with_items:

            - testuser1

            - testuser2

    #上面的语句等同于下面的语句

    #    - name: add testuser1

    #      user: name=testuser1 state=present groups=wheel

    #    - name: add testuser2

    #      user: name=testuser2 state=present groups=wheel

    #事实上 with_items 可以使用的元素还可以为hashes 例如

    #    - name: add several users

    #      user: name={{item.name}} state=present groups={{item.groups}}

    #      with_items:

    #        - {name: 'testuser1',groups: 'wheel'}

    #        - {name: 'testuser2',groups: 'root'}

    迭代:重复同类task时使用

      调用:item

    定义循环列表:

     

    [root@m01 ~]# cat main.yml

    - hosts: websrvs

      remote_user: root

      tasks:

        - name: install lamp package

          yum: name={{ item.name }} state=latest

          template: src={{ item.conf }} dest={{item.dest_conf}}

          with_items:

           - {name: httpd,conf: conffiles/httpd.conf,dest_conf: /etc/httpd/conf/httpd.conf}

           - {name: php,conf: conffiles/pfp.ini,dest_conf: /etc/php.ini}

           - {name: mysql-server,conf: conffiles/my.cnf,dest_conf: /etc/my.cnf}

    2.5 Template

    模板文件 通过一个配置文件含有jinjia2的变量  当复制到各个节点是模板里的变量 会替换为主机清单/etc/ansible/hosts 里面的变量定义的值

    [root@m01 ansible_test]# cat apache.yml

    - hosts: websrvs

      remote_user: root

      vars:

      - package: httpd

      - service: httpd

      tasks:

      - name: install httpd package

        yum: name={{ package }} state=latest

      - name: install configuration file for httpd

        template: src=/root/template/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

        notify:

        - restart httpd

     

      - name: start httpd service

        service: enabled=true name={{ service }} state=started

      handlers:

      - name: restart httpd

        service: name=httpd state=restarted

    2.6 Tags 定义标签

    Tags:在playbook可以为某个或者某些任务定义一个标签,在执行此playbook时,通过为ansib-playbook命令使用—tags选项能实现运行指定的tasks而非所有的

    - name: install configuration file for httpd

        template: src=/root/template/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

        tags:

    - conf

    特殊tags:always

    ansible-playbook apache.yml --tags='conf'

    2.7 Roles

    tags

    tags用于让用户选择 跳过playbook中的部分代码,ansible具有哦幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长,此时,如果确信其没有变化,就可以通过tags跳过此些代码片段

    创建roles的步骤

    1,创建以roles命名的目录:,

    2,在roles目录中分别创建以各角色名称命名的目录,如webservers等:

    3,在每个角色命名的目录中分别创建files、handler、meta、tasks、template、vars目录:用不到的可以创建为空目录,也可以不创建,

    4,在playbook文件中,调用各角色

    Roles:

    1》目录名同角色名

    2》Roles内个目录中可用的文件

    1>   Tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表:此文件可以使用include包含其他的位于此目录中的task文件

    2>   files目录:存放由copy或script等模块调用的文件:

    3>   Templates目录:template 模块会自动在此目录中寻找jinjia2模板文件

    4>   Handlers目录:此目录应当包含一个main

    5>   Yml文件,用于定义此角色用到的个handler:在handler中使用include包含的其他的handler文件也应该位于此目录中

    6>   vars 目录:应当包含一个main.yml文件,用于定义此角色用到的变量

    7>   meta 目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系:ansible 1.3及其以后的版本才支持:

    8>   default目录:为当前角色设定默认变量时使用目录:应当包含一个main.yml文件

    3》site.yml 中定义playbook,额外也可以有其他的yml文件

    [root@m01 ~]# tree ansible_playbooks

    ansible_playbooks

    ├── roles

    │   ├── dbsrvs

    │   │   ├── files

    │   │   │   └── my.cnf

    │   │   ├── handlers

    │   │   │   └── main.yml

    │   │   ├── meta

    │   │   ├── tasks

    │   │   │   └── main.yml

    │   │   ├── templates

    │   │   └── vars

    │   └── websrvs

    │       ├── files

    │       │   └── httpd.conf

    │       ├── handlers

    │       │   └── main.yml

    │       ├── meta

    │       ├── tasks

    │       │   └── main.yml

    │       ├── templates

    │       └── vars

    └── sites.yml

                                                        

  • 相关阅读:
    k8s之一键部署docker及k8s脚本(适用于centos7,cnetos8及ubuntu)
    k8s之使用Kubeadm部署k8s集群
    lnmp架构之一键搭建wordpress博客网站脚本(适用于centos7和centos8)
    一键编译安装nginx-1.18.0脚本(适用centos7,ubuntu1804,debian10)
    xshell登陆服务器步骤
    xshell无法连接到linux主机原因分析
    数据库文件备份与还原
    Linux服务器运维基本命令
    服务器运维操作命令
    firewalld的基本使用
  • 原文地址:https://www.cnblogs.com/lieying6011/p/7249213.html
Copyright © 2011-2022 走看看