zoukankan      html  css  js  c++  java
  • ansible简述

    概述

    ansible基于python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。

    ansible通过hosts文件和免秘钥(配置文件用户名密码端口号)来实现批量管理主机。

    ansible基于ssh与远程主机通信,可用ssh测试验证ansible功能。

     

    ansible是基于模块开发的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

    安装

    ubuntu

    $ sudo apt update
    $ sudo apt install software-properties-common
    $ sudo apt-add-repository --yes --update ppa:ansible/ansible
    $ sudo apt install ansible

    yum

    yum install epel-release -y
    yum install ansible -y

    ansible的配置文件:

    /etc/ansible/ansible.cfg

    /etc/ansible/hosts

    ansible配置

    1. 免秘钥

    交换SSH Keys允许主机ansible无密码操作客户机(本地主机也可以无秘钥ssh)。

    Exchanging SSH keys will allow for password-less SSH from host running Ansible to hosts being set up.

    # ssh-keygen
    # ssh-copy-id root@host

    主机上运行ssh-keygen生成ssh key/root/.ssh/id_rsa),可保持空秘钥,然后通过ssh-copy-id复制key到客户机。之后可以直接通过ssh无秘钥登录客户机。

    模块

    ansible-doc -l   ;查看ansible模块

    ansible-doc -s module_name     ;查看具体模块的用法

    -m module_name  ;要使用的模块

    ansible支持的模块很多,具体可参考:

    https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

    常用模块示例如下,组名以web示例:

    ansible web -m ping

    ansible web -m command -a 'ss -ntl' ;直接在远程主机上执行命令,结果返回本主机

    ansible web -m shell -a 'cat /etc/passwd |grep "keer"' ;在远程主机上调用shell解释器运行命令

    ansible web -m copy -a 'src=~/hello dest=/data/hello' ;复制文件到远程主机,同时支持给定内容生成文件和修改权限等。

    ansible web -m file -a 'path=/data/app state=directory' ;设置文件的属性,比如创建文件、创建链接文件、删除文件等。

    ansible web -m fetch -a 'src=/data/hello dest=/data' ;从远程某主机获取(复制)文件到本地。

    ansible web -m cron -a 'name="ntp update every 5 min" minute=*/5 job="/sbin/ntpdate 172.17.0.1 &> /dev/null"'  ;管理cron计划任务的。

    ansible web -m yum -a 'name=htop state=present' ;主要用于软件的安装。

    ansible web -m service -a 'name=nginx state=started enabled=true';用于服务程序的管理。

    ansible web -m user -a 'name=keer uid=11111' ;主要是用来管理用户账号。

    ansible web -m group -a 'name=sanguo gid=12222' ;主要用于添加或删除组。

    ansible web -m script -a '/tmp/df.sh' ;将本机的脚本在被管理端的机器上运行。

    ansible web -m setup -a 'filter="*mem*"' #查看内存,该模块主要用于收集信息,是通过调用facts组件来实现的。

    命令

    协程:线程的处理单元;

    线程:最小的调度单位;

    进程:最小的管理单元。

    ansible-doc -l   ;查看ansible模块

    ansible-doc -s module_name     ;查看具体模块的用法

    -f forks  ;指定启动并发线程数以减少服务器压力,ansible -f 5 表示启动5个线程

    -m module_name  ;要使用的模块

    -a args1    ;特有的参数,即调用的模块里面的参数,使用-a调用

    ansible all -m ping   ;查看client端是否正常ping通。

    ansible  组名 -m model_name -a 执行命令

    ansible <host-pattern> [-f forks] [-m module_name] [-a args]

    playbook

    一个任务为play,多个任务为playbooks(剧本)。

    playbook采用yaml格式,注意:每个冒号“:”后面必须有空格。

    playbook包含5种模块:

    task:主程序

    variables:变量,以变量形式传参

    templates:模板

    handlers:触发器

    roles:角色

    ansible-playbook常用命令

    ansible-playbook --syntax-check /root/ansible/httpd.yaml  ;剧本语法检测

    ansible-playbook -C /root/ansible/httpd.yaml    ;模拟执行剧本

    ansible-playbook /root/ansible/httpd.yaml    ;执行剧本

    openNESSonprem_controller.yml示例:

    ---
    
    # Deploy EdgeController on given host(s)
    - hosts: controller_group
      serial: 1
      pre_tasks:
      - debug:
          msg: "Setting up {{ inventory_hostname | upper }} at {{ ansible_host }}"
      - fail:
          msg: "Only one controller is supported"
        when:
        - groups['controller_group'] is defined
        - (groups['controller_group']|length>1)
      - include_tasks: ./tasks/precheck_hostname.yml
    
      roles:
        - role: offline/restore/transfer
          when: offline_mode
        - role: offline/restore/yum/setup
          when: offline_mode
        - role: os_setup
        - role: docker
        - role: git_repo
        - role: golang
        - role: openness/onprem/master
        - role: cnca/onprem
        #- role: ngc_test/onprem/master
        - role: offline/restore/yum/clean
          when: offline_mode

    使用 include 语句引用 task 文件的方法,可允许你将一个配置策略分解到更小的文件中。

    roles

    role定义一个独立服务的集合,可单独完成某一部分任务,方便playbook复用。

    Roles 的概念来自于这样的想法:通过 include 包含文件并将它们组合在一起,组织成一个简洁、可重用的抽象对象。这种方式可使你将注意力更多地放在大局上,只有在需要时才去深入了解细节。

    roles的目录文件包含:

    files:定义src源文件

    handlers:定义触发器

    tasks:定义任务,必须包含文件main.yaml或main.yml,定义任务。

    templates:定义模板文件

    vars:定义变量

    inventory清单配置文件

    ansible可同时操作属于一个组的多台主机,组合主机间的关系通过inventory文件配置。默认的文件路径为/etc/ansible/hosts。

    [all]
    node01 ansible_ssh_user=root ansible_host=192.168.1.11
    #node02 ansible_ssh_user=root ansible_host=192.168.1.12
    controller01 ansible_ssh_user=root ansible_host=192.168.1.100
    
    [edgenode_group]
    node01
    
    [controller_group]
    controller01

    方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理

    ansible_ssh_host
          将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
    
    ansible_ssh_port
          ssh端口号.如果不是默认的端口号,通过此变量设置.
    
    ansible_ssh_user
          默认的 ssh 用户名
    
    ansible_ssh_pass
          ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
    
    ansible_sudo_pass
          sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
    
    ansible_sudo_exe (new in version 1.8)
          sudo 命令路径(适用于1.8及以上版本)
    
    ansible_connection
          与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
    
    ansible_ssh_private_key_file
          ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
    
    ansible_shell_type
          目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh''fish'.
    
    ansible_python_interpreter
          目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如  *BSD, 或者 /usr/bin/python
          不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
    
          与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

    示例

    openNESS采用ansible管理安装:

    https://github.com/open-ness/openness-experience-kits.git

    使用参考:

    https://github.com/open-ness/specs/blob/master/doc/getting-started/on-premises/controller-edge-node-setup.md

    https://github.com/open-ness/specs/blob/master/doc/getting-started/on-premises/offline-deployment.md

    可直接通过ansible-playbook执行剧本:

    ansible-playbook -vv ./onprem_cleanup.yml --inventory inventory.ini

    ansible-playbook -vv ./onprem_controller.yml --inventory inventory.ini

    ansible-playbook -vv ./onprem_node.yml --inventory inventory.ini

    ansible-playbook -vv ./offline_prepare.yml --inventory offline_preparation_inventory.ini

    参考:

    1. https://docs.ansible.com/  ansible官网

    2. Ansible  入门博客

    3. 自动化运维工具——【ansible详解 一】

    4. Ansible中文权威指南

  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/12252964.html
Copyright © 2011-2022 走看看