ansible基本使用

Ansible

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

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

我便发现了ansible工具!

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

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

欢迎交流:

安装ansible参考博客链接

本版为ansible --version:ansible 2.9.21

简单配置

/etc/ansible/:ansible目录

  • vim ansible.cfg

    • #forks = 5 #ssh并发数量

      #ask_pass = True #使用密钥还是密码远程,True代表使用密码

      #host_key_checking = False #是否校验密钥(第一次ssh时是否提示yes/no)

  • 打开/etc/ansible/host文件最下边添加自定义模块名

    • 示例:[test] #模块名字
      • 192.168.XXX.XXX

执行状态

  • 黄色:成功执行并伴随着状态的改变
    绿色:成功执行并且没有发生状态的改变
    红色: 执行失败

免密操作

  • 方式一

    • 将主机密钥发送到控制的机器
      • ssh-keygen
      • ssh-copy-id 1.1.1.1 发送秘钥对到这个ip
  • 方式二

    • vim host
    • 示例:
    • [db] #自定义模块名
    • 172.25.70.1 ansible_ssh_user="root" ansible_ssh_pass="redhat"
    • 地址后加 ansible_ssh_user=用户名 ansible_ssh_port=端口 ansible_ssh_pass=密码

测试&帮助操作

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

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

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

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

ansible-doc yum #查看模块帮助

ansible -h #查看帮助选项

常用模块

shell模块

  • 可以使用"<",">","|",";","&"等符号特殊符号

    示例:

    ansible test -m shell -a 'df -h' #查看磁盘挂载情况

  • ansible test -m shell -a 'ls -l /home/' #查看home目录

  • ansible test -m shell -a "rm -rf ~/*" #删除所有文件

  • ansible test -m shell -a 'mkdir /home/2233.txt' #创建文件 (报错不用理会)

  • ansible test -m shell -a 'tar -cf ybt.tar.gz /home/*' #压缩目录文件

  • chdir 在执行命令前,进入到指定目录中
    示例:ansible test -m shell -a 'chdir=/home/ ls-l'

script模块
  • 执行本目录下脚本copy到远程主机后台执行后删除 (test为模块名)
  • 示例:ansible test -m script -a "./joben.sh"
  • 示例:ansible test -m script -a 'chdir=/root/cin/etc/ A/bak.sh'
  • chdir=在执行命令前,进入到控制主机指定目录中 在相对路径A执行脚本bak.sh
unarchive模块
  • 管理机上的压缩文件到远程主机解压:
    ansible test -m unarchive -a "src=本地目录压缩包 dest=远程要解压到的目录 mode=0755 copy=yes"

    • 示例:ansible test -m unarchive -a 'src=/root/jo.tar.gz dest=/root/ copy=yes'
  • 解压远程主机上的文件到目录:
    ansible all -m unarchive -a "src=远程主机/目录/文件 dest=远程要解压到的目录 mode=0755 copy=no" #mode可省略

  • owner=修改属主
    group=修改属组

    mode= 修改权限

copy模块
  • ansible test -m copy -a "src=本地 dest=目标"

  • 以下是copy并备份示例(注:文件内容一样不备份不替换!)backup=no 不备份

  • (注:文件内容不一样,直接替换)

  • 示例:ansible test -m copy -a "src=/test/test1.txt dest=/usr/local/ backup=yes "

  • 示例:ansible test -m copy -a 'src=kk.kk.l dest=/home/' # 默认将本目录文件copy到远程机

  • src=本地 dest=目标
    owner=修改属主
    group=修改属组

    mode= 修改权限

fetch模块

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

  • ansible test -m fetch -a "src=目标路径 dest=本地路径"
  • ansible test -m fetch -a 'src=/home/test.txt dest=./'
file模块
path=/路径/文件  #" path + file " = " dest + file " = " name + file "
state=选项
owner=修改属主
group=修改属组
mode= 修改权限
state	 absent	将数据进行删除
state	 directory	创建一个空目录信息
state	 file	查看指定目录信息是否存在
state	 touch	创建一个空文件信息
state	 hard/link	创建链接文件
  • ansible test -m file -a 'path=/home/bi.txt state=touch' # 创建文件

  • ansible test -m file -a 'path=/home/bi.txt state=absent' # 删除文件或目录

  • ansible test -m file -a'path=/home/* state=absent' # 删除文件

  • ansible test -m file -a 'path=/home/test/ state=directory' # 创建目录

  • ansible test -m file -a "path=/home/mydir owner=sshd group=dc mode=0777" # 修改权限和组

  • 创建软连接示例:src源文件 path存放软件路径文件

    • ansible test -m file -a 'src=/home/l.txt path=/home/k state=link'
  • ansible test -m file -a 'src=/home/l.txt path=/home/kke state=hard' # 创建硬链接

lineinfile模块

单个文件添加内容

  • ansible test -m lineinfile -a "path=目标路径 line='添加的内容'"
  • ansible test -m lineinfile -a "path=/home/test.txt line='strive'"
  • 在内容之后插入(insertafter)
  • ansible test -m lineinfile -a "path=目标路径 line='添加的内容' insertafter='在哪个位置之后'"
  • ansible test -m lineinfile -a "path=/home/test.txt line='shen' insertafter='strive'"
replace模块
  • 替换
  • ansible test -m replace -a "path=目标路径 regexp=旧内容 replace=新内容"
  • ansible test -m replace -a "path=/home/test.txt regexp='hello' replace='hello wrold'"
user模块

点击参考博客

  • ansible test -m user -a 'name=shen' # 创建用户

  • 创建用户:dba,使用BASH Shell,附加组为admins,dbagroup,家目录为/home/dba,注意:附加组必须为已经存在的组。

  • ansible test -m user -a "name=dba groups=admins,dbagroup append=yes home=/home/dba shell=/bash/shell state=present"

  • groups设定,groups=group1,group2.。。。

    增量添加属组,append=yes

    状态,state=present

    家目录:home=/home/dba

    shell:shell=/bash/shell

image-20210702171019665

  • ansible test -m user -a 'name=dba groups=shen' # 修改用户属组

  • ansible test -m user -a 'name=shen remove=yes state=absent' #删除用户shen

  • 修改密码:

    • password_hash:# 加密函数

    • ansible test -m user -a "name=dudu password={{'123'| password_hash('sha512')}}"

    • 密码为123 password_hash('sha512')}}为固定格式

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 '

  • disable_pgp_check 忽略GPG检查
service模块

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

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

示例:

  • 开启ssh服务:ansible test -m service -a 'name=sshd state=started enabled=true'

  • 关闭:ansible test -m service -a 'name=sshd state=stopped'

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语言语法:
  • 在单一文档中,可用连续三个连字号(---)区分多个档案,另外,还有选择性的连续三个点好(...)用来表示档案结尾
  • 建议注明Playbook的功能
  • 注释

  • 缩进必须统一,不能空格和tab混用
  • 缩进的级别也必须是一致的,(与python一致!)
  • 区别大小写,k/v的值大小写敏感
  • k/v的值可同行写也可换行写。同行使用 :分隔 (键值对)
  • v可以是字符串,也可以是另一个列表
  • 一个完整的代码块功能,最少元素需包括name:task
  • 文件扩展名通常为yml或yaml

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检测

&针对某台主机

  • 选项
  • --check 只检测,不执行
  • --list-hosts 列出运行任务的主机
  • --limit 只针对主机列表中的某台主机执行
  • -v显示过程 -vv -vvv 更详细

示例:

  • ansible-playbook ybt.yml --check -v 或ansible-playbook -C ybt.yml
  • ansible-playbook ybt.yml --list-hosts
  • ansible-playbook ybt.yml --limit 192.168.23.138
  • ansible-playbook ybt.yml --list-tasks #查看plakbook有几个任务

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
  • 文本文件,嵌套有脚本(使用模板编程语音编写)

  • Jinja2语音,使用字面量,有下面形式

    • 字符串:使用单引号或双引号
    • 数字:整数,浮点数
    • 列表:
    • 元组:(n,n2)
    • 字典:
    • 布尔:true/false
  • 算术运算+ - * / // % **

  • 比较 == != > < >= <=

  • 逻辑 and or not

  • 流表达式For If When

[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条件判断
  • when可以定义判断条件,条件为真时才执行某个任务。

  • 常见条件操作符有:==、!=、>、>=、<、<=。

  • 多个条件可以使用and(并且)或or(或者)分割,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迭代
  • 有重复性执行的任务时,可以使用迭代机制
  • 对迭代项的引用,固定变量名为item
  • 要在task中使用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角色
  • 相当于java的调用方法

目录规划

/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


参考资料链接:

posted @ 2021-08-07 20:51  ybt&kexiao  阅读(364)  评论(0编辑  收藏  举报