ansible简述

概述

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

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

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

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/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中文权威指南

上一篇:自动化运维工具Ansible


下一篇:Ansible之playbook