自动化运维工具Ansible入门笔记(一)

https://blog.csdn.net/du_wood/article/details/84915731

一、简介:

    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

    (1)、连接插件connection plugins:负责和被监控端实现通信;

    (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

    (3)、各种模块核心模块、command模块、自定义模块;

    (4)、借助于插件完成记录日志邮件等功能;

    (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

    Ansible默认通过 SSH 协议管理机器.安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库.只要在一台电脑(可以是一台笔记本)上安装好,就可以通过这台电脑管理一组远程的机器.在远程被管理的机器上,不需要安装运行任何软件,因此升级Ansible版本不会有太多问题.

    Ansible is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.

 

    Ansible’s main goals are simplicity and ease-of-use. It also has a strong focus on security and reliability, featuring a minimum of moving parts, usage of OpenSSH for transport (with an accelerated socket mode and pull modes as alternatives), and a language that is designed around auditability by humans–even those not familiar with the program.

 

    好吧!以上的内容完全是拼凑来的,但足以描述ansible的特性了。ansible的特点就是不需要安装客户端,只需一台主机安装ansible和相关组件即可,ansible默认会通过OpenSSH与被管理主机通讯,并完成一系列命令。当然如果主机无法使用OpenSSH,ansible也提供了其他的通讯方式,例如python的pramamiko模块(ansible是使用py开发的)。仔细一想貌似原理并不复杂,使用bash中的ssh就可以实现了,但ansible的功能远不止这么简单,他只是提供一个框架,真正强大的是他可拓展的模块们以及ansible的衍生产品。(主要模块上边有介绍)

ansible的工作流程大致如下:


 想要掌握一个工具,最快的办法就是使用它,从搭建环境开始↓

 

二、安装

官网上提供了多种安装方式:http://docs.ansible.com/ansible/latest/intro_installation.html ,包括使用yum、apt、Python的pip以及源码安装等。笔者使用Ubuntu系统做测试,所以为了方便直接选择apt了:

Java代码

复制代码

 

收藏代码

  1. $ sudo apt-get update  
  2. $ sudo apt-get install software-properties-common  
  3. $ sudo apt-add-repository ppa:ansible/ansible  
  4. $ sudo apt-get update  
  5. $ sudo apt-get install ansible  
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

 注意:ansible依赖Python运行环境,所以在安装ansible之前,需要安装2.7以上版本的Python。

 

 

 

安装好之后,打开/etc/ansible/hosts文件,该文件是配置被管理主机的,ansible默认会在/etc/ansible/hosts文件中查找被管理主机,当然也可以使用 -i 或定义环境变量的方式自定义。

hosts中有好多被注释掉的配置,这些注释简单介绍了该文件的配置方法,我们先不管,直接在该文件最底部加一行:

Java代码

复制代码

 

收藏代码

  1. 127.0.0.1      ansible_connection=ssh  ansible_ssh_user=app  
127.0.0.1      ansible_connection=ssh  ansible_ssh_user=app

 注:127.0.0.1是被管理主机的ip,由于我只有一台主机,所以只好配置成自己来实验了!ansible_ssh_user为连接到被管理主机所使用的用户。

 

 

测试一下:

 

Java代码

复制代码

 

收藏代码

  1. ansible all -m ping --ask-pass -c paramiko  
ansible all -m ping --ask-pass -c paramiko

 注:ping模块用于测试连通性,( -m用于指定用哪个模块,--ask-pass 询问密码,-c paramiko 代替sshpass )。由于我的机器没安装sshpass ,所以使用Python的paramiko代替了。all指定被管理主机群,all表示所有hosts中配置的主机都要执行这个命令。

 输入密码后,结果如下:

Java代码

复制代码

 

收藏代码

  1. SSH password:   
  2. 127.0.0.1 | SUCCESS => {  
  3.     "changed": false,   
  4.     "ping": "pong"  
  5. }  
SSH password: 
127.0.0.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

 表示执行成功了。

 

 

三、简单配置:

  1. 自定义hosts文件,现在我不想使用/etc/ansible/hosts文件配置被管理主机了,我要在$home/目录下自定义一个文件作为hosts:

    Java代码

    复制代码

     

    收藏代码

    1. $ cd ~  
    2. $ touch ansible_hosts  
    3. $ echo '[appServer]' >>ansible_hosts  
    4. $ echo '127.0.0.1       ansible_connection=ssh  ansible_ssh_user=app' >>ansible_hosts  
    5. $ cat ansible_hosts  
    6. [appServer]  
    7. 127.0.0.1       ansible_connection=ssh  ansible_ssh_user=app  
    $ cd ~
    $ touch ansible_hosts
    $ echo '[appServer]' >>ansible_hosts
    $ echo '127.0.0.1       ansible_connection=ssh  ansible_ssh_user=app' >>ansible_hosts
    $ cat ansible_hosts
    [appServer]
    127.0.0.1       ansible_connection=ssh  ansible_ssh_user=app
    
     为方便测试,我们先将/etc/ansible/hosts中配置的主机信息注释掉,使用-i指定该文件为hosts文件:

    Java代码

    复制代码

     

    收藏代码

    1. $ ansible all -m shell -a "hostname" --ask-pass -i ~/ansible_hosts  
    $ ansible all -m shell -a "hostname" --ask-pass -i ~/ansible_hosts
    
     命令执行成功,但是每次都要-i太麻烦了,我们现在配置ANSIBLE_HOSTS环境变量即可解决:

    Java代码

    复制代码

     

    收藏代码

    1. $ echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.bashrc  #加入环境变量  
    2. $ source ~/.bashrc      #使环境变量立即生效  
    $ echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.bashrc  #加入环境变量
    $ source ~/.bashrc      #使环境变量立即生效
     现在不使用-i了:

    Java代码

    复制代码

     

    收藏代码

    1. ansible all -m shell -a "hostname" --ask-pass  
    ansible all -m shell -a "hostname" --ask-pass
     执行成功。
  2. 使用--ask-pass每次都要输入密码,太麻烦了,当然我们可以使用ansible_ssh_pass把密码配置进hosts文件中,如下,但是这种存储明文密码的做法并不推荐。

    Java代码

    复制代码

     

    收藏代码

    1. 127.0.0.1       ansible_connection=ssh  ansible_ssh_user=app    ansible_ssh_pass=123456  
    127.0.0.1       ansible_connection=ssh  ansible_ssh_user=app	ansible_ssh_pass=123456
     我们通常的做法是使用公钥登录被管理主机,ansible提供了秘钥管理模块:

    Java代码

    复制代码

     

    收藏代码

    1. $ #生成公钥  
    2. $ ssh-keygen -t rsa  
    3. $ #使用ssh秘钥管理模块将公钥写入主机  
    4. $ ansible all -m authorized_key -a "user=admin key='{{ lookup('file', '/servers/.ssh/id_rsa.pub') }}' path=/servers/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko  
    $ #生成公钥
    $ ssh-keygen -t rsa
    $ #使用ssh秘钥管理模块将公钥写入主机
    $ ansible all -m authorized_key -a "user=admin key='{{ lookup('file', '/servers/.ssh/id_rsa.pub') }}' path=/servers/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko
    
     或者我们可以使用文件模块,将秘钥文件传输到被管理主机,再使用shell写入:

    Java代码

    复制代码

     

    收藏代码

    1. $ #传公钥到被管理主机  
    2. $ ansible all -m copy -a "src=/servers/.ssh/id_rsa.pub dest=/tmp/id_rsa.pub" --ask-pass -c paramiko  
    3. $ #将公钥写入被管理主机  
    4. $ ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko -u root #需要启动root用户ssh登录  
    $ #传公钥到被管理主机
    $ ansible all -m copy -a "src=/servers/.ssh/id_rsa.pub dest=/tmp/id_rsa.pub" --ask-pass -c paramiko
    $ #将公钥写入被管理主机
    $ ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko -u root #需要启动root用户ssh登录
     注:-u 指定登录用户,注意若要使用root用户登录,需要先开启root用户的ssh登录权限,若未开通方法如下:

    Java代码

    复制代码

     

    收藏代码

    1. $ #允许root用户使用ssh登录  
    2. $ sudo vi /etc/ssh/sshd_config  
    3. $   #修改配置内容:PermitRootLogin yes  
    4. $ service sshd restart  #重启ssh生效  
    $ #允许root用户使用ssh登录
    $ sudo vi /etc/ssh/sshd_config
    $ 	#修改配置内容:PermitRootLogin yes
    $ service sshd restart  #重启ssh生效
    
     验证一下:

    Java代码

    复制代码

     

    收藏代码

    1. $ ansible all -m shell -a "hostname"  
    $ ansible all -m shell -a "hostname"
     不用输入密码,即可执行成功!

原文地址:https://blog.csdn.net/weixin_42408510/article/details/88393194

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


----name:setpublickeyonremotehosts&setreomtehostssudoersfilehosts:all#此脚本要求所有的主机root用户密码相同become:noremote_user:rootvars:-remoteuser:user1:rhcetasks:-name:setsecondarygroupforrhce
环境准备#cat/etcedhat-releaseCentOSLinuxrelease7.9.2009(Core)#pythonPython3.7.11(default,Jul312022,16:12:35)[GCC4.8.520150623(RedHat4.8.5-44)]onlinuxType"help","copyright","credits"or"li
准备好环境,在安装之前请先了解openshift提供的ansible有大量的安装选项文档地址:https://docs.okd.io/latest/install/configuring_inventory_file.html1、配置/etc/ansible/hosts 
Ansible:运维工作:系统安装(物理机、虚拟机)-->程序包安装、配置、服务启动-->批量操作-->程序发布-->监控OSProvisioning:物理机:PXE、Cobbler虚拟机:ImageTemplatesConfigration:puppet(ruby)saltstack(python)chefcfengineCommandand
ansible与salt对比相同都是为了同时在多台机器上执行相同的命令都是python开发不同agent(saltstack需要安装、ansible不需要)配置(salt配置麻烦,ansible基本不用配置)学习路线(salt比较陡峭,ansible比较平缓)第三方工具(salt比较少)开源社区的对接(salt比较少)现有用户(salt还是an
[root@node1playbook]#catnginx.yml-hosts:test\\主机组,要和nginx.yml在同一个目录下remote_user:root\\远端执行任务的用户tasks:\\任务-name:installhttpd\\任务描述command:yum-yinstallhttpd\\调用ansible的command模块安装httpd-na
一直不知道这个模块到底在哪,并且也挺想搞清楚官方那些模块到底在哪个目录下。1.使用grep-rl"copy.py"/usr/lib/python2.7/site-packages/ansible(这个目录是专门放ansible源码目录的)然后找到是/usr/lib/python2.7/site-packages/ansible/modules/files/copy.py这个文件,这里需要
ansile作为去除安装agent的自动化工具,通过ssh协议的简单功能强大的自动化工作。在ansile使用的过程中,有三种用途1、ansible自行一次性任务,即执行命令如:ansible10.59.87.11-mping*ansible"dev-hdp"-mcopy-a"src=oot/HfHadoopHiveUdf.jardest=/data1/opt/cloudera/par
ansible-playbook(1) Ansible组成部分InventoryModulesAdHocCommandsplaybooksplaybooks:Tasks:任务,即调用的模块完成的某操作variables:变量Templates:模版Roles:角色 基本结构:-host:webserverremote_user:tasks:
报错:[root@jenkins~]#ansiblego_activity-mcron-a"name='log_clear'minute=0hour=2job=find/home/golanger/log/-typef-name'log$(date+\%d-d-1day)'-delete"ERROR!thistask'cron'hasextraparams,wh
一、测试环境说明1、系统:rhel6.92、ip地址:20.20.20.24/2420.20.20.41/2420.20.20.42/243、以下操作使用root身份进行,也可以使用具有sudo权限的用户进行相关操作二、环境准备1、关闭iptables防火墙、selinux#/etc/init.d/iptablesstop#
ansible常用模块安装:依赖于epel源yuminstallansible-y配置文件:/etc/ansible/ansible.cfgInvertoory:/etc/ansible/hosts 如何查看模块帮助:ansible-doc-lansible-doc-sMODULE_NAME` ansible命令应用基础:语法:ansible<host-pattern>[options]-fforks
copycopy模块是将ansible管理主机上的文件拷贝上远程主机中,与fetch相反,如果目标路径不存在,则自动创建,如果src的目录带“/”则复制该目录下的所有东西,如果src的目录不带“/”则连同该目录一起复制到目标路径;常用模块src参数:用于指定需要copy的文件或目录
9.YAML9.1简介(1)YAML是一个可读性高的用来表达资料序列的格式。(2)YAML参考了其它多种语言。包括:XML、C语言、python、perl以及电子邮件格式的RFC2822等。ClarkEvans在2001年首次发表了这种语言。(3)YAML不是XML,在开发这种语言时,YAML的意思其实是:yetanothermarkuplanguage,9.2特性(1)YA
了解ansibleansible批量在远程主机上执行命令ansible主要是为了进行操作多个主机而进行的#!/bin/envpython文件中直接指向python文件#!/bin/base 指行脚本一.ansible第一步.下载epel源wget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.comepo/epel-7.repo
背景:在私有云环境下,遇到要开通某个项目,则需要快速的响应创建虚拟机,并且做一些基础的配置。为了提高效率以及减少手工犯错的概率,一般会采取ansible批量部署,但是使用ansible的前提是预先配置好免密。在密码一致的场景中,可以使用expect优化做免密的过程解决方案:1.
简单例子1:vars定义变量-hosts:allremote_user:rootvars:-package:nginx-service:nginx tasks:-name:installnginxpackage yum:name={{package}}state=latest-name:installconfigurationfileforhttpd copy:src=/etcginxginx
 ansible自动化运维工具的介绍      ansible结构特性:            模块化,调用特定的模块,完成特定的任务;        基于Python语言实现,由Paramiko、PyYAML和Jinja2三个关键模块;        部署简单,agentless        主从模
---恢复内容开始---Templates:模版 cat/etc/ansible/hosts  cattemplatesginx.conf.j2 -hosts:testremote_user:rootvars:-package:httpd-service:httpdtasks:-name:installnginxpackage yum:name={{package}}state=la
1、配置资源清单inventory文件[root@test1~]#cat>/etc/ansible/hosts<<EOF[k8s]192.168.0.92ansible_ssh_port=22ansible_ssh_user=k8sansible_ssh_pass='123'ansible_become_pass='123456'EOF解释:ansible_ssh_pass='123'