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):
    node2
    node1
    node3
    node4
    node5

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/bash

yum 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 firewalld
  hosts: test
  tasks:
    - name: allow 80/tcp
      firewalld:
        port: 80/tcp
        permanent: yes
        immediate: yes
        state: enabled

template模块

  • 上传文件,支持jinja2语法,跟copy模块不同
  • 常用选项
    • src:源文件路径
    • dest:目标文件路径
vim test.j2
# 文件内容如下
Hello {{name}},server is {{ansible_hostname}}

vim temp.yml
# 文件内容如下
---
- name: test template module
  hosts: test
  vars:
    name: "bhlu"
  tasks:
    - name: copy test.j2 to test
      template:
        src: test.j2
        dest: /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 file
  hosts: test,node2
  tasks:
    - name: create directory
      file:
        path: /tmp/demo
        state: directory
        mode: '0600'

    - name:
      copy:
        src: /etc/hosts
        dest: /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 file
  hosts: test
  tasks:
    - name: create user bob
      user:
        name: bob
        groups: adm

    - name: touch file
      copy:
        dest: /tmp/test.txt
        content: |
          Hello bhlu
  • 运行:ansible-playbook test.yml
  1. 在test组中的主机上创建bhlu用户,它的uid是1040,主组是daemon,密码为123
  • vim user.yml
---
- name: create user
  hosts: test
  tasks:
    - name: create user bhlu
      user:
        name: bhlu
        uid: 1040
        group: daemon
        password: "{{'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 manage
  hosts: test
  tasks:
  - name: create pv1
    parted: 
      device: /dev/nvme0n3
      number: 1
      state: present
      part_end: 5GiB
  
  - name: create pv2
    parted:
      device: /dev/nvme0n3
      number: 2
      state: present
      part_start: 5GiB

  - name: create vg
    lvg:
      vg: test-vg
      pvs: /dev/nvme0n3p1,/dev/nvme0n3p2

  - name: create lv
    lvol:
      vg: test-vg
      lv: test-lv
      size: 5G

  - name: create filesystem
    filesystem:
      dev: /dev/test-vg/test-lv
      fstype: xfs

  - name: mount
    mount:
      path: /data
      src: /dev/test-vg/test-lv
      fstype: xfs
      state: mounted
  • 运行:ansible-playbook disk.yml
  1. 安装多个软件包
---
- name: install pkg
  hosts: test
  tasks:
    - name: install httpd,tree,tar
      yum:
        name: [httpd,tree,tar]
        state: present
  1. 安装软件包组
# 查看软件包组
yum grouplist

# 如果显示是中文,可以加LANG=C yum grouplist
LANG=c yum grouplist

# 安装组
yum groupinstall "组名"
---
- name: install package groups
  hosts: test
  tasks:
    - name: install Development Tools
      yum:
        name: "@Development Tools"
        state: present
  1. 更新系统所有包,相当于yum update
---
- name: update packages
  hosts: test
  tasks:
    - name: update system
      yum:
        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 info
  hosts: test
  tasks:
    - name: display hostname and memory
      debug:
        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 users
  hosts: test,webservers
  tasks:
    - name: create user
      user:
        name: "{{username}}"
        state: present
        
# 执行
ansible-playbook var.yml
  • 在playbook中定义变量
---
- name: create user
  hosts: test
  vars:  # 固定是vars
    username: "bhlu"
    passowrd: "123"
  tasks:
    - name: create bhlu
      user:
        name: "{{username}}"
        password: "{{passowrd|password_hash('sha512')}}"
        state: present
  • 将变量定义在文件里
vim user_vars.yml
# 文件内容
---
user: "maomao"
pwd: "123"

vim user.yml
# 文件内容
---
- name: create
  hosts: test
  vars_files: user_vars.yml
  tasks:
    - name: create maomao
      user:
        name: "{{user}}"
        password: "{{pwd|password_hash('sha512')}}"
        state: present
        
# 执行
ansible-playbook user.yml

错误处理

  • 解决当前面任务运行错误,后面任务就不执行的问题
# 默认是下面这样写的,但是当启动test服务失败时,会直接跳出,不会执行下面的任务了
---
- name: test error
  hosts: test
  tasks:
    - name: start test service
      service:
        name: test
        state: started
        enabled: yes

    - name: touch a file
      file:
        path: /tmp/test.txt
        state: touch
        
# 优化后
cat test.yml
---
- name: test error
  hosts: test
  tasks:
    - name: start test service
      ignore_errors: yes  # 忽略错误
      service:
        name: test
        state: started
        enabled: yes

    - name: touch a file
      file:
        path: /tmp/test.txt
        state: touch
        
# 全局优化
---
- name: test error
  hosts: test
  ignore_errors: yes  # 不管哪个任务发生错误,都会忽略
  tasks:
    - name: start test service
      service:
        name: test
        state: started
        enabled: yes

    - name: touch a file
      file:
        path: /tmp/test.txt
        state: touch

触发执行任务

  • 不管第一个任务是否执行,第二个任务都会执行,有些情况是不需要这样的
# 不管有没有修改配置文件,都会重启服务
---
- name: test trigger
  hosts: test
  vars:
    http_port: "80"
  tasks:
    - name: upload httpd.conf
      template:
        src: httpd.conf
        dest: /etc/httpd/conf/httpd.conf

    - name: restart httpd
      service:
        name: httpd
        state: restarted
        

# 优化后,只有第一个任务changed,才会执行第二个任务
---
- name: test trigger
  hosts: test
  vars:
    http_port: "8080"
  tasks:
    - name: upload httpd.conf
      template:
        src: httpd.conf
        dest: /etc/httpd/conf/httpd.conf
      notify: restart httpd  # 通知,后面的要对应上,空格也不能少

  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

when条件

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

  • 常用操作符

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

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

# 当内存大于2G,才能运行httpd
---
- name: test when
  hosts: test
  tasks:
    - name: when mem > 2G
      service:
        name: httpd
        state: started
      when: ansible_memtotal_mb>2048

# 当hostname为node1,并且系统是RedHat,才运行httpd
---
- name: test when and
  hosts: test
  tasks:
    - name: start httpd
      service:
        name: httpd
        state: started
      when: >
        ansible_hostname == "node1" 
        and
        ansible_distribution == "RedHat"

任务块

  • 当满足某个条件的时候,执行一块任务
---
- name: test block tasks
  hosts: test
  tasks:
    - name: install httpd and start httpd
      block:
        - name: install httpd
          yum:
            name: httpd
            state: present

        - name: start httpd
          service:
            name: httpd
            state: started

      when: ansible_hostname == "node1"
  • blockrescuealways联合使用
    • block中的任务都成功,rescue中的任务不执行
    • block中的任务出现失败(failed),rescue中的任务执行
    • block中的任务不管怎么样,always中的任务总是执行
---
- name: test block rescue always tasks
  hosts: test
  tasks:
    - name: block / rescue / always file
      block:
        - name: touch /tmp/1.txt
          file:
            path: /tmp/1.txt
            state: touch
      
      rescue:
        - name: touch /tmp/2.txt
          file:
            path: /tmp/2.txt
            state: touch

      always:
        - name: touch /tmp/3.txt
          file:
            path: /tmp/3.txt
            state: touch

loop循环

  • 相当于shellfor循环
  • ansible中循环用到的变量名是固定的,叫item
# 创建多个目录
---
- name: create directory
  hosts: test
  tasks:
    - name: create /tmp/test01 /tmp/test02 /tmp/test03
      file:
        path: /tmp/{{item}}
        state: directory
      loop: [test01, test02, test03]
      
# 创建多个用户
---
- name: create users
  hosts: test
  tasks:
    - name: create test01 test02 test03
      user:
        name: "{{item.username}}"
        password: "{{item.password|password_hash('sha512')}}"
        state: present
      loop:
        - {"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 user
  user:
    name: "{{username}}"
    password: "{{password|password_hash('sha512')}}"
    state: present
    group: project
    shell: /bin/tcsh

- name: copy file
  copy:
    src: test.txt
    dest: /home/{{username}}/test.txt
    owner: "{{username}}"
    group: project
    
# 4. 创建create_maomao.yml
vim create_maomao.yml
# 文件内容
---
- name: create maomao
  hosts: test
  vars:
    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 = hosts

vim 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.mfbz.cn/a/560105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ansible执行mysql脚本

目录 概述实践环境要求ansible yml脚本命令离线包 概述 ansible执行mysql脚本 实践 官网文档 环境要求 环境需要安装以下内容: 1.mysql客户端(安装了mysql即会有)2.安装MySQL-python (Python 2.X) 详细插件安装链接 ansible yml脚本 关键代码如下&#xff1a; # 剧本…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

KaiwuDB CTO 魏可伟:AIoT,用行业定义数据库

4月12日&#xff0c;由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办的第十三届数据技术嘉年华&#xff08;DTC 2024&#xff09;于北京盛大召开。KaiwuDB CTO 魏可伟受邀发表《智创当下&#xff0c;KaiwuDB 从多模到 AI 的探索实践》主题演讲&#xff0c;向…

Axure如何实现限制选择项数量的交互

大家经常会看到这样的功能设计&#xff1a;可以多选&#xff0c;但是限制多选。比如某招聘网站城市的选择只能选择5个。再选择第6个的时候会提示最多只能选择5项。 这个效果是我们经常会遇到的&#xff0c;在工作中也经常会遇到需要制作这样的效果。今天我们一起来看看&#xf…

Mac M3 安装Ollama和llama3,本地部署LobeChat和刘皇叔聊三国!

OllamaLobeChat&#xff0c;本地部署聊天助手 Ollama安装下载OllamaOllama常用指令和链接运行OllamaAPI 交互Ollama基于Llama 3角色扮演 LobeChat安装首先安装docker安装LobeChat的docker 镜像和运行 Ollama安装 下载Ollama 网址&#xff1a;https://ollama.com/ 支持macOS、…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

LeetCode 349.两个数组的交集(HashSet的使用)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums1 …

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

学习大数据的第一天

今天学习如何安装hapood安装 1.安装hapood安装 2.需要的资料 3.开始安装 1.创建目录 mkdir -p /export/server 2.进入目录下 cd /export/server/ 3.安装 安装需要的依赖 yum install gcc gcc-c make autoconf automake libtool curl lzo-devel zlib-devel openssl opens…

安装SSL证书之后还会有不安全提示怎么办?

安装SSL证书过程中如果遇到错误&#xff0c;不要慌&#xff0c;按照以下步骤进行排查和解决&#xff1a; 1. 仔细阅读错误信息&#xff1a; - 错误消息通常会明确指出问题所在&#xff0c;如证书过期、证书链不完整、域名不匹配等。记下或截图保存具体的错误代码和描述&#xf…

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…

SCADA系统通过巨控GRM模块实现OPC协议远程监控PLC

SCADA系统和PLC不在同一个地方&#xff0c;需要远程监控和控制PLC&#xff0c;可以通过巨控GRM模块来实现&#xff0c;通过OPC协议转巨控服务器远程读写PLC寄存器&#xff0c;从而完成远程监控PLC。 要实现SCAKDA系统远程监控PLC&#xff0c;关键是要实现SKADA能通过互联网访问…

G1垃圾回收器

G1垃圾回收器 概述 1.Young Collection(年轻代垃圾回收) 说明&#xff1a;下图中 e代表eden区(伊甸园)&#xff0c;s代表幸存者区&#xff0c;o代表老年代 初始时&#xff0c;所有区域都处于空闲状态 创建了一些对象&#xff0c;挑出一些空闲区域作为伊甸园区存储这些对象 G1…

数据结构学习--环形链表

环形链表 我们在判断一个链表是否是环形的&#xff0c;即首尾相连&#xff0c;我们可以以使用快慢指针&#xff0c;如果快指针能再次追上慢指针&#xff0c;就说明该链表是环形的&#xff0c;这边可以举个操场跑步的例子&#xff0c;当操场是环形的&#xff0c;跑的快的&#…

Docker Compose 的安装和使用详解

Docker Compose 是 Docker 官方开源的容器编排(Orchestration)项目之一,用于快速部署分布式应用。本文将介绍 Docker Compose 的基本概念、安装流程及使用方法。 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,Docker C…

交换基础配置--单臂路由

1、创建vlan 创建vlan10 创建vlan10和vlan20 创建vlan1到vlan9 vlan1可以不用创建&#xff0c;因为交换机的所有接口默认为vlan1 本实验只需要vlan10和vlan20&#xff0c;以上只是介绍创建vlan的方法。 查看创建的vlan&#xff1a; sw2同理。接着将需要划分vlan的接口划入…

【java】29:IO流

文件&#xff1a; 1 什么是文件&#xff1a; 文件&#xff0c;对我们并不陌生&#xff0c;文件是保存数据的地方&#xff0c;比如大家经常使用的word文档,txt文件&#xff0c;excel文件.….都是文件。它既可以保存一张图片&#xff0c;也可以保持视频&#xff0c;声音.. .2 文…

开源Windows12网页版HTML源码

源码介绍 开源Windows12网页版HTML源码&#xff0c;无需安装就能用的Win12网页版来了Windows12概念版&#xff08;PoweredbyPowerPoint&#xff09;后深受启发&#xff0c;于是通过使用HTML、CSS、js等技术做了这样一个模拟板的Windows12系统&#xff0c;并已发布至github进行…

jvm-接口调用排查

问题描述 线上碰到个问题&#xff0c;某个接口调用时间特别长&#xff0c;线上调用接口直接报gateway time out 分析处理 1、先关闭该功能 &#xff08;该功能是非核心功能&#xff09; 2、本地起服务连环境排查&#xff0c;发现本地正常。并且线上其他接口正常&#xff0c;…

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测&#xff0…