2、playbook

简介

playbook由yml语法书写,结构清晰,可读性强

分类
playbook 剧本
play(找谁)
task(干什么)

结构

2、playbook

playbook与AD-Hoc的关系
playbook是对AD-Hoc的一种编排方式
playbook可以持久运行,而AD-Hoc只能临时运行
playbook适合做复杂的任务,而AD-Hoc适合做简单的任务
playbook能控制任务执行先后顺序

支持
找一个人干多件事:playbook 1个play 多个task
找多个人干多件事:多个play 多个task

语法
缩进:YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tab
冒号:以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线 表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进接别作为同一列表

练习

练习一:

要求
安装http服务(yum)
编写简单网页测试内容(copy)
启动服务并加入开机自启(service)
放行firewalld对应端口(firewalld)

编写http.yaml剧本
vim http.yaml

- hosts: ljh 
  tasks:

    - name: Install Httpd Server
      yum: name=httpd state=present

    - name: Configure Httpd Server
      copy: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf backup=yes

    - name: Configure Httpd WebSite
      copy: src=./ljh.html dest=/var/www/html/ljh.html owner=http group=http mode=644

    - name: Service Httpd Server
      service: name=httpd state=started enabled=yes

    - name: Service Firewalld Server
      service: name=firewalld state=started

    - name: Configure Firewalld Server
      firewalld: zone=public service=http permanent=yes immediate=yes state=enabled

检查
ansible-playbook --syntax http.yaml -i /root/project/hosts

2、playbook

模拟检测
ansible-playbook -C http.yaml -i /root/project/hosts

执行
ansible-playbook http.yaml -i /root/project/hosts

2、playbook

练习二:
使用ansible安装并配置nfs服务

之后的实验配置文件直接使用默认清单
vim /etc/ansible/hosts

2、playbook

思路理清

服务端:
	安装nfs
	配置nfs(就是拷贝)
	根据配置创建目录,创建用户,授权
	启动并加入开机自启
客户端:
	准备一个空目录
	挂载服务端

编写配置文件
vim exports.j2

/data 192.168.1.0/24(rw,sync,no_all_squash,anonuid=666,anongid=666)

编写playbook
vim nfs.yaml

---
- hosts: 192.168.1.11
  tasks:

    - name: hostname change
      hostname: name=nfs_server

    - name: install nfs
      yum: name=nfs-utils state=present

    - name: push nfs config file
      copy: src=exports.j2 dest=/etc/exports backup=yes
      notify: Restart NFS

    - name: create nfs dir
      file: path=/data state=directory

    - name: start rpcbind
      service: name=rpcbind state=started

    - name: start nfs
      service: name=nfs state=started enabled=yes

  handlers:
    - name: Restart NFS
      service: name=nfs state=restarted


- hosts: 192.168.1.12
  tasks:
    - name: hostname change
      hostname: name=nfs_client

    - name: install nfs
      yum: name=nfs-utils state=present

    - name: client create nfs data
      file: path=/nfsdir state=directory

    - name: client mount nfs server
      mount:
        src: 192.168.1.11:/data
        path: /nfsdir
        fstype: nfs
        state: mounted
2、playbook

执行

ansible-playbook nfs.yaml

2、playbook

成功挂载

练习三:

ansible安装并配置httpd服务,根据不同的主机配置不同的网站(多个play使用方式,但不是生产推荐,了解即可,生产推荐使用循环方式)

思路:
安装http
配置http
用户
端口
启动http
防火墙放行端口

练习:

将本地配置文件修改
vim httpd.conf.j2

2、playbook
2、playbook

创建playbook
vim http2.yaml

 hosts: ljh
  tasks:
    - name: Install httpd server
      yum: name=httpd state=present

    - name: configure httpd server
      copy: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

    - name: create httpd group
      group: name=gyc gid=7788

    - name: create httpd user
      user: name=gyc uid=7788 group=7788 shell=/sbin/nologin

    - name: service httpd server
      service: name=httpd state=started enabled=yes

    - name: service firewalld server
      service: name=firewalld state=started

    - name: configure firewalld server
      firewalld:
        zone: public
        port: 7788/tcp
        permanent: yes
        immediate: yes
        state: enabled

- hosts: 192.168.1.11
  tasks:
    - name: configure website
      copy: content='web-1...' dest=/var/www/html/index.html

- hosts: 192.168.1.12
  tasks:
    - name: configure website
      copy: content='web-2...' dest=/var/www/html/index.html

检测:

2、playbook

执行:
ansible-playbook http2.yaml

测试

2、playbook
2、playbook

很多东西可以优化
可以写一个任务启动多个服务
可以使用循环让不同的主机配置不同的网站(之后会讲)

练习四:
使用playbook方式安装一个lamp架构

操作思路:
使用yum安装httpd、php、php-mysql、mariadb、firewalld等
启动httpd、firewalld、mariadb等服务
添加防火墙规则,放行http的流量,并永久生效
使用get_url下载网站php界面
扩展:将discuzdb下载解压到指定目录
效果:执行完playbook后,访问网站,就跳出安装向导

操作:
重新准备干净的环境
当前目录将discuzdb拉入

vim lamp.yml

- hosts: 192.168.1.11
  tasks:
#使用yum安装httpd、php、maridb、firewalld、unzip、MySQL-python等
    - name: Install httpd php php-mysql mariadb mariadb-server
      yum: name=httpd,php,php-mysql,mariadb,mariadb-server,unzip,MySQL-python state=present

#启动httpd,mariadb、firewalld服务
    - name: service httpd server
      service: name=httpd state=started

    - name: service mariadb server
      service: name=mariadb state=started

    - name: service firewalld server
      service: name=firewalld state=started
#添加防火墙规则,放行http的流量
    - name: configure firewalld
      firewalld: port=80/tcp immediate=yes state=enabled

#使用get_url下载php测试页面
    - name: get url ceshi.php
      get_url:
        url: http://fj.xuliangwei.com/public/index.php
        dest: /var/www/html/ceshi.php
#discuz下载解压到指定目录
    - name: unzip discuz
      unarchive: src=./Discuz_X3.3_SC_UTF8_2.zip dest=/var/www/html/ mode=0777
#变更权限为httpd进程的运行用户(apache)
    - name: Chown Directory
      file: path=/var/www/html owner=apache group=apache recurse=yes
#初始化mysqlroot登录权限
    - name: mysql-login
      mysql_user:
        name: "root"
        password: "123"
        update_password: always

#创建数据库
    - name: create application database
      mysql_db:
        login_host: "localhost"
        login_password: "123"
        login_port: "3306"
        name:
          - discuzdb
        encoding: utf8
        state: present

测试11端

2、playbook

模块总结:

测试类模块

ping

ansible的ping模块用于测试主机是否可达的模块。它会向目标主机发送一个ping请求,如果目标主机能够响应,则返回pong,表示主机可达。

ansible all -m ping -i inventory

register 模块和debug模块

Ansible的register模块用于将任务执行的结果保存到变量中,以便后续任务使用。register模块可以将任务执行的结果保存到变量中,这些结果可以是命令输出、文件内容、任务状态等等。

Ansible的debug模块用于在playbook执行期间打印调试信息。它可以打印变量、模块输出、任务状态等信息,帮助我们更好地理解playbook的执行过程。

2、playbook
2、playbook

setup模块

临时命令:

ansible localhost -m setup  | grep ansible_python_version
2、playbook

setup模块可以收集的信息包括:

系统信息,如操作系统类型、版本、主机名、内核版本等。

硬件信息,如CPU型号、内存大小、磁盘容量等。

网络信息,如IP地址、MAC地址、网卡信息等。

软件信息,如已安装的软件包、服务状态等。

授权:

known_hosts模块

known_hosts 模块允许您在 known_hosts 文件中添加或删除主机密钥。

ParameterChoices/DefaultsComments
hash_hostboolean在 ansible.builtin 2.3 中添加Choices:no ←yes对known_hosts 文件中的主机名进行哈希处理。
keystringSSH public 主机密钥,作为字符串。如果是 state=present 则为必需,如果为 state=absent 则为可选,在这种情况下主机的所有密钥都会被删除。密钥必须采用正确的 SSH 格式(请参阅 sshd(8), "SSH_KNOWN_HOSTS FILE FORMAT" 部分)。具体来说,密钥不应与 SSH pubkey 文件中的格式匹配,而应将主机名添加到包含 pubkey 的行前面,就像它在known_hosts 文件中出现的方式一样。该行前面的值还必须与 name 参数的值匹配。格式应为“<主机名[,IP]> ssh-rsa <pubkey>”。对于自定义SSH端口, key 也需要指定端口。请参阅示例部分。
name字符串/必填要添加或删除的主机(必须与密钥中指定的主机匹配)。它将被转换为小写,以便 ssh-keygen 可以找到它。必须与键属性中存在的 <hostname> 或 <ip> 匹配。对于自定义SSH端口, name 也需要指定端口。请参阅示例部分。aliases: host
pathpathDefault:
"~/.ssh/known_hosts"
要编辑的known_hosts 文件。
statestringChoices:absentpresent ←存在以添加主机密钥。缺席将其删除。

例子:

# 添加主机公钥到known_hosts文件中:
- name: Add host key to known_hosts
  known_hosts:
    name: example.com
    key: "{{ lookup('file', '/path/to/public/key') }}"
# 删除主机公钥:
- name: Remove host key from known_hosts
  known_hosts:
    name: example.com
    state: absent
# 验证主机公钥是否存在于known_hosts文件中:
- name: Verify host key in known_hosts
  known_hosts:
    name: example.com
    key: "{{ lookup('file', '/path/to/public/key') }}"
    state: present

注意:known_hosts模块默认使用当前用户的known_hosts文件,如果需要使用其他用户的文件,可以使用remote_user参数指定。

authorized_key模块

设置免密登录

而对于已经存在的、支持密码登录的一批远程主机,免密登录的设置流程如下:1、首先你需要在本地通过 ssh-keygen 命令生成好公私钥,默认使用 rsa 算法。2、下一步是通过 ansible 来批量添加 ssh 公钥到所有主机上:

编写一个名叫 add-sshkey.yml 的 playbook

---
- hosts: all  # 使用 inventory 中的所有主机
  gather_facts: false
  remote_user: root  # 使用这个账号登录远程主机

  tasks:
  - name: install ssh key
    authorized_key:  # 查看该 module 的文档:`ansible-doc authorized_key`
      user: root   # 给远程主机上的这个用户添加公钥。建议不要直接使用 root 账号(可以用 ops)
      key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"  # 也可以使用 url,这样公钥可以直接放 nginx 上挂着,更方便。
      state: present

如下命令运行这个 playbook,可以让我们交互式地输入主机密码(所有主机的密码必须相同)

ansible-playbook --ask-pass ssh-addkey.yml

命令模块:

command模块

模块内容: 

Ansible command 模块是用于在远程主机上执行命令的模块。它可以在远程主机上执行任何命令,就像在本地终端上一样。使用 Ansible command 模块可以轻松地在远程主机上执行命令,而无需在远程主机上安装任何额外的软件。

ansible all -m command -a 'tail /etc/passwd' -i inventory 
2、playbook

shell模块:

ansible shell模块用于在远程主机上执行命令,与command模块类似,但是可以使用shell语法。它不同于command模块的地方在于,它可以使用管道、重定向和其他shell特性。需要注意的是,由于shell模块可以使用shell语法,因此在编写命令时需要特别小心,以避免潜在的安全问题。

command模块和shell模块的区别:

  • command模块只能执行简单的命令,而shell模块可以执行复杂的命令,包括管道、重定向和变量替换等。
  • command模块不会启动一个shell,而shell模块会启动一个shell来执行命令。
  • command模块返回命令的退出状态码,而shell模块返回命令的标准输出和标准错误输出。
  • 因此,如果要执行简单的命令,建议使用command模块;如果要执行复杂的命令,建议使用shell模块。

script模块

Ansible的script模块允许在远程主机上执行本地脚本。它可以用于在远程主机上执行任何可执行文件,包括bash脚本、Python脚本、Perl脚本等。使用script模块时,需要将本地脚本文件复制到远程主机上,并在远程主机上执行该脚本。它可以用于在远程主机上执行任何可执行文件,包括bash脚本、Python脚本、Perl脚本等。

以下是一个使用script模块执行本地脚本的示例:

- name: Execute local script on remote host
  hosts: webserver
  tasks:
    - name: Copy script to remote host
      copy:
        src: /path/to/local/script.sh
        dest: /tmp/script.sh
        mode: 0755
    - name: Execute script on remote host
      script: /tmp/script.sh

在上面的示例中,首先使用copy模块将本地脚本文件复制到远程主机的/tmp目录下,并将其设置为可执行文件。然后使用script模块执行该脚本。

安装模块

yum_repository模块

ansible yum_repository模块用于管理yum仓库,可以添加、删除、修改yum仓库。

常用参数

  • name:仓库名称,必填参数。
  • description:仓库描述。
  • baseurl:仓库地址,必填参数。
  • gpgcheck:是否检查GPG签名,默认为yes。
  • enabled:是否启用该仓库,默认为yes。
  • gpgkey:GPG密钥地址。
  • sslverify:是否验证SSL证书,默认为yes。
  • state:仓库状态,present表示存在,absent表示不存在。

添加一个yum仓库:

- name: Add yum repository
  yum_repository:
    name: epel
    description: EPEL YUM repo
    baseurl: https://dl.fedoraproject.org/pub/epel/7/x86_64/
    gpgcheck: no
    enabled: yes

yum模块

Ansible的yum模块是用于在远程主机上安装、升级、删除和查询软件包的模块。它使用yum包管理器来执行这些操作。以下是一些常用的yum模块的参数:

  • name:指定要安装的软件包名称。
  • state:指定软件包的状态,可以是present(已安装)、absent(未安装)、latest(安装最新版本)。
  • update_cache:是否更新缓存,默认为yes。
  • disable_gpg_check:是否禁用GPG检查,默认为no。
  • enablerepo:指定要启用的仓库。
  • disablerepo:指定要禁用的仓库。
  • installroot:指定安装软件包的根目录。
  • exclude:指定要排除的软件包。
  • skip_broken:是否跳过损坏的软件包,默认为no。
  • security:是否只安装安全更新,默认为no。
  • bugfix:是否只安装错误修复更新,默认为no。
  • enhancement:是否只安装增强更新,默认为no。
  • group_package_types:指定要安装的软件包类型,可以是mandatory、default、optional、conditional。
  • timeout:指定超时时间,默认为30秒。
2、playbook

get_url模块

get_url模块是Ansible中用于从远程URL下载文件的模块。它可以从HTTP、HTTPS、FTP等协议下载文件,并支持基本身份验证和代理服务器。

常用参数:

  • url:要下载的文件的URL。
  • dest:下载文件的目标路径。
  • url_username:用于身份验证的用户名。
  • url_password:用于身份验证的密码。
  • force:如果目标文件已经存在,则强制重新下载。
  • timeout:下载超时时间。
  • validate_certs:是否验证SSL证书。
  • proxy_host:代理服务器的主机名。
  • proxy_port:代理服务器的端口号。
  • headers:HTTP请求头。

文件操作类模块

copy模块

Ansible的copy模块用于将文件或目录从控制节点复制到远程主机。它可以复制本地文件到远程主机,也可以复制远程主机上的文件到本地。

ansible copy模块常用参数:

  • src:指定源文件路径,可以是绝对路径或相对路径。
  • dest:指定目标文件路径,可以是绝对路径或相对路径。
  • backup:指定备份文件路径,可以是绝对路径或相对路径。
  • force:如果目标文件已经存在,是否强制覆盖。
  • mode:指定目标文件的权限模式,可以是数字或字符串形式。
  • owner:指定目标文件的所有者。
  • group:指定目标文件的所属组。
  • validate:指定一个命令或脚本,用于验证复制的文件是否正确。
  • content:指定要复制的文件内容,可以是字符串或文件路径。
  • remote_src:如果源文件在远程主机上,是否使用远程主机上的文件进行复制。
  • follow:如果源文件是符号链接,是否跟随符号链接进行复制。
  • selevel:指定目标文件的安全级别。
  • serole:指定目标文件的安全角色。
  • setype:指定目标文件的安全类型。
  • seuser:指定目标文件的安全用户

copy模块的基本语法如下:

- name: Copy file from local to remote
  copy:
    src: /path/to/local/file
    dest: /path/to/remote/file
    owner: user
    group: group
    mode: 0644

其中,src表示源文件路径,dest表示目标文件路径。owner、group和mode是可选参数,用于设置文件的所有者、组和权限。

如果要复制目录,可以使用递归选项:

- name: Copy directory from local to remote
  copy:
    src: /path/to/local/directory/
    dest: /path/to/remote/directory/
    owner: user
    group: group
    mode: 0755
    recurse: yes

在复制文件或目录之前,Ansible会检查目标文件是否存在。如果存在,它会根据md5校验和检查文件是否相同。如果不同,Ansible会覆盖目标文件。如果相同,Ansible会跳过复制操作。

file模块

ansible file模块常用参数如下:

  • path:指定文件或目录的路径。
  • state:指定文件或目录的状态,可选值为file、directory、link、hard、absent,默认为file。
  • mode:指定文件或目录的权限,可以使用数字或字符串表示,如0644或u=rw,g=r,o=r。
  • owner:指定文件或目录的所有者。
  • group:指定文件或目录的所属组。
  • src:指定源文件的路径,用于创建符号链接。
  • dest:指定符号链接的目标路径。
  • recurse:指定是否递归处理目录,默认为no。
  • force:指定是否强制覆盖已存在的文件或目录,默认为no。
  • backup:指定是否备份已存在的文件或目录,默认为no。
  • follow:指定是否跟随符号链接,默认为yes。
  • selevel:指定SELinux安全级别。
  • serole:指定SELinux安全角色。
  • setype:指定SELinux安全类型。
  • seuser:指定SELinux安全用户。 

使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间。在本例中,除了处理文件之外,Ansible还确保将文件的拥有用户、组和权限设置为特定值。

fetch模块

ansible fetch模块用于从远程主机上获取文件,将其复制到本地主机上。

常用参数:

  • src:远程主机上的文件路径。
  • dest:本地主机上的目标路径。
  • flat:是否将文件复制到目标路径的根目录下,而不是保留原有的目录结构。
  • validate:用于验证文件的哈希值,可选值为md5、sha1、sha224、sha256、sha384、sha512,默认为md5。

template模块

Ansible的template模块用于在远程主机上生成文件,它可以将本地主机上的模板文件渲染为目标主机上的文件。模板文件可以包含变量、条件语句、循环语句等,这样可以根据不同的情况生成不同的文件。

使用template模块的步骤如下:
在本地主机上创建模板文件,可以使用Jinja2模板语言编写模板文件。
在Ansible playbook中使用template模块,指定模板文件和目标文件的路径。
在模板文件中使用变量、条件语句、循环语句等,根据需要生成目标文件。

参数解释
backup拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no
dest目标路径
force设置为yes (默认)时,将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝
group设置远程文件的所属组
owner设置远程文件的所有者
mode设置远程文件的权限。使用数值表示时不能省略第一位,如0644。也可以使用’u+rwx’ or 'u=rw,g=r,0=r’等 方式设置
srcansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径
validate在复制到目标主机后但放到目标位置之前,执行此选项指定的命令。一般用于检查配置文件语法,语法正确则保存到目标位置。如果要引用目标文件名,则使用%s, 下面的示例 中的s%即表示目标机器上的/etc/nginx/nginx. conf.

示例:在本地主机上创建一个名为nginx.conf.j2的模板文件,内容如下:

worker_processes {{ nginx_worker_processes }};
pid /run/nginx.pid;

events {
    worker_connections {{ nginx_worker_connections }};
}

http {
    server {
        listen {{ nginx_listen }};
        server_name {{ nginx_server_name }};
        root {{ nginx_root }};
        index index.html;
    }
}

在Ansible playbook中使用template模块,指定模板文件和目标文件的路径:

- name: Generate nginx configuration file
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf

在模板文件中使用变量、条件语句、循环语句等,根据需要生成目标文件。在这个例子中,我们使用了一些变量,如nginx_worker_processes、nginx_worker_connections、nginx_listen、nginx_server_name和nginx_root,这些变量可以在Ansible playbook中定义。

lineinfile模块

ansible lineinfile模块用于在文件中查找指定的行,并对其进行修改、添加或删除操作。

常用参数:

  • path:指定要操作的文件路径。
  • regexp:指定要查找的正则表达式。
  • line:指定要添加或修改的行内容。
  • state:指定要执行的操作,可选值为present(添加或修改)、absent(删除)。
  • backup:指定是否备份原文件,可选值为yes或no,默认为yes。

示例:在/etc/hosts文件中添加一行记录

- name: Add a line to /etc/hosts
  lineinfile:
    path: /etc/hosts
    line: "192.168.1.100   host1.example.com"
    state: present

在/etc/hosts文件中删除一行记录:

- name: Remove a line from /etc/hosts
  lineinfile:
    path: /etc/hosts
    regexp: "^192.168.1.100.*"
    state: absent

blockinfile模块

blockinfile模块可以帮助我们在指定的文件中插入"一段文本",这段文本是被标记过的,换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过"标记"找到这段文本,然后修改或者删除它.

参数:

  • path参数 :必须参数,指定要操作的文件。
  • block参数 :此参数用于指定我们想要操作的那"一段文本",此参数有一个别名叫"content",使用content或block的作用是相同的。
  • marker参数 :假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,我们可以使用marker参数自定义"标记",比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test,没错,{mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落。
  • state参数 : state参数有两个可选值,present与absent,默认情况下,我们会将指定的一段文本"插入"到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插入操作或更新操作时,state的值为present,默认值就是present,如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落。
  • insertafter参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
  • insertbefore参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
  • backup参数 :是否在修改文件之前对文件进行备份。
  • create参数 :当要操作的文件并不存在时,是否创建对应的文件。

blockinfile模块案例 

案例一:

- name: Add a block to a file
  blockinfile:
    path: /etc/nginx/nginx.conf
    block: |
      server {
          listen 80;
          server_name example.com;
          location / {
              proxy_pass http://localhost:8000;
          }
      }
    marker: "# BEGIN NGINX BLOCK"
    state: present

这个任务会在/etc/nginx/nginx.conf文件中查找标记# BEGIN NGINX BLOCK,如果找到了该标记,则在该标记之前添加一个块。如果没有找到该标记,则在文件末尾添加该块。

案例二:

此时受控主机node1的/file文件中有如下内容

2、playbook

(1)在受控端主机node1的/file文件首部插入如下两行

Insertbefore=BOF 文本首部

ansible web -m blockinfile -a 'path=/file insertbefore=BOF block="hello world\nhello china"'

2、playbook

(2)在受控端主机node1的/file文件尾部插入信息Welcome to china并自定义标记new line

market  insertafter=EOF 文本末尾

ansible web -m blockinfile -a 'path=/file insertafter=EOF block="welcome to china" marker="#{mark} new line"'

2、playbook

(3)当文本块标记已存在,但再次编辑块内容,会对之前的块内容进行修改

在2的基础上在给受控端主机node1的/file文件尾部插入信息hi china并自定义标记message

ansible web -m blockinfile -a 'path=/file insertafter=EOF block="hi china" marker="#{mark} message"'

2、playbook

(4)删除对应标记文本块,把标记对应的文本块设为空

ansible web -m blockinfile -a 'path=/file insertafter=EOF block=" " marker="#{mark} new line"'

2、playbook

(5)删除对应标记,state=absent

ansible web -m blockinfile -a 'path=/file insertafter=EOF block=" " marker="#{mark} new line" state=absent'

2、playbook

(6)使用正则表达式匹配行

如果插入的新标记和旧标记重复,那么新插入的块内容覆盖旧块的内容

用hi world覆盖hi china

ansible web -m blockinfile -a 'path=/file insertafter="^hi" block="hi world " marker="#{mark} message" '

2、playbook

synchronize模块

synchronize 基于rsync命令批量同步文件做这个模块的时候,必须保证远程服务器上有rsync这个命令

synchronize模块参数

常用选项:

  • src:源文件
  • dest: 目标文件
  • archive : 是否采用归档模式同步,保证源文件和目标文件属性一致 rsync_opts : 使用rsync参数
  • --exclude=*.log : 此处为忽略.log结尾的文件, 必须和rsync_opts使用例(rsync_opts=--exclude=.txt)
  • delete: 删除不存在的文件,默认no
  • Pull 拉 push 推
  • 注意:mode默认为push推,要拉取到主控节点,需要配置mode为pull拉

案例

此时在控制端主机server上的/n1目录下面有a,b,c三个文件

2、playbook

此时在控制端主机node1的目录/n1下面有1,2,3,4,5五个文件

2、playbook

pull拉取

将node1 节点的/n1 目录下的文件复制到主控节点server的/n1 目录下

ansible node1 -m synchronize -a 'src=/n1/ dest=/n1 mode=pull'

2、playbook

此时查看控制端主机server的/n1目录下的文件,发现受控端主机node1下的文件已经复制到了控制端主机server的/n1目录下

2、playbook

Push 推送

同理:将控制端主机server目录下的所有文件同步到node1主机的/n1目录

ansible node1 -m synchronize -a 'src=/n1/ dest=/n1 mode=push '

archive模块

path:表示要被压缩的文件的路径
dest:表示压缩后的文件路径

unarchive模块

参数:

  • copy:1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes (控制到远程)
  • 2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no(远程到远程)
  • remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
  • src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
  • dest:远程主机上的目标路径
  • mode:设置解压缩后的文件权限
  • format: 设置压缩格式 bz2, gz, tar, xz, zip default=gz

用户管理

user模块

user模块实现用户账号管理。

常用选项:

  • name=:用户名
  • uid:用户的uid
  • group:所属组,即私有组
  • groups:附加组。
  • state:状态。
  • remove:是否删除家目录 yes  no
  • password: 给指定用户输入加密后的密码

group模块

选项:

  • name参数:必须参数,用于指定要操作的组名称。
  • state参数:用于指定组的状态,两个值可选,present,absent,默认为present,设置为absent 表示删除组。
  • gid参数:用于指定组的gid。
  • system参数:系统组。

服务管理

service模块(systemd 模块)

Ansible的service模块用于管理系统服务。它可以启动、停止、重启、重新加载、检查状态等等。以下是一些常用的参数:

  • name:服务名称。
  • state:服务状态,可以是started(启动)、stopped(停止)、restarted(重启)、reloaded(重新加载)等。
  • enabled:是否在系统启动时自动启动服务,可以是yes或no。
  • pattern:用于匹配服务的正则表达式。
  • sleep:在执行操作之前等待指定的秒数。
  • timeout:等待服务启动或停止的最长时间,以秒为单位。
  • arguments:启动服务时传递的参数。
  • runlevel:服务应该在哪个运行级别下启动。

访问放行

sefcontext模块

ansible sefcontext模块用于管理SELinux文件上下文。它可以用于添加、修改和删除文件上下文规则。

2、playbook

常用参数:

  • path:指定文件或目录的路径。
  • setype:指定文件或目录的SELinux类型。
  • serange:指定文件或目录的SELinux范围。
  • seuser:指定文件或目录的SELinux用户。
  • state:指定文件或目录的SELinux状态,可以是present(存在)、absent(不存在)或reset(重置)。

firewalld模块

2、playbook
2、playbook

Ansible的firewalld模块用于管理firewalld防火墙。以下是一些常用的参数:

  • state:指定防火墙状态,可以是enabled、disabled或permissive。
  • immediate:如果设置为yes,则立即应用更改,否则需要重启firewalld服务才能生效。
  • service:指定要打开或关闭的服务。
  • port:指定要打开或关闭的端口。
  • rich_rule:指定要添加或删除的复杂规则

系统操作类

fail模块

用于强制任务失败。

2、playbook

cron模块

cron模块参数

  • backup:对远程主机上的原任务计划内容修改之前做备份
  • cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
  • day:日(1-31,,/2,……)
  • hour:小时(0-23,,/2,……)
  • minute:分钟(0-59,,/2,……)
  • month:月(1-12,,/2,……)
  • weekday:周(0-7,*,……)
  • job:要执行的任务,依赖于state=present
  • name:该任务的描述
  • special_time:指定什么时候执行,参数:reboot,yearly(每年),annually,(每年相当于yearly)monthly,weekly,daily,hourly
  • state:确认该任务计划是创建还是删除
  • user:以哪个用户的身份执行

用户jack每三个月的每周日晚上22点39分查看一次自身用户登录情况

---
- hosts: all
  tasks:
  - name: create a cron file under /etc/cron.d
    cron:
      name: Lgin time
      minute: "39"                        #分
      hour: "22"                          #时
#     day: ""                             #日
      month: "*/3"                        #月
      weekday: "0"                        #周
      user: jack                          #指定用户
      job: "(last && lastb)|grep jack"    #执行内容

reboot模块

常用参数:

  • msg:重启时显示的消息,默认为“Reboot initiated by Ansible”。
  • pre_reboot_delay:重启前的延迟时间,单位为秒,默认为0。
  • post_reboot_delay:重启后的延迟时间,单位为秒,默认为0。
  • test_command:用于测试是否需要重启的命令,默认为“/usr/sbin/shutdown -r -F now”。
  • connect_timeout:连接超时时间,单位为秒,默认为10。
  • reboot_timeout:重启超时时间,单位为秒,默认为600。

示例:

- name: Reboot the server
  reboot:
    msg: "Reboot initiated by Ansible"
    pre_reboot_delay: 30
    post_reboot_delay: 60
    test_command: "/usr/sbin/shutdown -r -F now"
    connect_timeout: 20
    reboot_timeout: 300

这个示例将在远程主机上执行重启操作,并在重启前等待30秒,在重启后等待60秒。它将使用/usr/sbin/shutdown -r -F now命令测试是否需要重启,并在连接超时时间为20秒,重启超时时间为300秒。

磁盘相关模块

parted模块

可以管理磁盘

参数:

  • device 指定硬盘设备路径 比如 /dev/vdb
  • label 指定分区表类型 gpt mbr
  • number 指定分区序号
  • part_start 分区起始位置
  • part_end 分区结束位置
  • state 指定操作方式 present创建 absent删除 info查信息(默认)

mount模块

选项:

  • fstype:必选项,挂载文件的类型
  • name:必选项,挂载点
  • opts:传递给mount命令的参数
  • src:必选项,要挂载的文件
  • state:必选项
  • present:只处理fstab中的配置
  • absent:删除挂载点
  • mounted:自动创建挂载点并挂载之
  • umounted:卸载

Ansible的mount模块用于在Linux系统上挂载文件系统。它可以用于挂载本地文件系统、NFS共享、CIFS共享等。

下面是一个使用mount模块挂载本地文件系统的例子:

- name: Mount /dev/sdb1 to /mnt/data
  mount:
    path: /mnt/data
    src: /dev/sdb1
    fstype: ext4
    state: mounted

这个例子将/dev/sdb1文件系统挂载到/mnt/data目录下,并指定文件系统类型为ext4。state参数指定挂载状态,这里设置为mounted表示挂载。

filesystem模块

可以为硬盘格式化

参数:

  • dev 要格式化的分区
  • fstype 文件系统类型 比如 ext4 xfs
  • force 强制格式化,如果以前分区中有数据

参数:

  • path: 挂载点
  • src: 挂载的文件
  • fstype: 挂载的硬盘类型 比如iso9660、ext4、xfs、nfs、
  • cifs samba的共享文件系统
  • ntfs windows磁盘文件系统
  • opts: 传递给mount命令的参数
  • state: present 开机挂载,仅将挂载配置写入/etc/fstab并不会真的挂载
  • mounted 挂载设备,并将配置写入/etc/fstab
  • unmounted 卸载设备,不会清除/etc/fstab写入的配置
  • absent 卸载设备,并清理/etc/fstab写入的配置

lvg模块

vg模块,可以创建卷组

  • vg 卷组名称
  • state present创建(默认) 或者 absent删除
  • force 可以在删除时使用
  • pvs 指定物理卷
  • pesize 设定pe大小

lvol模块

创建删除逻辑卷

  • lv 定义逻辑卷名称
  • size 定义逻辑卷大小
  • vg 逻辑卷的空间来自哪个vg
  • state present创建(默认) 或者 absent删除
  • force 强制删除或者调整逻辑卷大小

发布者:LJH,转发请注明出处:https://www.ljh.cool/7073.html

(0)
上一篇 2022年9月6日 下午7:14
下一篇 2022年9月11日 上午1:58

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注