Ansible相关

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上操作即可

  • 安装ansible
# 依赖一般也会跟着一起装好
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  # 按要求输入密码即可
  • 创建ansible工作目录
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管理分类

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

adhoc临时命令

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

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
  • 运行:ansible-playbook test.yml
  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')}}"
  • 运行:ansible-playbook user.yml
  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
  • 运行:ansible-playbook disk.yml
  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加解密文件

  • ansible加解密:ansible-vault
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.mzph.cn/diannao/890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sprinboot+vue集成neo4j图数据库

一 、java后台 1.1 package com.admin.domain;/*** 功能描述&#xff1a;** author wangwei* date 2024-01-15 22:13*/ public class ConnectWeb {private String connectWebId;private String connectWebName;private String connectWebInfo;private String personWebIdAlph…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

华为校招机试 - 会议通知转发总人数(20240410)

题目描述 在一个办公区内,有一些正在办公的员工,当员工 A 收到会议通知: 他会将这个会议通知转发给周围四邻(上下左右工位的同事)团队内的同事,周围收到该邮件的同事会继续转发给周围四邻(上下左右工位的同事)团队内的同事,直到周围没有再需要往下传播的同事则会停止…

构建Python中的分布式日志系统:ELK与Fluentd的结合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代软件开发中&#xff0c;日志系统是至关重要的组成部分。它们不仅用于故障排查和性能监…

利用Python进行大规模数据处理

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理&#xff1a;Hadoop与Spark的对比 随着数据量的不断增长&…

ZJGSU 1850 不同出栈情况

描述 假设有n个元素依次进栈&#xff0c;给出他们可能的不同的出栈情况。 输入 3 1 2 3 输出 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 输入样例 1 3 1 2 3 输出样例 1 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 #include <stdio.h>int tot, res, sta, n; int r[2005], s[2005…

centos linux 7.9安装php8.2.18不支持mysqli模块,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

蓝桥杯竞赛类型:Web应用开发 全程详解

既然大家准备报名蓝桥杯&#xff0c;那么对蓝桥杯就应该有一定的了解了。没有了解也没关系&#xff0c;简单来说&#xff0c;蓝桥杯就是一个计算机竞赛&#xff0c;竞赛类型大多是使用各种语言写算法&#xff0c;当然还有本文的主体——Web应用开发。对蓝桥杯有了基本了解之后&…

Https协议如何保证安全性?

Https和Http的关系 Https是Http里的一层加密层&#xff0c;如果协议走了这一层加密层&#xff0c;那么就是https。如果没有&#xff0c;则是单纯的http。 因为没有走ssl/tls这层加密层&#xff0c;所以这是单纯的http协议&#xff0c;数据在网络中传输是明文的&#xff0c;也…

用html写一个有趣的动态背景

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>一个有趣的动态背景</title><link rel"stylesheet" href"./style.css"> </head> <body> <canvas id&…

STM32 F103 C8T6开发笔记14:与HLK-LD303-24G测距雷达通信

今日尝试配通STM32 F103 ZET6与HLK-LD303-24G测距雷达的串口通信解码 文章提供测试代码...... 目录 HLK-LD303-24G测距雷达外观&#xff1a; 线路连接准备&#xff1a; 定时器与串口配置准备&#xff1a; 定时器2的初始化&#xff1a; 串口1、2初始化&#xff1a; 串口1、2自定…

【Java开发指南 | 第十五篇】Java Character 类、String 类

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 Java Character 类转义序列 Java String 类连接字符串 Java Character 类 Character 类是 Java 中用来表示字符的包装类&#xff0c;它提供了一系列静态方法用于对字符进行操作&#xff0c;其主要分为静态方法…

C及C++标准与QT版本介绍

一.软件规范及组织 1.GNU GNU是“GNUs Not Unix”的缩写&#xff0c;是GNU计划&#xff08;GNU Project&#xff09;的官方名称&#xff0c;由理查德斯托曼在1983年9月27日公开发起。 GNU计划的目的是创建一套完全自由的操作系统。为保证GNU软件可以自由地“使用、复制、修改…

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架

AAAI-24 | EarnHFT:针对高频交易的分层强化学习&#xff08;RL&#xff09;框架 原创 QuantML QuantML 2024-04-15 09:25 上海 EarnHFT 摘要(Abstract):高频交易&#xff08;HFT&#xff09;使用计算机算法在短时间内&#xff08;例如秒级&#xff09;做出交易决策&#xff…

C++实战——日期类的实现

日期类的实现 前言一、日期类概念实现运用场景 二、日期类的具体实现代码构造函数拷贝构造函数获取日期&#xff08;内联函数&#xff09;赋值加等减等加减小于小于等于大于大于等于相等不相等前置后置前置- -后置- -关于类里重载的比较运算符为什么要加外部const示例 Date.hDa…

【人工智能】机器学习算法综述及常见算法详解

目录 推荐 1、机器学习算法简介 1.1 机器学习算法包含的两个步骤 1.2 机器学习算法的分类 2、线性回归算法 2.1 线性回归的假设是什么&#xff1f; 2.2 如何确定线性回归模型的拟合优度&#xff1f; 2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法 3.1 …

现代数据中心中智能网卡/DPU的演进

数据中心是一个大型的连接服务器和存储系统池&#xff0c;通常由组织用于远程存储、处理或分发大量数据。组织可以拥有和管理其数据中心&#xff0c;也可以租用由第三方&#xff08;亚马逊或谷歌云等云服务提供商&#xff09;管理的基础设施&#xff0c;并通过互联网访问资源。…

LeetCode 454.四数相加II(模拟,map.getOrDefault()的使用)

给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2], n…

IS62LV256AL-45ULI功能参数介绍及如何优化电源稳定性以适应

IS62LV256AL-45ULI功能参数介绍-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 制造商:ISSI 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 拜访时刻:45 ns 接口类型:Parallel 电源电压-最大:3.63 V 电源电压-最小:2.97 V 电源电流—最大值:5…

centos8.5 安装nginx

磁盘划分 600GB 4c 16GB内存 /boot 分区:200MB 这个分区用于存放启动文件和内核。200MB通常足够。/(根)分区:50GB 根分区包含操作系统、核心应用程序、配置文件和Nginx服务本身。50GB的空间应该足够存放这些文件和必要的库。/var 分区:100GB Nginx在运行时会产生日志文件,…