ansible基本使用

如下图环境所示:

ansible原理:

控制端主机自带很多模块(模块就是脚本);

ansible通过ssh远程被管理主机,将控制端的模块(脚本)或命令传输到被管理主机;

在被管理端主机执行模块(脚本)或命令,执行不同的模块或命令可以实现不同的功能;

最后ansible退出ssh远程。

绝大多数模块(脚本)都需要参数才能执行成功!!!类似于shell脚本的位置变量!

拓扑结构如图-1所示。

控制节点要求:

  • 域名解析(为了方便后期操作,可以不做)
  • 配置SSH密钥(ansible是基于ssh实现远程控制)
  • 安装Ansible软件

Ansible是基于SSH远程的原理实现远程控制,如果控制端主机无法免密登录被管理端主机,后续的所有试验都会失败!

[root@control ~]#  ssh-keygen        #生成ssh密钥
[root@control ~]#  for i in node1 node2 node3 node4 node5
do
ssh-copy-id   $i 
done
#拷贝密钥到远程主机
#提示:拷贝密钥到远程主机时需要输入对方电脑的账户密码才可以!!
#拷贝密钥到node1就需要输入node1对应账户的密码,拷贝密钥到node2就需要输入node2对应的密码

被控制节点要求:

  • Ansible默认通过SSH协议管理机器
  • 被管理主机要开启SSH服务,并允许控制主机登录
  • 被管理主机需要安装有Python

主配置文件说明:

主配置文件ansible.cfg(主配置文件的内容可以参考/etc/ansible/ansible.cfg)

ansible配置文件查找顺序

首先检测ANSIBLE_CONFIG变量定义的配置文件(默认没有这个变量)

其次检查当前目录下的./ansible.cfg文件

再次检查当前用户家目录下~/ansible.cfg文件

最后检查/etc/ansible/ansible.cfg文件

Ansible ad-hoc是一种通过命令行批量管理的方式,命令基本格式如下:

格式:ansible 主机集合 -m 模块名 -a "参数"

[root@control ansible]# ansible-doc  -l      #列出所有模块
[root@control ansible]# ansible-doc -l | grep yum      #在所有模块中过滤关键词
[root@control ansible]# ansible-doc yum        #查看模块帮助

1)Shell模块。

command和shell模块的区别,command不支持bash的特性(bash有哪些特性可以参考Shell课程第一天的PPT),如管道和重定向等功能,但是shell模块可以支持。

不可以使用shell模块执行交互命令,如vim、top等

[root@control ansible]# ansible test -m command -a "ps | wc -l"      #报错
[root@control ansible]# ansible test -m command -a  "ls &"        #报错
[root@control ansible]# ansible test -m shell -a  "ps aux | wc -l"       #进程数量
[root@control ansible]# ansible test -m shell -a  "who"                   #登陆信息
[root@control ansible]# ansible test -m shell -a  "touch /tmp/txt.txt"  
#使用shell模块创建文件会有Warning警告提示,正常!!!

2)script模块

script模块会把-a后面的脚本拷贝到被管理端主机,然后执行这个脚本。

[root@control ansible]# vim  ~/ansible/test.sh  
#!/bin/bash
dnf -y install httpd
systemctl start httpd
[root@control ansible]# ansible  test  -m script  -a  "./test.sh"    
#test是主机组的名称,-m调用script模块,-a后面的./test.sh是上面创建脚本的相对路径和文件名
#./是当前目录的意思,在当前目录下有个脚本叫test.sh

3)file模块

file模块可以创建文件、目录、链接;修改权限与属性等(ansible-doc file)

[root@control ansible]# ansible  test  -m  file  -a  "path=/tmp/file.txt state=touch"         #远程test组中所有主机,新建文件,path后面指定要创建的文件或目录的名称
#state=touch是创建文件,state=directory是创建目录
## 验证: 到node1主机,使用ls /tmp/file.txt看看文件是否被创建成功   ##

4)copy模块

copy模块可以将文件拷贝到远程主机 (ansible-doc copy)

[root@control ansible]# echo AAA > ~/a3.txt                   #新建测试文件
[root@control ansible]# ansible test -m copy -a "src=~/a3.txt dest=/root/"
#把管理端本机的a3.txt文件,拷贝到test组中所有主机的/root/目录
#src代表源文件,dest代表目标文件
## 验证:到node1主机使用ls /root/a3.txt查看是否有该文件

5)fetch模块

fetch模块与copy类似,但是作用相反,可以将其他主机的文件拷贝到本地(ansible-doc fetch)。

[root@control ansible]# ansible test -m fetch -a "src=/etc/hostname   dest=~/"
#将远程test组中所有主机的hostname文件下载到本地家目录
#src代表源文件,dest代表目标文件
[root@control ansible]# ls  ~/          #使用ls查看下是否下载成功
#不能下载目录,如果需要下载目录,可以先打包后再下载

6)lineinfile|replace模块

在修改单个文件的单行内容时可以使用lineinfile模块(ansible-doc lineinfile)

[root@control ansible]# ansible test -m lineinfile  \
-a "path=/etc/issue line='hello world'"
#在/etc/issue文件中添加一行内容hello world,默认添加到最后,line后面跟的是需要添加的文件内容
## 验证:到node1主机执行命令cat /etc/issue查看文件内容是否正确
[root@control ansible]# ansible test -m lineinfile \
-a "path=/etc/issue line='hello world'"
#基于幂等原则,重复执行,不会创建多行内容
[root@control ansible]# ansible test -m lineinfile \
-a "path=/etc/issue line='insert' insertafter='Kernel'"
#将line后面的内容插入到/etc/issue文件中Kernel行的后面
#英语词汇:insert(插入),after(在…后面)
## 验证:到node1主机执行命令cat /etc/issue查看文件内容是否正确

lineinfile会替换一整行,replace可以替换关键词(ansible-doc replace)。

[root@control ansible]# ansible test -m replace \
-a "path=/etc/issue.net regexp=Kernel replace=Ocean"
#将node1主机中/etc/issue.net文件全文所有的Kernel替换为Ocean
#regexp后面是需要替换的旧内容;replace后面是需要替换的新内容
## 验证:到node1主机执行命令cat /etc/issue.net查看文件内容是否正确

7)user模块

user模块可以实现Linux系统账户管理(ansible-doc user)

[root@control ansible]# ansible test -m user -a "name=tuser1"
#远程test组中的所有主机并创建系统账户tuser1,默认state的值为present,代表创建用户
## 验证:到node1主机执行命令id  tuser1查看是否有该用户
[root@control ansible]# ansible test -m user -a \
"name=tuser2 uid=1010 group=adm groups=daemon,root home=/home/tuser2"
#创建账户并设置对应的账户属性,uid指定用户ID号,group指定用户属于哪个基本组
#groups指定用户属于哪些附加组,home指定用户的家目录
## 验证: 到node1主机执行命令id tuser2查看是否有该用户
[root@control ansible]# ansible test -m user \
-a "name=tuser1 password={{'abc'| password_hash('sha512')}}"
#修改账户密码,用户名是tuser1,密码是abc,密码经过sha512加密
[root@control ansible]# ansible test -m user \
-a "name=tuser1 state=absent"
#删除账户tuser1,state=absent代表删除账户的意思,name指定要删除的用户名是什么
#账户的家目录不会被删除,相当于执行userdel tuser1
[root@control ansible]# ansible test -m user \
-a "name=tuser2 state=absent remove=true"
#删除tuser2账户同时删除家目录、邮箱,相当于执行userdel  -r  tuser2

8)yum模块

使用yum_repository可以创建或修改yum源配置文件(ansible-doc yum_repository)

[root@control ansible]# ansible test -m yum_repository \
-a "name=myyum description=hello baseurl=ftp://192.168.4.254/centos gpgcheck=no"
#新建一个yum源配置文件/etc/yum.repos.d/myyum.repo
#yum源文件名为myyum,该文件的内容如下:
[myyum]
baseurl = ftp://192.168.4.254/centos
gpgcheck = 0
name = hello
## 验证:到node1主机ls /etc/yum.repos.d/查看该目录下是否有新的yum文件

9)service模块

service为服务管理模块(启动、关闭、重启服务等),

state:started|stopped|restarted,

enabled:yes设置开机启动。

[root@control ansible]# ansible test -m yum -a "name=httpd"
#调用yum模块,安装httpd软件包
## 验证:到node1主机执行命令rpm -q httpd查看该软件是否被安装
[root@control ansible]# ansible test -m service -a "name=httpd state=started"
#调用service模块,启动httpd服务
## 验证:到node1主机执行命令systemctl  status  httpd查看服务状态
[root@control ansible]# ansible test -m service -a "name=httpd state=stopped"
#调用service模块,关闭httpd服务
## 验证:到node1主机执行命令systemctl  status  httpd查看服务状态
[root@control ansible]# ansible test -m service -a "name=httpd state=restarted"
#调用service模块,重启httpd服务
[root@control ansible]# ansible test -m service -a "name=httpd enabled=yes"
#调用service模块,设置httpd服务开机自启

10)逻辑卷模块

lvg模块:创建、删除卷组(VG),修改卷组大小,

state:present(创建)|absent(删除)

 [root@control ansible]# ansible test -m yum -a "name=lvm2"
#安装lvm2软件包,安装了lvm2软件后,才有pvcreate、vgcreate、lvcreate等命令
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1"
#创建名称为myvg的卷组,该卷组由/dev/sdb1组成
#注意:这里的磁盘名称要根据实际情况填写
## 验证:到node1主机执行命令pvs和vgs查看是否有对应的PV和VG
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1,/dev/sdb2"
#修改卷组大小,往卷组中添加一个设备/dev/sdb2

lvol模块:创建、删除逻辑卷(LV),修改逻辑卷大小,

state:present(创建)|absent(删除)。

[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=2G"
#使用myvg这个卷组创建一个名称为mylv的逻辑卷,大小为2G
## 验证:到node1主机执行命令lvs查看是否有对应的LV逻辑卷
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=4G"
#修改LV逻辑卷大小
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"
#删除逻辑卷,force=yes是强制删除
[root@control ansible]# ansible test -m lvg -a "vg=myvg state=absent"
#删除卷组myvg

Ansible ad-hoc可以通过命令行形式远程管理其他主机,适合执行一些临时性简单任务。另外还有一种远程管理的方式叫Playbook,Ansible Playbook中文名称叫剧本,它将经常需要执行的任务写入一个文件,这个文件就叫剧本。

  • 剧本中可以包含多个任务
  • 剧本写后,我们随时根据剧本,执行相关的任务命令
  • Playbook剧本要求按照YAML格式编写
  • 适合执行周期性经常执行的复杂任务

YAML是什么?

  • YAML是一个可读性高、用来表达数据序列的格式语言
  • YAML:YAML Ain't a Markup Language
  • YAML以数据为中心,重点描述数据的关系和结构

YAML的格式要求如下:

  • "#"代表注释,一般第一行为三个横杠(---)
  • 键值(key/value)对使用":"表示,数组使用"-"表示,"-"后面有空格
  • key和value之间使用":"分隔
  • ":"后面必须有空格
  • 一般缩进由两个或以上空格组成
  • 相同层级的缩进必须对齐,缩进代表层级关系
  • 全文不可以使用tab键
  • 区分大小写
  • 扩展名为yml或者yaml
  • 跨行数据需要使用>或者|,其中|会保留换行符

Playbook语法格式要求如下:

  • playbook采用YAML格式编写
  • playbook文件中由一个或多个play组成
  • 每个play中可以包含:
  • hosts(主机)、tasks(任务)、vars(变量)等元素组成
  • 使用ansible-playbook命令运行playbook剧本

1)setup模块

ansible_facts用于采集被管理设备的系统信息,所有收集的信息都被保存在变量中,每次执行playbook默认第一个任务就是Gathering Facts,使用setup模块可以查看收集到的facts信息。

[root@control ansible]# ansible test -m setup
192.168.4.10 | SUCCESS => {
"ansible_facts": {
   "ansible_all_ipv4_addresses": [
… 省略部分内容…

找出下列变量:

  • ansible_all_ipv4_addresses #IP地址
  • ansible_bios_version #主板BIOS版本
  • ansible_memtotal_mb #总内存
  • ansible_hostname #主机名
  • ansible_fqdn #主机的域名
  • ansible_devices.sda.partitions.sda1.size #某个磁盘分区的大小

2)debug模块

debug模块可以显示变量的值,可以辅助排错,通过msg可以显示变量的值,变量需要使用{{}}扩起来。

[root@control ansible]# vim ~/ansible/debug.yml
---
- hosts: test
  tasks:
    - debug:
        msg: "主机名是:{{ ansible_hostname }}"
    - debug:
        msg: "总内存大小:{{ ansible_memtotal_mb }}"
#备注调用debug模块显示某些具体的变量值
#debug模块可以显示变量的值,可以辅助排错

Ansible从1.2版本开始支持Role(角色),Role(角色)是管理ansible文件的一种规范(目录结构),Role(角色)会按照标准的规范,自动到特定的目录和文件中读取数据。

如果我们创建了一个名称为user.example的Role(角色),则其标准的目录结构如下图-1所示。

Roles目录结构中主要文件

  • defualts/main.yml:定义变量的缺省值,优先级较低
  • files目录:存储静态文件的目录,如tar包、音乐、视频等
  • handlers/main.yml:定义handlers
  • meta/main.yml:写作者、版本等描述信息
  • README.md:整个角色(role)的描述信息
  • tasks/main.yml:定义任务的地方
  • templates目录:存放动态数据文件的地方(文件中包含了变量的模板文件)
  • vars/main.yml:定义变量,优先级高

1)创建角色

下面这个案例目的:编写一个包含变量的模板文件,编写任务调用template模块,将模板文件拷贝给被管理端主机。

ansible-galaxy命令可以创建、管理自己的角色。

[root@control ansible]# mkdir ~/ansible/roles
[root@control ansible]# ansible-galaxy init  ~/ansible/roles/issue
#创建一个Role,该Role的目的是拷贝自己新建的一个模板文件到远程主机的/etc/issue
[root@control ansible]# tree  ~/ansible/roles/issue/
#查看目录结构,如果没有tree命令则需要使用yum安装该软件

2)修改Role文件

定义名称为myfile.txt的模板文件(该文件包含变量,因此必须放置templates目录)

[root@control ansible]# vim ~/ansible/roles/issue/templates/myfile.txt
This is the system {{ansible_hostname}}
Today's date is:{{ansible_date_time.date}}
Contact to {{ admin }}

自定义变量文件(前面调用了admin这个变量,这里需要定义admin变量并赋值)

[root@control ansible]# vim ~/ansible/roles/issue/vars/main.yml
---
# vars file for /root/ansible/roles/issue
admin: yoyo@tedu.cn
#变量名为admin,变量的值为yoyo@tedu.cn

修改任务文件,任务文件中不需要tasks关键词,Role的各个文件之间相互调用不需要写文件的路径

[root@control ansible]# vim ~/ansible/roles/issue/tasks/main.yml
---
# tasks file for /root/ansible/roles/issue
-  name: delever issue file
   template:
     src: myfile.txt
     dest: /etc/issue
#调用template模块将myfile.txt文件拷贝给被管理端主机.

3)在Playbook中调用Role

Role创建好了,role不会自己运行,需要编写一个剧本调用上面的role。

编写playbook剧本文件,通过roles关键词调用role。

[root@control ansible]# vim  ~/ansible/issue.yml
---
- hosts: test
  roles:
    - issue
#   - role2              #支持加载多个role

修改ansible.cfg配置文件,定义角色目录

[root@control ansible]# vim  ~/ansible/ansible.cfg 
[defaults]
inventory = ./inventory
roles_path = ./roles                    #指定到哪个目录下找role
remote_user = alice
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大 大金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值