Ansible的入门及常见模块总结实战

Ansible

帮助获取:

​ ansible-doc -s 模块名 ##查看指定模块的帮助信息

​ ansible-doc -l ##查看支持的所有模块

常用模块:

模块名 用途
file 文件管理,创建文件、目录或链接文件
copy / synchronize 用于传输文件或目录,对于copy传输慢建议采用synchronize(rsync封装)
cron 计划任务模块
user 用户管理
fetch 从客户端文件系统拉取文件到ansible服务端
service 服务状态管理
yum 包管理器,安装卸载软件
template 模板模块,该模块只在playbook中可以使用
setup 用于获取服务器的信息,可以结合template做变量引用
shell / command 命令代执行模块,commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持, shell模块可以做到

基本使用:

查看模块帮助
    ansible-doc -l 查看所有模块
    ansible-doc -s MODULE_NAME 查看指定模块的详细帮助

ansible命令应用基础
    语法: ansible <host-pattern> -f forks [-a args]
            <host-pattern>  在/etc/ansible/hosts中定义的主机组
            -f forks:启动的并发线程数
            -m module_name: 要使用的模块
            -a args: 模块特有的参数
            -u user: 指定用户执行
            -k passwd: 输入指定用户密码
            -C  假定playbook执行,并非真正的操作文件,只检测语法和流程

            --list-host 查看主机组里的主机
            --syntax-check  检测playbook语法

注:部分模块参数
    present 可以理解为True
    absent  可以理解为False

ansible属于SSH进行指令下发,所以对一切主机发号施令前请先配置好各主机通讯时的 [主机地址,SSH端口,用户名,密码/秘钥文件],当然你也可以在指令下发时在手动输入地址和用户认证信息

方案一:配置好免秘钥通讯

[root@node1 np]# ssh-keygen -t rsa          ##回车生成证书信息
[root@node1 np]# ssh-copy-id root@192.168.2.128  ##将自己的公钥发给别人
[root@node1 np]# ssh root@192.168.2.128     ##查看是否成功免秘钥

注:当主机过多时可以考虑使用expect脚本来完成,参考我的另一篇内容制作自定交互分发脚本:https://blog.51cto.com/swiki/1978831

使用ansible的第一个模块ping来检测服务器状态信息

[root@node1 np]# ansible 192.168.2.128 -m ping
192.168.2.128 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@node1 np]# ansible 192.168.2.129 -m ping
192.168.2.129 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
注:ping模块不需要参数所以不用-a,其他需要参数则指定-a

这么操作也太low了,我如果要获取一个集群的状态岂不是要挨个去ping一次?

解决办法:在hosts重定义主机组:

[root@node1 np]# cat /etc/ansible/hosts
    [lb]
    192.168.2.128   
    192.168.2.130
    #192.168.2.13[1:9]  ##表示131-139的主机,还有很多表示方式不一一表述

    [db]
    192.168.2.130

注:hosts文件不光可以定义组还可以定义变量,自定义变量

通讯方案二:hosts中设置inventory变量来定制每台主机的账号和密码

[root@node1 np]# cat /etc/ansible/hosts
    [lb]
    192.168.2.128   ansible_ssh_user=root ansible_ssh_pass=root ##默认是22端口
    192.168.2.129   ansible_ssh_user=root ansible_ssh_pass=123  ##默认是22端口

注:如果128和129的账号和密码一样还可以这样:
    [lb]
    192.168.2.128
    192.168.2.129
    [lb:vars]
    ansible_ssh_user=root
    ansible_ssh_pass=root

不过在hosts中不光可以定义inventory变量还可以定义一些每台主机自己各不相同的自定义变量,用于playbook使用

你学到这个应该大概知道了在ansible与主机间通讯形式有三种:

1. 免秘钥
2. inventory变量
3. 参数指定

以下是一些inventory参数:

...
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)
...
这里只列一部分,参考:https://ansible-tran.readthedocs.io/en/latest/docs/intro_inventory.html

这个时候​我们对lb集群进行ping状态监测:

[root@node1 np]# ansible lb -m ping
192.168.2.128 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.2.129 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
注:也可以用all表示hosts中所有主机

到这里基本快速已经完成了基础,开始学习一些常用的模块:

这里模块总结直接抄的我大表哥的博客总结,不然太费时间了,所以声明下:https://blog.51cto.com/dyc2005/2070729

1、copy模块(synchronize和copy使用方法一致)

从本地copy文件分发到目录主机路径 
参数说明:
src= 源文件路径
dest= 目标路径 
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
content= 自行填充的文件内容
owner 属主
group 属组
mode权限
示例:

ansible all  -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
ansible all -m copy -a "content='hi there\n' dest=/tmp/hi.txt"
到node1上查看
[root@node1 tmp]# ll
-rw------- 1 root root 465 2月   9 14:59 fstab.ansible
-rw-r--r-- 1 root root   9 2月   9 14:58 hi.txt

2、fetch模块

从远程主机拉取文件到本地
示例

[root@ansible ~]# ansible all  -m fetch -a "src=/tmp/hi.txt dest=/tmp"
172.16.3.152 | SUCCESS => {
    "changed": true, 
    "checksum": "279d9035886d4c0427549863c4c2101e4a63e041", 
    "dest": "/tmp/172.16.3.152/tmp/hi.txt", 
    "md5sum": "12f6bb1941df66b8f138a446d4e8670c", 
    "remote_checksum": "279d9035886d4c0427549863c4c2101e4a63e041", 
    "remote_md5sum": null
}
.......省略
说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径

3、command模块

在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析;
示例1:

[root@ansible ~]# ansible all -m command -a "ifconfig"
172.16.3.152 | SUCCESS | rc=0 >>
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.3.152  netmask 255.255.255.0  broadcast 172.16.3.255
        .....省略.....
172.16.3.216 | SUCCESS | rc=0 >>
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.3.216  netmask 255.255.255.0  broadcast 172.16.3.255
        .....省略.....
示例2:

[root@ansible ~]# ansible all -m command -a "ifconfig|grep lo"
172.16.3.152 | FAILED | rc=2 >>
[Errno 2] 没有那个文件或目录

172.16.3.216 | FAILED | rc=2 >>
[Errno 2] 没有那个文件或目录
这就是因为command模块不是shell解析属于裸执行导致的
为了能达成以上类似shell中的解析,ansible有一个shell模块;

4、shell模块

由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,
shell模块可以做到
示例:

[root@ansible ~]# ansible all -m shell -a "ifconfig|grep lo"
172.16.3.152 | SUCCESS | rc=0 >>
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        loop  txqueuelen 0  (Local Loopback)

172.16.3.216 | SUCCESS | rc=0 >>
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        loop  txqueuelen 0  (Local Loopback)

5、file模块

设置文件属性(创建文件)
常用参数:
path目标路径
state directory为目录,link为软件链接
group 目录属组
owner 属主
等,其他参数通过ansible-doc -s file 获取
示例1:创建目录

[root@ansible ~]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"
172.16.3.152 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/var/tmp/hello.dir", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
172.16.3.216 | SUCCESS => {
    "changed": true, 
     .....省略.....
示例2:创建软件链接

[root@ansible ~]# ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link"
172.16.3.152 | SUCCESS => {
    "changed": true, 
    "dest": "/var/tmp/hi.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 11, 
    "src": "/tmp/hi.txt", 
    "state": "link", 
    "uid": 0
}
172.16.3.216 | SUCCESS => {
    "changed": true, 
     .....省略.....

6、cron模块

通过cron模块对目标主机生成计划任务
常用参数:
除了分(minute)时(hour)日(day)月(month)周(week)外
name: 本次计划任务的名称
state: present 生成(默认) |absent 删除 (基于name)

示例:对各主机添加每隔3分钟从time.windows.com同步时间

[root@ansible ~]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/update time.windows.com &>/dev/null'  name=update_time"
172.16.3.152 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "update_time"
    ]
}
172.16.3.216 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "update_time"
    ]
}

#到node1上查看
[root@node1 tmp]# crontab -l
#Ansible: update_time
*/3 * * * * /usr/sbin/update time.windows.com &>/dev/null
示例2:删除计划任务

[root@ansible ~]# ansible all -m cron -a "name=update_time state=absent"
172.16.3.152 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
172.16.3.216 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
#node1上查看
[root@node1 tmp]# crontab -l
会发现已经被删除了

7、yum模块

故名思义就是yum安装软件包的模块;
常用参数说明:
enablerepo,disablerepo表示启用与禁用某repo库
name 安装包名
state (present' orinstalled', latest')表示安装, (absent' or `removed') 表示删除
示例:通过安装epel扩展源并安装nginx

[root@ansible ~]# ansible all -m yum -a "name=epel-release state=installed"
[root@ansible ~]# ansible all -m yum -a "name=nginx state=installed"

8、service模块

服务管理模块
常用参数:
name:服务名
state:服务状态
enabled: 是否开机启动 true|false
runlevel: 启动级别 (systemed方式忽略)

示例:

[root@ansible ~]# ansible all -m service -a "name=nginx state=started enabled=true"
到node1上查看
[root@node1 tmp]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 五 2018-02-09 15:54:29 CST; 1min 49s ago
 Main PID: 10462 (nginx)
   CGroup: /system.slice/nginx.service
           ├─10462 nginx: master process /usr/sbin/nginx
           └─10463 nginx: worker process
......省略......

9、script模块

把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;
直接上示例:
本地ansible上的脚本:

[root@ansible ~]# cat test.sh 
#!/bin/bash
echo "ansible script test!" > /tmp/ansible.txt
[root@ansible ~]# ansible all -m script -a "/root/test.sh"
172.16.3.152 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 172.16.3.152 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []
}
172.16.3.216 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 172.16.3.216 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []
}
到node1上查看
[root@node1 tmp]# ls
ansible.txt  fstab.ansible  hi.txt 
[root@node1 tmp]# cat ansible.txt
ansible script test!
script模块这个功能可以做很多事,就看你怎么用了~
以上是常用模块,至于其他模块的使用可通过官方模块列表获得~

playbook

学会了上面的就可以开始搞playbook了:

开搞之前你需要知道为什么要用playbook?因为我们到此之前学的都是单个功能,复制个文件什么的,这些我想说我在CRT下面开个窗口都能做,那么playbook到底能做什么呢?

playbook你可以理解为一个剧本,就是playbook中,可以定义哪些主机依次分别该干哪些事,从而完成一项复杂庞大的任务,通常我们用它来部署服务,我们先写一个简单的(注意基于yaml语法):

---
- hosts: lb         ##指定lb组的主机做以下的事情
  remote_user: root ##以哪个用户的身份去执行
  tasks:    ##任务列表
  - name: install nginx     ##第一步,给这个任务命名为安装nginx
    yum: name=nginx state=installed ##模块名: 参数
  - name: installed nginx config  ##第二步,准备配置文件
    copy: src=~/playbook/nginx.conf_v2 dest=/etc/redis.conf owner=redis mode=0640  
  - name: start nginx   ##启动nginx
    service: name=nginx state=started

如何执行playbook?

[root@node1 np]# ansible-playbook --syntax-check nginx.yml  ##没有错误抛出即可
[root@node1 np]# ansible-playbook nginx.yml    ##执行之前,准备好playbook中需要的配置文件

好了这就是一个简单的nginx的playbook,以后你给新机器装nginx就可以这么搞了,把配置文件搞好每次执行这个文件即可

不行了不行了,今天赶火车实在没时间了,先排版到这吧,下周一给小伙伴补齐playbook和roles

原文地址:https://blog.51cto.com/swiki/2364969

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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'