简介
playbook由yml语法书写,结构清晰,可读性强
分类
playbook 剧本
play(找谁)
task(干什么)
结构
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
模拟检测
ansible-playbook -C http.yaml -i /root/project/hosts
执行
ansible-playbook http.yaml -i /root/project/hosts
练习二:
使用ansible安装并配置nfs服务
之后的实验配置文件直接使用默认清单
vim /etc/ansible/hosts
思路理清
服务端:
安装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
执行
ansible-playbook nfs.yaml
成功挂载
练习三:
ansible安装并配置httpd服务,根据不同的主机配置不同的网站(多个play使用方式,但不是生产推荐,了解即可,生产推荐使用循环方式)
思路:
安装http
配置http
用户
端口
启动http
防火墙放行端口
练习:
将本地配置文件修改
vim httpd.conf.j2
创建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
检测:
执行:
ansible-playbook http2.yaml
测试
很多东西可以优化
可以写一个任务启动多个服务
可以使用循环让不同的主机配置不同的网站(之后会讲)
练习四:
使用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端
模块总结:
测试类模块
ping
ansible的ping模块用于测试主机是否可达的模块。它会向目标主机发送一个ping请求,如果目标主机能够响应,则返回pong,表示主机可达。
ansible all -m ping -i inventory
register 模块和debug模块
Ansible的register模块用于将任务执行的结果保存到变量中,以便后续任务使用。register模块可以将任务执行的结果保存到变量中,这些结果可以是命令输出、文件内容、任务状态等等。
Ansible的debug模块用于在playbook执行期间打印调试信息。它可以打印变量、模块输出、任务状态等信息,帮助我们更好地理解playbook的执行过程。
setup模块
临时命令:
ansible localhost -m setup | grep ansible_python_version
setup模块可以收集的信息包括:
系统信息,如操作系统类型、版本、主机名、内核版本等。
硬件信息,如CPU型号、内存大小、磁盘容量等。
网络信息,如IP地址、MAC地址、网卡信息等。
软件信息,如已安装的软件包、服务状态等。
授权:
known_hosts模块
known_hosts
模块允许您在 known_hosts
文件中添加或删除主机密钥。
Parameter | Choices/Defaults | Comments |
---|---|---|
hash_hostboolean在 ansible.builtin 2.3 中添加 | Choices:no ←yes | 对known_hosts 文件中的主机名进行哈希处理。 |
keystring | SSH 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 | |
pathpath | Default: "~/.ssh/known_hosts" | 要编辑的known_hosts 文件。 |
statestring | Choices: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
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秒。
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’等 方式设置 |
src | ansible控制器上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文件中有如下内容
(1)在受控端主机node1的/file文件首部插入如下两行
Insertbefore=BOF 文本首部
ansible web -m blockinfile -a 'path=/file insertbefore=BOF block="hello world\nhello china"'
(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"'
(3)当文本块标记已存在,但再次编辑块内容,会对之前的块内容进行修改
在2的基础上在给受控端主机node1的/file文件尾部插入信息hi china并自定义标记message
ansible web -m blockinfile -a 'path=/file insertafter=EOF block="hi china" marker="#{mark} message"'
(4)删除对应标记文本块,把标记对应的文本块设为空
ansible web -m blockinfile -a 'path=/file insertafter=EOF block=" " marker="#{mark} new line"'
(5)删除对应标记,state=absent
ansible web -m blockinfile -a 'path=/file insertafter=EOF block=" " marker="#{mark} new line" state=absent'
(6)使用正则表达式匹配行
如果插入的新标记和旧标记重复,那么新插入的块内容覆盖旧块的内容
用hi world覆盖hi china
ansible web -m blockinfile -a 'path=/file insertafter="^hi" block="hi world " marker="#{mark} message" '
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三个文件
此时在控制端主机node1的目录/n1下面有1,2,3,4,5五个文件
pull拉取
将node1 节点的/n1 目录下的文件复制到主控节点server的/n1 目录下
ansible node1 -m synchronize -a 'src=/n1/ dest=/n1 mode=pull'
此时查看控制端主机server的/n1目录下的文件,发现受控端主机node1下的文件已经复制到了控制端主机server的/n1目录下
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文件上下文。它可以用于添加、修改和删除文件上下文规则。
常用参数:
- path:指定文件或目录的路径。
- setype:指定文件或目录的SELinux类型。
- serange:指定文件或目录的SELinux范围。
- seuser:指定文件或目录的SELinux用户。
- state:指定文件或目录的SELinux状态,可以是present(存在)、absent(不存在)或reset(重置)。
firewalld模块
Ansible的firewalld模块用于管理firewalld防火墙。以下是一些常用的参数:
- state:指定防火墙状态,可以是enabled、disabled或permissive。
- immediate:如果设置为yes,则立即应用更改,否则需要重启firewalld服务才能生效。
- service:指定要打开或关闭的服务。
- port:指定要打开或关闭的端口。
- rich_rule:指定要添加或删除的复杂规则
系统操作类
fail模块
用于强制任务失败。
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