概述
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 ;执行剧本
openNESS的onprem_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/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 入门博客