Ansible相关

news/2024/9/23 4:49:33/

Ansible

环境准备

主机名ip分组
crontol192.168.88.1
node1192.168.88.11test
node2192.168.88.12proxy
node3192.168.88.13webservers
node4192.168.88.14webservers
node5192.168.88.15database

所有操作只需在crontol上操作即可

# 依赖一般也会跟着一起装好
yum install -y ansible
  • 配置域名解析
for i in {1..5}; do echo -e "192.168.88.1$i\tnode$i" >> /etc/hosts; done
  • 配置免密登录
ssh-keygen  # 回车即可
for i in node{1..5}; do ssh-copy-id $i ;done  # 按要求输入密码即可
mkdir ansible && cd ansible
  • 创建配置文件(可参考:etc/ansible/ansible.cfg),以下操作都必须在工作目录下执行
vim ansible.cfg
# ansible.cfg内容
[defaults]
inventory = hosts  # 管理的主机,配置在当前目录的hosts文件中,hosts名是自定义的。=号两边空格可有可无vim hosts
# hosts内容
[test]
node1[proxy]
node2[webservers]
node[3:4][database]
node5[cluster:children]
webservers
database# 测试是否成功
ansible all --list-hosts
# 输出下列结果表示成功hosts (5):node2node1node3node4node5

ansible_80">ansible管理分类

  • ansible远程管理
    • adhoc临时命令,也就是在命令行执行管理命令
    • playbook剧本,把管理任务用特定格式写到文件中

adhoc临时命令

  • 语法格式
ansible 主机或组列表 -m 模块 -a "参数"  # -a是可选的
  • 测试主机连通性
ansible all -m ping

ansible_104">ansible模块

  • 查看模块基本信息
# 查看所有模块
ansible-doc -l# 查看指定模块
ansible-doc -l | grep file# 查看模块使用文档,/EXAMPLE可以查看示例
ansible-doc file

command模块

  • ansible默认模块,用于在远程主机上执行任意命令
  • command不支持shell特性,如管道、重定向。
# 在所有被管主机上创建目录/tmp/demo
ansible all -a "mkdir /tmp/demo"# 查看node1的ip地址
ansible node1 -a "ifconfig"  # ansible node1 -a "ifconfig | head -5"就会报错

shell模块

  • command模块类似,但是支持shell特性,如管道、重定向。
ansible node1 -m shell -a "ifconfig | grep inet"

script模块

  • 用于在远程主机上执行脚本
# 控制端先创建一个安装vsftpd服务的脚本
vim install.sh
# install.sh内容
#!/bin/bashyum install -y vsftpd
systemctl start vsftpd# 在test组执行这个脚本
ansible test -m script -a "install.sh"

注意:commandshellscript这三个模块一般不用,因为它们没有幂特性

file模块

  • 创建文件、目录、链接等,还可以修改权限,属主、属组等
  • 常用选项
    • path:指定文件路径
    • owner:设置文件所有者
    • group:设置文件所属组
    • state:状态,touch表示创建文件,directory表示创建目录,link表示创建超链接,absent表示删除
    • mode:设置权限
    • src:源文件,设置超链接的时候会用到
    • dest:目标文件,设置超链接的时候会用到
# 查看使用帮助
ansible-doc file# 在test组的主机上创建/tmp/test.txt
ansible test -m file -a "path=/tmp/test.txt state=touch"# 将test组的主机上的/tmp/test.txt属主和属组都修改为adm,权限修改为0777
ansible test -m file -a "path=/tmp/test.txt owner=adm group=adm mode='0777'"# 在test组的主机上创建/tmp/demo,创建的同时设置该目录的属主和属组都修改为adm,权限修改为0777
ansible test -m file -a "path=/tmp/demo owner=adm group=adm mode='0777' state=directory"# 在test组的主机上创建/etc/hosts的超链接,存放在/tmp/demo/hosts
ansible test -m file -a "src=/etc/hosts dest=/tmp/demo/hosts state=link"# 删除test组的主机上的/tmp/test.txt和/tmp/demo
ansible test -m file -a "path=/tmp/demo state=absent"
ansible test -m file -a "path=/tmp/test.txt state=absent"

copy模块

  • 用于将文件从控制端拷贝到被控端
  • 常用选项
    • src:源文件路径
    • dest:目标路径
    • content:内容
    • owner:设置文件所有者
    • group:设置文件所属组
    • mode:设置文件权限
# 将本地的/etc/hostname拷贝到test组服务器的/root/下
ansible test -m copy -a "src=/etc/hostname dest=/root/"# 在目标主机上创建/tmp/test.txt,内容是Hello bhlu
ansible test -m copy -a "content='Hello bhlu' dest=/tmp/test.txt"

fetch模块

  • 从被控端下载文件到控制端
  • 常用选项
    • src:源文件路径
    • dest:目标路径
    • flagyes代表直接下载文件,不会递归下载目录
# 将test组的主机上的/etc/hostname下载到本地的/root/下
ansible test -m fetch -a "src=/etc/hostname dest=/root/"cat /root/node1/etc/hostname 
# node1

lineinfile模块

  • 操作目标服务器文件中的文件,可以添加,替换整行
  • 常用选项
    • path:待修改的文件路径
    • line:写入文件的一行内容
    • regexp:正则表达式,用于查找文件中内容
# 检测test组的主机的/tmp/test.txt文件中,是否有aaa,如果有,则不操作,没有就添加aaa到文件结尾
ansible test -m lineinfile -a "path=/tmp/test.txt line='aaa'"# 将test组的主机的/tmp/test.txt文件中的包含aaa的行替换成bbb,从下往上,只替换一次
ansible test -m lineinfile -a "path=/tmp/test.txt line='bbb' regexp='aaa'"

replace模块

  • lineinfile会替换一行,replace替换关键词
  • 常用选项
    • path:待修改的文件路径
    • replace:替换成的内容
    • regexp:正则表达式,需要替换的内容
# 将test组的主机上的/tmp/test.txt中bb全部替换成haha
ansible test -m replace -a "path=/tmp/test.txt replace='haha' regexp='bbb'"

user模块

  • 实现linux用户管理
  • 常用选项
    • name:待创建的用户名
    • uid:用户ID
    • group:设置主组
    • groups:设置附加组
    • home:设置家目录
    • password:设置用户密码
    • state:状态,present表示创建,也是默认选项,absent表示删除
    • remove:删除家目录、邮箱等,yes或者true
# 在test组的主机上,创建一个bhlu的用户,uid为1020,设置主组为adm,附加组为root,密码是123456
ansible test -m user -a "name=bhlu uid=1020 group=adm groups=root password=123456"# 修改test组的主机上的bhlu的密码为666666,使用加密算法
ansible test -m user -a "name=bhlu password={{'666666'|password_hash('sha512')}}"# 删除test组的主机上的bhlu的用户,不删除家目录
ansible test -m user -a "name=bhlu state=absent"# 删除test组的主机上的tools的用户,删除家目录
ansible test -m user -a "name=bhlu state=absent remove=yes"

group模块

  • 实现linux的组管理
  • 常用选项
    • name:待创建的组名
    • gid:GID
    • state:状态,present表示创建,也是默认选项,absent表示删除
# 在test组的主机上创建一个uid为1030的组,名称为project
ansible test -m group -a "name=project gid=1030"# 将test组的主机上的名为project的组删除
ansible test -m group -a "name=project state=absent"

yum_repository模块

  • 用于配置yum
  • 常用选项
    • file:指定文件名
    • name:指定仓库名称
    • description:仓库描述
    • baseurl:仓库地址
    • gpgcheck:是否检查gpg,填yes|no,0和1都行
    • enabled:是否开启,填yes|no,0和1都行
# 在test组的主机上创建yum文件,文件为myrepo.repo,仓库名为myRepo,描述为My Repo,baseurl为ftp://yum-server/base/,开启状态,不检查gpg
ansible test -m yum_repository -a "file=myrepo name=myRepo description='My Repo' baseurl=ftp://yum-server/base/ enabled=yes gpgcheck=0"# 被控主机
cat myrepo.repo 
[myRepo]
baseurl = ftp://yum-server/base/
enabled = 1
gpgcheck = 0
name = My Repo

yum模块

  • 用于rpm软件包管理,如安装、升级、卸载
  • 常用选项
    • name:包名
    • state:状态,present表示安装,如果安装则忽略;latest表示安装或者升级到最新版本;absent表示卸载
# 在test组的主机上安装tree
ansible test -m yum -a "name=tree"# 在test组的主机上卸载tree
ansible test -m yum -a "name=tree state=absent"

service模块

  • 用于控制服务。启动、关闭、重启、设置开机自启
  • 常用选项
    • name:控制的服务名
    • state:状态,started表示启动;stopped表示关闭;restarted表示重启
    • enabledyes表示设置开机自启;no表示设置开机不自启
# 在test组的主机上开启vsftpd,并设置开机自启
ansible test -m service -a "name=vsftpd state=started enabled=yes"# 在test组的主机上关闭vsftpd
ansible test -m service -a "name=vsftpd state=stopped"

逻辑卷相关模块

parted模块
  • 用于硬盘分区管理
  • 常用选项
    • device:待分区的设备
    • number:分区编号
    • state:状态,present表示创建;absent表示删除
    • part_start:分区起始位置,不写表示从开头
    • part_end:分区结束位置,不写表示结尾
# 在test组的主机上,对20G的/dev/nvme0n2进行操作,分两个分区,第一个5G,第二个15G
ansible test -m parted -a "device=/dev/nvme0n2 number=1 state=present part_end=5GiB"
ansible test -m parted -a "device=/dev/nvme0n2 number=2 state=present part_start=5GiB"
lvg模块
  • 创建、删除卷组,修改卷组大小
  • 常用选项
    • vg:定义卷组名。vg:volume group
    • pvs:物理卷,分号隔开。pvs:physical volumes
    • state:状态,present表示创建,默认状态;absent表示删除
# 在test组的主机上创建一个myvg的卷组,是有/dev/nvme0n2p1和/dev/nvme0n2p2组成
ansible test -m lvg -a "vg=myvg pvs=/dev/nvme0n2p1,/dev/nvme0n2p2 state=present"
lvol模块
  • 创建、删除逻辑卷,修改逻辑卷大小
  • 常用选项
    • vg:指定那个卷组
    • lv:逻辑卷名。lv:logical volume
    • size:逻辑卷大小,不写单位的情况下,默认以M为单位
    • state:状态,present表示创建,默认状态;absent表示删除
# 在test组的主机上创建一个逻辑卷,卷名mylv,大小为5G
ansible test -m lvol -a "vg=myvg lv=mylv size=5G"# 修改mylv的大小为10G
ansible test -m lvol -a "vg=myvg lv=mylv size=10G"
filesystem模块
  • 用于格式化,创建文件系统
  • 常用选项
    • fstype:指定文件系统类型
    • dev:指定要格式化的设备,可以是分区,也可以是逻辑卷
    • forceyes,强制的意思,当格式化或者删除dev的时候,如果dev上有数据,需要添加这个
# 将test组的主机上的mylv格式化成xfs格式
ansible test -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv"
mount模块
  • 用于挂载系统
  • 常用选项
    • path:挂载点
    • src:待挂载的设备
    • fstype:文件系统类型
    • state:状态,mounted表示永久挂载;absent表示卸载
# 将test组的主机上的/dev/myvg/mylv挂载到/data
ansible test -m mount -a "path=/data src=/dev/myvg/mylv fstype=xfs state=mounted"# 将test组的主机上的/dev/myvg/mylv挂载到/data
ansible test -m mount -a "path=/data src=/dev/myvg/mylv fstype=xfs state=absent"

firewalld模块

  • 用于配置防火墙的模块
  • 常用选项
    • port:端口
    • permanent:是否永久生效,yes|no
    • immediate:立即生效,临时生效,默认为no
    • state:放行enabled,拒绝disabled
# 放行80端口,文件内容如下
---
- name: set firewalldhosts: testtasks:- name: allow 80/tcpfirewalld:port: 80/tcppermanent: yesimmediate: yesstate: enabled

template模块

  • 上传文件,支持jinja2语法,跟copy模块不同
  • 常用选项
    • src:源文件路径
    • dest:目标文件路径
vim test.j2
# 文件内容如下
Hello {{name}},server is {{ansible_hostname}}vim temp.yml
# 文件内容如下
---
- name: test template modulehosts: testvars:name: "bhlu"tasks:- name: copy test.j2 to testtemplate:src: test.j2dest: /var/www/html/index.html# 执行,会有个警告,关于name变量,不用管
ansible-playbook temp.yml# 测试
curl node1  # Hello bhlu,server is node1

综合测试

  • 所有操作均对test组中的主机生效

  • 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777

  • 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600

  • 替换目标主机/tmp/mydemo/hosts文件中的node5为server5

  • 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录

# 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
ansible test -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory"# 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
ansible test -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"# 替换目标主机/tmp/mydemo/hosts文件中的node5为server5
ansible test -m replace -a "path=/tmp/mydemo/hosts replace='server5' regexp='node5'"# 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
ansible test -m fetch -a "src=/tmp/mydemo/hosts dest=."

Playbook剧本

  • 常用于复杂任务的管理,以及管理经常要完成的任务
  • playbook也是通过模块和它的参数,在特定主机上执行任务
  • playbook是一个文件,该文件中需要通过yaml格式进行书写

YAML

  • YAML Ain’t a Markup Language:YAML不是一个标记语言

yaml语法规范

  1. yaml文件的文件名,一般以ymlyaml作为扩展名
  2. 文件一般以---作为第一行,不是必须的,但是常用
  3. 键值对使用冒号:表示,冒号后面必须有空格
  4. 数组使用-表示,-后面必须有空格
  5. 相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格
  6. 全文不能使用tab,必须使用空格

配置vim适应yaml语法

vim ~/.vimrc
set ai  # 设置自动缩进
set ts=2  # 设置按tab键,缩进2个空格
set et  # 将tab转换成相应的空格

yaml文件格式

  • 一般不能出现中文,下面的中文只是帮助理解
---
- name: 简介hosts: 主机或组,用分号隔开tasks:- name: 任务1介绍file:path: ...state: ...mode: ...- name: 任务2介绍copy:src: ...copy: ...

示例

  1. test组和node2上创建/tmp/demo目录,权限是0600,将控制端/etc/hosts拷贝到被控主机的/tmp/demo
  • vim fileop.yml
---
- name: create directory and copy filehosts: test,node2tasks:- name: create directoryfile:path: /tmp/demostate: directorymode: '0600'- name:copy:src: /etc/hostsdest: /tmp/demo/hosts
  • 运行:ansible-playbook fileop.yml
  1. 在test组中的主机上,创建用户bob,附加组是adm;在node2主机上,创建/tmp/test.txt,其内容为Hello bhlu
  • vim test.yml(文件中的content的|可以保留换行符,如果是>那就是将多行合并成一行)
---
- name: create user and touch filehosts: testtasks:- name: create user bobuser:name: bobgroups: adm- name: touch filecopy:dest: /tmp/test.txtcontent: |Hello bhlu
  1. 在test组中的主机上创建bhlu用户,它的uid是1040,主组是daemon,密码为123
  • vim user.yml
---
- name: create userhosts: testtasks:- name: create user bhluuser:name: bhluuid: 1040group: daemonpassword: "{{'123'|password_hash('sha512')}}"
  1. 磁盘管理

将test组的主机上/dev/nvme0n3,创建两个物理盘,第一个5G,第二个15G,/dev/nvme0n3一共是20G

将两个物理盘组成一个叫test-vg的卷组

在test-vg卷组上创建一个叫test-lv的逻辑卷,大小5G

将test-lv格式化成xfs

将test-lv永久挂载到/data

  • vim disk.yml
---
- name: disk managehosts: testtasks:- name: create pv1parted: device: /dev/nvme0n3number: 1state: presentpart_end: 5GiB- name: create pv2parted:device: /dev/nvme0n3number: 2state: presentpart_start: 5GiB- name: create vglvg:vg: test-vgpvs: /dev/nvme0n3p1,/dev/nvme0n3p2- name: create lvlvol:vg: test-vglv: test-lvsize: 5G- name: create filesystemfilesystem:dev: /dev/test-vg/test-lvfstype: xfs- name: mountmount:path: /datasrc: /dev/test-vg/test-lvfstype: xfsstate: mounted
  1. 安装多个软件包
---
- name: install pkghosts: testtasks:- name: install httpd,tree,taryum:name: [httpd,tree,tar]state: present
  1. 安装软件包组
# 查看软件包组
yum grouplist# 如果显示是中文,可以加LANG=C yum grouplist
LANG=c yum grouplist# 安装组
yum groupinstall "组名"
---
- name: install package groupshosts: testtasks:- name: install Development Toolsyum:name: "@Development Tools"state: present
  1. 更新系统所有包,相当于yum update
---
- name: update packageshosts: testtasks:- name: update systemyum:name: "*"state: latest

变量

facts变量
  • facts变量是ansible自带的预定义变量,用于描述被控端软硬件信息
  • 查看所有facts变量
ansible test -m setup
  • 可以通过filter来过滤想要查看的信息
# 查看所有ipv4地址信息
ansible test -m setup -a "filter=ansible_all_ipv4_addresses"# 查看可用内存
ansible test -m setup -a "filter=ansible_memfree_mb"
  • 常用的facts变量

    • ansible_all_ipv4_addresses:所有的IPV4地址
    • ansible_bios_version:BIOS版本信息
    • ansible_memtotal_mb:总内存大小
    • ansible_hostname:主机名
  • 示例

---
- name: display host infohosts: testtasks:- name: display hostname and memorydebug:msg: "hostname: {{ansible_hostname}}  mem: {{ansible_memtotal_mb}}MB"
自定义变量
  • 引入变量,可以方便Playbook重用。比如装包的playbook,包名使用变量。多次执行playbook,只要改变变量名即可,不用编写新的playbook。

  • ansible支持10种以上的变量定义方式。常用的变量来源如下:

    • inventory变量。变量来自于主机清单文件
    • facts变量。
    • playbook变量。变量在playbook中定义。
    • 变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件
  • 使用inventory变量示例,在node1主机上创建一个用户bhlu,在webservers组的主机上创建一个用户maomao

vim hosts
# hosts内容如下
[test]
node1 username="bhlu"  # 这里定义test组的[proxy]
node2[webservers]
node[3:4][database]
node5[cluster:children]
webservers
database[webservers:vars]  # 固定写法 :vars
username="maomao"# 创建yml文件
vim var.yml
# var.yml内容如下
---
- name: create usershosts: test,webserverstasks:- name: create useruser:name: "{{username}}"state: present# 执行
ansible-playbook var.yml
  • 在playbook中定义变量
---
- name: create userhosts: testvars:  # 固定是varsusername: "bhlu"passowrd: "123"tasks:- name: create bhluuser:name: "{{username}}"password: "{{passowrd|password_hash('sha512')}}"state: present
  • 将变量定义在文件里
vim user_vars.yml
# 文件内容
---
user: "maomao"
pwd: "123"vim user.yml
# 文件内容
---
- name: createhosts: testvars_files: user_vars.ymltasks:- name: create maomaouser:name: "{{user}}"password: "{{pwd|password_hash('sha512')}}"state: present# 执行
ansible-playbook user.yml

错误处理

  • 解决当前面任务运行错误,后面任务就不执行的问题
# 默认是下面这样写的,但是当启动test服务失败时,会直接跳出,不会执行下面的任务了
---
- name: test errorhosts: testtasks:- name: start test serviceservice:name: teststate: startedenabled: yes- name: touch a filefile:path: /tmp/test.txtstate: touch# 优化后
cat test.yml
---
- name: test errorhosts: testtasks:- name: start test serviceignore_errors: yes  # 忽略错误service:name: teststate: startedenabled: yes- name: touch a filefile:path: /tmp/test.txtstate: touch# 全局优化
---
- name: test errorhosts: testignore_errors: yes  # 不管哪个任务发生错误,都会忽略tasks:- name: start test serviceservice:name: teststate: startedenabled: yes- name: touch a filefile:path: /tmp/test.txtstate: touch

触发执行任务

  • 不管第一个任务是否执行,第二个任务都会执行,有些情况是不需要这样的
# 不管有没有修改配置文件,都会重启服务
---
- name: test triggerhosts: testvars:http_port: "80"tasks:- name: upload httpd.conftemplate:src: httpd.confdest: /etc/httpd/conf/httpd.conf- name: restart httpdservice:name: httpdstate: restarted# 优化后,只有第一个任务changed,才会执行第二个任务
---
- name: test triggerhosts: testvars:http_port: "8080"tasks:- name: upload httpd.conftemplate:src: httpd.confdest: /etc/httpd/conf/httpd.confnotify: restart httpd  # 通知,后面的要对应上,空格也不能少handlers:- name: restart httpdservice:name: httpdstate: restarted

when条件

  • 只有满足条件时,才执行任务

  • 常用操作符

    • ==:等于
    • !=:不等于
    • >=:大于等于
    • <=:小于等于
    • >:大于
    • <:小于
  • 多个条件或以使用andor进行连接

  • when表达式中的变量,可以不使用{{}}

# 当内存大于2G,才能运行httpd
---
- name: test whenhosts: testtasks:- name: when mem > 2Gservice:name: httpdstate: startedwhen: ansible_memtotal_mb>2048# 当hostname为node1,并且系统是RedHat,才运行httpd
---
- name: test when andhosts: testtasks:- name: start httpdservice:name: httpdstate: startedwhen: >ansible_hostname == "node1" andansible_distribution == "RedHat"

任务块

  • 当满足某个条件的时候,执行一块任务
---
- name: test block taskshosts: testtasks:- name: install httpd and start httpdblock:- name: install httpdyum:name: httpdstate: present- name: start httpdservice:name: httpdstate: startedwhen: ansible_hostname == "node1"
  • blockrescuealways联合使用
    • block中的任务都成功,rescue中的任务不执行
    • block中的任务出现失败(failed),rescue中的任务执行
    • block中的任务不管怎么样,always中的任务总是执行
---
- name: test block rescue always taskshosts: testtasks:- name: block / rescue / always fileblock:- name: touch /tmp/1.txtfile:path: /tmp/1.txtstate: touchrescue:- name: touch /tmp/2.txtfile:path: /tmp/2.txtstate: touchalways:- name: touch /tmp/3.txtfile:path: /tmp/3.txtstate: touch

loop循环

  • 相当于shellfor循环
  • ansible中循环用到的变量名是固定的,叫item
# 创建多个目录
---
- name: create directoryhosts: testtasks:- name: create /tmp/test01 /tmp/test02 /tmp/test03file:path: /tmp/{{item}}state: directoryloop: [test01, test02, test03]# 创建多个用户
---
- name: create usershosts: testtasks:- name: create test01 test02 test03user:name: "{{item.username}}"password: "{{item.password|password_hash('sha512')}}"state: presentloop:- {"username": "test01", "password": "test01@123"}- {"username": "test02", "password": "test02@123"}- {"username": "test03", "password": "test03@123"}

role角色

  • 为了实现playbook重用,可以使用role角色
  • 角色role相当于把任务打散,放到不同的目录中
  • 再把一些固定的值,如用户名、软件包、服务等,用变量来表示
  • role角色定义好之后,可以在其他playbook中直接调用
# 创建角色
# 1. 声明角色存放的位置
vim ansible.cfg
[defaults]
inventory = hosts
roles_path = roles# 2. 创建角色目录
mkdir roles# 3. 创建名为user的角色
ansible-galaxy init roles/user# 4. 查看目录结构
tree roles/user
roles/user/
├── defaults  # 定义变量的目录,优先级最低
│   └── main.yml
├── files  # 保存上传的文件(如copy要用到的文件)
├── handlers  # handlers任务写到这个目录的main.yml
│   └── main.yml
├── meta  # 保存说明数据,如角色作者,版本等
│   └── main.yml
├── README.md  # 保存角色如何使用之类的说明
├── tasks  # 保存任务
│   └── main.yml
├── templates  # 保存template模块上传的模板文件
├── tests  # 保存测试用的playbook,可选
│   ├── inventory
│   └── test.yml
└── vars  # 定义变量的位置,推荐使用└── main.yml
  • 示例1:创建用户,主组为project,解释器为/bin/tcsh,并传一个test.txt到他的家目录
# 1. 配置变量
vim roles/user/defaults/main.yml
# 文件内容
---
# defaults file for roles/user
username: "bhlu"
password: "123"# 2. 准备一个test.txt文件
touch roles/user/files/test.txt# 3. 包装任务
cat roles/user/tasks/main.yml
# 文件内容
---
# tasks file for roles/user
- name: create useruser:name: "{{username}}"password: "{{password|password_hash('sha512')}}"state: presentgroup: projectshell: /bin/tcsh- name: copy filecopy:src: test.txtdest: /home/{{username}}/test.txtowner: "{{username}}"group: project# 4. 创建create_maomao.yml
vim create_maomao.yml
# 文件内容
---
- name: create maomaohosts: testvars:username: "maomao"password: "maomao123"roles:- user# 5. 执行
ansible-playbook create_maomao.yml
  • 示例2:teest

ansible_1273">ansible加解密文件

echo "hello bhlu" > test.txt
# 加密: encrypt
ansible-vault encrypt test.txt
New Vault password: # 密码
Confirm New Vault password:  # 再次输入密码 
Encryption successful  # 提示成功# 检查
cat test.txt# 解密: decrypt
ansible-vault decrypt test.txt 
Vault password:  # 密码
Decryption successful  # 提示成功# 再次加密
ansible-vault encrypt test.txt# 修改密码: rekey
ansible-vault rekey test.txt 
Vault password:  # 旧密码
New Vault password:   # 新密码
Confirm New Vault password:   # 再次输入新密码
Rekey successful  # 提示成功# 只查看不解密: view
ansible-vault view test.txt
Vault password: # 密码# 使用文件加密
ansible-vault decrypt --vault-id=pass.txt data.txt

特殊的主机清单变量

  • 如果当被控主机没有配置免密登录,可以使用下面方式进行控制
    • ansible_ssh_user:指定登录远程主机的用户名
    • ansible_ssh_pass:指定登录远程主机的密码
    • ansible_ssh_port:指定登录远程主机的端口号
vim ansible.cfg
# 文件内容如下
[defaults]
inventory = hostsvim hosts
# 文件内容
[group1]
node1 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=220
node2 ansible_ssh_user=root ansible_ssh_pass=123456
node3 ansible_ssh_user=root ansible_ssh_pass=123456

http://www.ppmy.cn/news/1437812.html

相关文章

# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(2)

从浅入深 学习 SpringCloud 微服务架构&#xff08;六&#xff09;Feign&#xff08;2&#xff09; 一、feign 的配置&#xff1a; 1、从 Spring Cloud Edgware 开始&#xff0c;Feign 支持使用属性自定义 Feign。 对于一个指定名称的 FeignClient&#xff08;例如该 Feign …

MyBatis处理SQL中的特殊字符

方式一&#xff1a;转义字符 如下案例&#xff1a; < 表示小于的转义字符 <!-- 在Mapper XML文件中定义SQL语句 --> <select id"selectById" resultMap"BaseResultMap">select *from userwhere id < #{id}; </select>方式二&am…

激活IDM下载器并配置百度网盘

前言&#xff1a; 最近想下载一些软件&#xff0c;奈何不充钱的百度网盘的速度实在太慢了&#xff0c;不到一个G的文件夹奈何下了一晚上&#xff0c;只能重新找一下idm的下载了。 但是idm的正版是需要收费的&#xff0c;所以有白嫖党的破解版就横空出世了。 正文&#xff1a…

UE5 GAS开发P34 游戏效果理论

GameplayEffects Attributes&#xff08;属性&#xff09;和Gameplay Tags&#xff08;游戏标签&#xff09;分别代表游戏中实体的特性和标识。 Attributes&#xff08;属性&#xff09;&#xff1a;Attributes是用来表示游戏中实体的特性或属性的值&#xff0c;例如生命值、…

maven报orace,jdbc错误,并出现大量红色波浪线Unresolved dependency

由于oracle的限制&#xff0c;一般我们是无法通过maven直接下载oracle的驱动包的&#xff0c;这就可能导致其余的包出现红色波浪线&#xff0c;解决方法如下 1.新建一个文件夹&#xff0c;并将oracle驱动包放在这个新建的文件夹下&#xff0c;注意不要讲这个oracle包放在maven本…

【算法刷题day37】Leetcode:738. 单调递增的数字、968. 监控二叉树

文章目录 Leetcode 738. 单调递增的数字解题思路代码总结 Leetcode 968. 监控二叉树解题思路代码总结 草稿图网站 java的Deque Leetcode 738. 单调递增的数字 题目&#xff1a;738. 单调递增的数字 解析&#xff1a;代码随想录解析 解题思路 这贪心有点巧&#xff0c;自己没想…

在 Ubuntu 22.04 上使用 Let‘s Encrypt 配置 Nginx SSL 证书

最近,我在自己的服务器上部署了一个网站,并决定使用 SSL 证书来确保网站的安全性。经过一番研究,我选择了 Lets Encrypt 作为 SSL 证书的提供商,因为它免费、自动化且广受信任。在这篇博客中,我将与大家分享我在 Ubuntu 22.04 上使用 Lets Encrypt 配置 Nginx SSL 证书的过程。…

Oracle expdp/impdp 及 exp/imp 命令详解

一、基础环境    操作系统&#xff1a;Windows 或 Linux 数据库版本&#xff1a;Oracle Database 11.2.0.1.0 及以上版本 二、命令简介    我们在使用Oracle 数据库的过程中会经常对数据进行导入导出。Oracle 数据库提供 expdp / impdp &#xff08;Data Pump&#xff0c…