ansible基本使用
作者:互联网
Ansible
由于公司升级服务器和处理问题抓包,
可能需要同时操作多台服务器(繁琐的解压、copy、备份),
我便发现了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
- 示例:[test] #模块名字
执行状态
- 黄色:成功执行并伴随着状态的改变
绿色:成功执行并且没有发生状态的改变
红色: 执行失败
免密操作
-
方式一
- 将主机密钥发送到控制的机器
- 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
-
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"' #设置定时任务
查看:
删除刚刚的定时任务: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'
查看:
删除:ansible test -m group -a 'name=shen state=absent'
查看:
hostname模块
修改主机名
示例:ansible 192.168.23.138 -m hostname -a 'name=kexiao'
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,
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模块显示某些具体的变量值
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¬ify的使用
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,n1..}
- 元组:(n,n2)
- 字典:{key:value,....}
- 布尔: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
查看:
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
查看结果:
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
参考资料链接:
- bilibili(马哥教育)(重点学习参考)
- https://www.bilibili.com/video/BV18t411f7CN (重点学习参考,几乎%95)
- 博客园 (省时间可以看这个)
标签:基本,name,ybt,ansible,使用,test,root,yml 来源: https://www.cnblogs.com/ybt-kexiao/p/15113201.html