其他分享
首页 > 其他分享> > ansible基本使用

ansible基本使用

作者:互联网

Ansible

由于公司升级服务器和处理问题抓包,

可能需要同时操作多台服务器(繁琐的解压、copy、备份),

我便发现了ansible工具!

现在通过下班时间部署在自己虚拟机测试与总结,有错误与不足的地方请提醒,

参考资料有博客园大神分享与同事分享文档!(本文章里都有附属链接)

欢迎交流:

安装ansible参考博客链接

本版为ansible --version:ansible 2.9.21

简单配置

/etc/ansible/:ansible目录

执行状态

免密操作

测试&帮助操作

ansible test --list #查看自定义test模块列表信息

ansible test -m ping #测试服务器是否连接成功

ansible-doc -l #列出所有模块

ansible-doc -l | grep yum #在所有模块中过滤关键词

ansible-doc yum #查看模块帮助

ansible -h #查看帮助选项

常用模块

shell模块

script模块
unarchive模块
copy模块
fetch模块

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

file模块
path=/路径/文件  #" path + file " = " dest + file " = " name + file "
state=选项
owner=修改属主
group=修改属组
mode= 修改权限
state	 absent	将数据进行删除
state	 directory	创建一个空目录信息
state	 file	查看指定目录信息是否存在
state	 touch	创建一个空文件信息
state	 hard/link	创建链接文件
lineinfile模块

单个文件添加内容

replace模块
user模块

点击参考博客

image-20210702171019665

cron定时任务

定时任务模块:点击参考博客

参数
day= #日应该运行的工作( 1-31, *, */2, )
hour= # 小时 ( 0-23, *, */2, )
minute= #分钟( 0-59, *, */2, )
month= # 月( 1-12, *, /2, )
weekday= # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明运行的命令是什么
name= #定时任务描述
reboot # 任务在重启时运行,不建议使用,建议使用special_time
special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user # 以哪个用户的身份执行

示例:ansible test -m cron -a 'name="定时任务测试" minute=/5 hour=/1 job="echo 1 >> /root/1.txt"' #设置定时任务

查看:

image-20210705114056420

删除刚刚的定时任务:ansible test -m cron -a "name='定时任务测试' minute=/5 hour=/1 job='echo 1 >> /root/1.txt' state=absent"

yum模块

主要用于安装软件

name=  #所安装的包的名称
state=  #present--->安装, latest--->安装最新的, absent---> 卸载软件。
disable_pgp_check  #是否禁止GPG checking,只用于presentor latest
update_cache  #强制更新yum的缓存

示例:ansible test -m yum -a 'name=lrzsz,httpd state=present' #安装lrzsz,httpd 卸载name格式一样

可以直接安装rpm包

格式:ansible test -m yum -a 'name=/远程主机目录/rpm包 disable_pgp_check=yes '

service模块

该模块用于服务程序的管理:点击参考博客

arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)
state #有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载配置

示例:

group模块

该模块主要用于添加或删除组:点击参考博客

gid=  #设置组的GID号
name=  #指定组的名称
state=  #指定组的状态,默认为创建,设置值为absent为删除
system=  #设置值为yes,表示创建为系统组

示例:创建组:ansible test -m group -a 'name=shen gid=123'

查看:

image-20210705154626187

删除:ansible test -m group -a 'name=shen state=absent'

查看:

image-20210705161644694

hostname模块

修改主机名

示例:ansible 192.168.23.138 -m hostname -a 'name=kexiao'

image-20210705164854601

setup模块

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

ansible_memtotal_mb #总内存

ansible_hostname #主机名

ansible_fqdn #主机的域名

示例:

ansible test -m setup -a 'filter="ipv4"' #获取test组ip4相关的信息 注:filter=过滤

ansible test -m setup -a 'filter="bios"' #获取主板bios信息

#查找与cpu相关的变量
ybt root /etc/ansible/templates #ansible test -m setup |grep "cpu"
        "ansible_processor_vcpus": 1, 
        "ansible_processor_vcpus": 1,
ybt root /etc/ansible/templates #ansible test -m setup |grep "processor"
        "ansible_processor": [
        "ansible_processor_cores": 1, 
        "ansible_processor_count": 1, 
        "ansible_processor_threads_per_core": 1, 
        "ansible_processor_vcpus": 1, 
        "ansible_processor": [
        "ansible_processor_cores": 1, 
        "ansible_processor_count": 1, 
        "ansible_processor_threads_per_core": 1, 
        "ansible_processor_vcpus": 1, 

image-20210707171849897

debug模块

debug模块可以显示变量的值,可以辅助排错,通过msg可以显示变量的值

[root@ybt ansible]# cat ybt.yml 
---
#ybt demo
- hosts: test   #-空格host:空格 主机清单主机列表           
  remote_user: root   # 在远程主机以root身份执行

  tasks:               #要执行的命令
        - debug:    # 执行什么命令
                msg: "{{ansible_memtotal_mb}}"   #总内存大小变量
# 备注调用debug模块显示某些具体的变量值

image-20210707175022808

yum_repository模块

参数
name:仓库名
description:描述信息,
baseurl:链接
gpgcheck:是否校验
gpgkey:红帽校验链接
enabled:是否开启
state:present|absent:默认present,absent表示删除


lvg模块和lvol

lvg模块:创建、删除卷组(VG),修改卷组大小
lvol模块:创建、删除逻辑卷(LV),修改逻辑卷大小
vg:卷组名,pvs:物理磁盘,更多个分区则为扩展




Ansible-playbook

playbook:如果将ansible的单个模块看作是linux的单条命令,那么playbook就相当于shell脚本

简单playbook演示:

#这是一个剧本
---
#ybt demo
- hosts: test   #-空格host:空格 主机清单主机列表           
  remote_user: root   # 在远程主机以root身份执行

  tasks:               #要执行的任务  任务集
        - name: hello   # 描述说明 但是是必须的
          shell: 'df-h'   # 执行什么命令
ansible-playbook ybt.yml  #ansible 执行剧本

playbook加密操作(了解)

[root@ybt ansible]# ansible-vault encrypt ybt.yml #加密操作
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@ybt ansible]# ansible-playbook ybt.yml  #不能直接运行了 
ERROR! Attempting to decrypt but no vault secrets found
[root@ybt ansible]# ansible-vault decrypt ybt.yml #解密
Vault password: 
Decryption successful
# 解密后就可以执行了 加密后查看是加密形态,解密后正常
#可通过ansible-vault view查看加密文件
[root@ybt ansible]# ansible-vault view ybt.yml  
Vault password: 
[root@ybt ansible]# ansible-vault deit ybt.yml  #输入口令后编辑
YUML语言语法:

list:列表,其所有元素均使用 "-" 开头

示例:
# 这是一个示例描述
- APP
- PHONE

Dictionary:字典,通常由多个key与value构成

示例:
---
# 描述
-name: hello   #name就是key  hello就是value 下边都是!
 job:Developer
 skill:Elite							#第一种写法
 可以将key:value放置于{}中进行表示,用,分隔多个key:value
---
# 描述
{name: hello,job:Developer,skill:Elite}  #第二种写法

playbook执行中出现错误,不退出playbook强制执行剩余命令

taks:
 -name: hello   
  shell: df -h ||/bin/true  #加上//bin/true本条命令执行失败,继续向下执行
或者
 taks:
  -name: hello   
   shell: df -h
   ignore_errors:True   #加上ignore_errors:True忽略错误
playbook检测

&针对某台主机

示例:


handlers&notify的使用

notify写在某个任务下,这个任务一旦执行立马触发执行handlers

示例:

ybt root /etc/ansible #cat httpd.yml 
---
- hosts: test
  remote_user: root

  tasks:
    - name: '安装http'
      yum: name=httpd
      notify: start http  #一旦安装httpd动作发生,就直接执行handlers,不在执行其他
      #notify: 这里名字需要与handlers的name:名字一致
    - name: '关闭服务'
      service: name=httpd state=stopped
  
  handlers:
    - name: start http
      service: name=httpd state=restarted


tags使用

tags给某个或多个任务设置标签

执行语法:ansible-playbook -t 标签名,标签名 playbook.yml

查看标签信息:ansible-playbook playbook.yml --list-tags

示例:

ybt root /etc/ansible #cat httpd.yml 
---
- hosts: test
  remote_user: root

  tasks:
    - name: '安装http'
      yum: name=httpd
      notify: start http 
      tags: tags1 #设置标签,起名为tags1
    - name: '关闭服务'
      service: name=httpd state=stopped
    - name: tags2 #设置标签,起名为tags2
      service: name=httpd state=restarted

  handlers:
    - name: start http
      service: name=httpd state=restarted

#只执行tags1 tags2标签
ybt root /etc/ansible #ansible-playbook -t tags1,tags2 httpd.yml


playbook变量

变量赋值并执行:ansible-playbook -e '变量名=具体值 变量名=具体值' playbook.yml

playbook内部变量写法:{{变量名}}

playbook剧本中定义变量赋值

vars:
	-变量名: 具体值
	-变量名: 具体值
# 注:命令行变量,高于配置文件变量;命令行优先级更高
示例:
---
- hosts: test
  remote_user: root
  vars:
    - pk1: httpd    #声明变量
    - pk2: vsftpd
  tasks:
    - name: '安装http'
      yum: name={{pk1}} 	#使用变量
    - name: '安装vsftpd'
      yum: name={{pk2}}
    - name: '启动'
      service: name={{pk1}},{{pk2}} state=started

定义host清单变量

[test]
192.168.23.137 n=137  #定义单台机器变量, n=137
192.168.23.138 n1=138

[test:vars]   #定义test整个组的变量 语法为:清单名:vars     
ht=/home/cin/etc/  #将scr赋值给n2
hb=/home/cin/bin/
#单台变量优先级高于组变量优先级
变量定义优先级排序: 主机清单 < playbook脚本定义 < 命令行

示例:
ybt root /etc/ansible #cat var.yml
---
- hosts: test 
  remote_user: root
  
  tasks:
    - name: 'hosts清单变量使用'
      file: path={{ht}} state=directory  #使用了清单变量

编辑变量文件

playbook脚本可随时调用

vars.yml  # 定义一个专门存储变量的文件
playbook脚本调用
- hosts: test
	remote_user: root
	vars_files:    #调用格式
		- vars.yml  #调用变量文件

示例:

#定义变量文件(只存放变量)
ybt root /etc/ansible #cat vars.yml 
var1: /home/cin/etc/
var2: /home/cin/bin/
var3: /etc/ansible/testybt/
#使用文件变量
ybt root /etc/ansible #cat var.yml 
---
- hosts: test 
  remote_user: root
  vars_files:   #调用变量文件
    - vars.yml  #变量文件名
  tasks:
    - name: '变量文件使用'
      file: path={{var2}} state=directory
#执行
ybt root /etc/ansible #ansible-playbook var.yml

模板templates
[root@ybt ansible]# mkdir templates  #ansible 创建templates目录与ansible目录平级
# template模块只能用于ansible-playbook  
# templates文件必须放于templates目录下,命名为.j2结尾

示例:

cp /etc/nginx/nginx.conf ./
mv nginx.conf  nginx.conf.j2 #制作nginx模板 里边可以自定义变量不在演示
#使用template模板
ybt root /etc/ansible #cat nginx.yml 
---
- hosts: test
  remote_user: root

  tasks:
    - name: install nginx
      yum: name=nginx
    - name: copy template
    #nginx.conf.j2就在template所以不用写路径了
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
    - name: start nginx
      service: name=nginx state=started 
#执行
ybt root /etc/ansible #ansible-playbook nginx.yml
#注:有的服务器有http服务,所以nginx是起不来的,因为80端口冲突

when条件判断

示例:

ybt root /etc/ansible #cat var.yml 
---
- hosts: test 
  remote_user: root
  vars_files:
    - vars.yml  
  tasks:
    - name: '变量文件使用'
      file: path={{var3}} state=directory
      when: ansible_hostname== 'll'  #when判断:只有主机名==ll才执行

#执行
ybt root /etc/ansible #ansible-playbook var.yml

PLAY [test] ***********************************************************************

TASK [Gathering Facts] ************************************************************
ok: [192.168.23.138]
ok: [192.168.23.137]

TASK [变量文件使用] *********************************************************************
skipping: [192.168.23.138]
changed: [192.168.23.137]

PLAY RECAP ************************************************************************
192.168.23.137             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.23.138             : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   


with_items迭代

示例:

[root@ybt ansible]# cat touch.yml 
---
#迭代演示
- hosts: test
  remote_user: root

  tasks: 
        - name: '创建文件'
          file: name=/home/{{ item }} state=touch  #{{ item }} 固定变量引用
          with_items:
                - ybt1
                - ybt2
                - ybt3 

image-20210708090943485

查看:

image-20210708091238887


for循环

语法

#格式
{% for 变量名 in playbook变量名 %} 
循环内容{{变量名}}
{% endfor %}
#示例
[root@ybt templates]# cat for.j2 #templates模板
{% for i in ybt %}    #ybt为playbook里定义的变量名; i是将ybt赋值给i
 test {{ i }}      
{% endfor %}

示例:

[root@ybt ansible]# cat for.yml 
---
#for 循环示例
- hosts: test
  remote_user: root
  vars:
        ybt:   #自定义变量名列表名
         - ybt1
         - ybt2
         - ybt3    #变量列表值
  tasks:
        - name: copy
          template: src=templates/for.j2 dest=/home/ybt/for.txt #模板测试

执行:ansible-playbook for.yml

查看结果:

image-20210708145542906


roles角色

目录规划

/etc/ansible/roles/ 调用文件应该与roles目录同级
/roles/project/:项目名称,有以下子目录
 files/: 存放copy或script模块等调用的文件
 templates/: 模板
 tasks/: 任务 创建主配置文件,mian.yml(定义文件执行次序)- include: 执行文件
 handlers/: 
 vars/: 定义变量
 meta/: 定义依赖关系
 default/: 定义默认变量

示例:

ybt root /etc/ansible/roles #tree	#ansible同级目录创建 roles角色目录
.
├── httpd
│   └── tasks
│       ├── install.yml
│       └── main.yml
└── nginx
    └── tasks
        ├── install.yml
        ├── main.yml
        └── service.yml

4 directories, 5 files


#上边目录与文件结构都是最简单的示例,
#以nginx示例,只是安装了nginx 和启动了nginx
#当然可以复杂化,比如添加模板,公用变量等

#文件展示,其实就是一个文件只做一件事
ybt root /etc/ansible/roles/nginx #cat tasks/main.yml  
# 文件名字必须事main 写入服务执行顺序
- include: install.yml  #先安装 名字为自己定义的文件名字
- include: service.yml  #启动
ybt root /etc/ansible/roles/nginx #cat tasks/service.yml  
- name: start nginx
  service: name=nginx state=started   #启动
ybt root /etc/ansible/roles/nginx #cat tasks/install.yml 
- name: install nginx
  yum: name=nginx	#安装

#编写执行文件  文件位置必须与roles目录同级
ybt root /etc/ansible #cat nginx_roles.yml 
---
- hosts: test
  remote_user: root
  
  roles:
    - nginx
#执行
ansible-playbook nginx_roles.yml


参考资料链接:

标签:基本,name,ybt,ansible,使用,test,root,yml
来源: https://www.cnblogs.com/ybt-kexiao/p/15113201.html