> 文章列表 > ansible

ansible

ansible

你应该这样做

每个项目都创建一个目录里面创建 ansible.cfg 主机清单 和yml文件

文件中node.name: {{ ansible_hostname }} 用copy模块拷过去

幂等

重复执行,只会影响一次

ping command shell script不支持幂等

部署Ansible

  • 创建实验主机(控制端和被控制端)
  • 配置SSH实验环境
  • 安装Ansible自动化软件
  • 修改Ansible配置

ansible原理  

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

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

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

最后ansible退出ssh远程。

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

 控制节点要求

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

被控制节点要求

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

修改配置文件说明

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

ansible配置文件查找顺序

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

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

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

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

修改主配置文件

[root@control ~]# mkdir  ~/ansible
[root@control ~]# vim  ~/ansible/ansible.cfg
[defaults]
inventory = ~/ansible/inventory            
#主机清单配置文件(inventory可以是任意文件名),英语词汇:inventory(清单、财产清单)
#forks = 5                                    #ssh并发数量
#host_key_checking = False                  #是否校验密钥(第一次ssh时是否提示yes/no)

修改主机清单文件(清单文件名必须与主配置文件inventory定义的一致)

[root@control ~]# vim  ~/ansible/inventory
[test]                    #定义主机组(组名称任意)
node1                    #定义组中的具体主机,组中包括一台主机node1
[proxy]                    #定义主机组(组名称任意),英语词汇:proxy(代理人,委托人)
node2                      #proxy组中包括一台主机node2
[webserver]
node[3:4]                 #这里的node[3:4]等同于node3和node4
[database]
node5
[cluster:children]        #嵌套组(children为关键字),不需要也可以不创建嵌套组
webserver                  #嵌套组可以在组中包含其他组
database

Ansible ad-hoc应用

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

模块(就是脚本,多数为python脚本)

command(默认模块)

[root@control ansible]# ansible  node1  -m  command  -a   "uptime"     #查看CPU负载
[root@control ansible]# ansible  node1  -m command -a  "uname -r"      #查看内核版本
[root@control ansible]# ansible  node1   -a   "ip a s"                  #查看网卡信息
[root@control ansible]# ansible  all   -a   "date"                      #查看时间

ansible-doc获取帮助

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

Shell模块

command和shell模块的区别,command不支持bash的特性,如管道和重定向等功能,但是shell模块可以支持。

[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警告提示,正常!!!

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

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看看文件是否被创建成功   ##

state状态包括 absent 卸载 persent 安装  link 软链接

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查看是否有该文件

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查看下是否下载成功
#不能下载目录,如果需要下载目录,可以先打包后再下载

lineinfile|replace模块

 ansible test -m lineinfile  \\
-a "path=/etc/issue line='hello world'"
#在/etc/issue文件中添加一行内容hello world,默认添加到最后,line后面跟的是需要添加的文件内容
nsible test -m replace \\
-a "path=/etc/issue.net regexp=Kernel replace=Ocean"
#将node1主机中/etc/issue.net文件全文所有的Kernel替换为Ocean

user模块

ansible test -m user -a \\
"name=tuser2 uid=1010 group=adm groups=daemon,root home=/home/tuser2"

yum_repository模块

 ansible test -m yum_repository \\
-a "name=myyum description=test baseurl=ftp://192.168.88.254/centos gpgcheck=yes gpgkey=…"

yum模块

使用yum模块可以安装、卸载、升级软件包(ansible-doc yum),

state: present(安装)|absent(卸载)|latest(升级)。

ansible test -m yum -a "name=unzip state=present"
#安装unzip软件包,state默认为present,也可以不写

service模块

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

state:started|stopped|restarted,

enabled:yes设置开机启动。

ansible test -m service -a "name=httpd state=started"
#调用service模块,启动httpd服务

逻辑卷相关模块(ansible-doc lvg、ansible-doc lvol)

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/vdb1"
#创建名称为myvg的卷组,该卷组由/dev/vdb1组成
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
#修改卷组大小,往卷组中添加一个设备/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-doc 模块名

家庭教育