ansible企业级实战(Markdown)

ansible经典实战

    • 一、配置文件解释
    • 二、实战
      • 2.1 脚本分发 && 使用copy生成新文件
      • 2.2 列出所有被管理主机list
      • 2.3 基于key验证来避免每次输入密码
        • 2.3.1 机器密码不一样的解决方案
      • 2.4 fetch 抓取被控制端的文件
        • 2.4.1 fetch 如何抓取多个文件?
      • 2.5 file 模块设定文件属性
      • 2.6 cron模块生成crontab脚本
        • 2.6.1 将脚本分发到被控制机器
        • 2.6.2 禁用cron
        • 2.6.3 删除cron
        • 2.6.4 生成自动校时cron
      • 2.7 yum 包批量安装 卸载 查看
      • 2.8 查看被控制端ip对应的hostname
      • 2.9 如何在ansible 中使用管道命令
        • 2.9.1 command、raw、shell、script区别
      • 2.10 ansible 中的判断 when
      • 2.11 fansible中的 Liledinline
      • 2.12 清除ansible 的临时文件
      • 2.13 收集gp log
      • 2.14 ansible-playbook 收集greenplum log
        • 需求:greenplum异常时,收集segment 上的pglog。
        • 方案设计
        • 执行结果
      • 2.15 lineinfile修改kubelet配置
        • 替换匹配到的行
        • backrefs 改变默认行为
        • 删除匹配到的行
        • 行前行后插入
        • 证明lineinfile是幂等的

一、配置文件解释

vim /etc/ansible/

#inventory      = /etc/ansible/hosts  #主机清单文件,默认在此目录,可根据需求修改hostlist位置#remote_tmp     = ~/.ansible/tmp  #控制机copy要执行指令到被控制机的目录,执行完后会立即删除,所以你可能看不到。
#local_tmp      = ~/.ansible/tmp   #控制机存放指令的位置#forks          = 5   #并行执行在五个被控制机上执行指令。#sudo_user      = root #在被控制机上的什么用户权限下执行指令#host_key_checking = False   (uncomment this to disable SSH key host checkink)检查对应服务器的host_key。#默认是注释掉的,为了方便操作将此注释打开,不然每新增一个host就需要ssh连接一次才能加入到known_hosts.#log_path = /var/log/ansible.log   记录ansible 执行的log ,建议打开。关键参数remote_tmp     = /home/.ansible/tmp  ansible远程主机脚本临时存放目录
local_tmp      = /home/.ansible/tmp   ansible远程主机脚本临时存放目录这两个参数默认是关闭的,根目录一般较小的话,磁盘容易爆。根须需要更改。

该参数默认是打开的,发现在/var/log/message 下有大量的ansible-slurp log。

------------------------update 2020年4月30日17:03:23 ---------------------------------------# prevents logging of tasks, but only on the targets, data is still logged on the master/controller
no_target_syslog = True
#no_target_syslog = False

------------------------update 2020年4月30日17:03:23 ----------------------------------------k 为默认用户名 ,如果在root权限下操作要特别注意。需要注意的是ansible运行时检查配置文件的顺序./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件;
~/.ansible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件;
/etc/ansible/ansible.cfg:最后,将会检查在安装Ansible时自动生成的配置文件。
自定义的配置,例如ansible-playbook -i clusters/default/hosts ..

二、实战

2.1 脚本分发 && 使用copy生成新文件

ansible webserver -m copy -a "src=/etc/yum.repos.d/epel-6.repo dest=/etc/yum.repos.d/ backup=yes"[root@gptest01 ~]# ansible webserver -m copy -a 'content=hello\nansible\n dest=/home/a2'
10.50.10.179 | SUCCESS => {"changed": true, "checksum": "5101b9bb5e88898cd73c7da5750e8d3c181ad08a", "dest": "/home/a2", "failed": false, "gid": 0, "group": "root", "md5sum": "6d609413c2fda2642340bc904365e5ea", "mode": "0644", "owner": "root", "size": 13, "src": "/root/.ansible/tmp/ansible-tmp-1585396958.03-24651708266559/source", "state": "file", "uid": 0
}
^[[A10.50.10.161 | SUCCESS => {"changed": true, "checksum": "5101b9bb5e88898cd73c7da5750e8d3c181ad08a", "dest": "/home/a2", "failed": false, "gid": 0, "group": "root", "md5sum": "6d609413c2fda2642340bc904365e5ea", "mode": "0644", "owner": "root", "size": 13, "src": "/root/.ansible/tmp/ansible-tmp-1585396957.99-43733081917653/source", "state": "file", "uid": 0
}
[root@gptest01 ~]# ansible webserver -m command -a 'cat /home/a2'
10.50.10.179 | SUCCESS | rc=0 >>
hello
ansible10.50.10.161 | SUCCESS | rc=0 >>
hello
ansible
     为了安全起见,将备份打开,此处还可以修改更多属性,详见 ansible-doc copy

-m 后跟模块,默认为command模块,如果使用其他模块可使用 -m 模块名来指定。

2.2 列出所有被管理主机list

[root@gptest01 ~]# ansible all --listhosts (15):10.50.10.17910.50.10.161[root@gptest01 ~]# ansible webserver --listhosts (2):10.50.10.17910.50.10.161

2.3 基于key验证来避免每次输入密码

Linux Centos 服务器免密验证(ansible版/非root用户)

验证完之后就不需要每次输入密码验证了,也不需要 -k 此参数了。

2.3.1 机器密码不一样的解决方案

对于每个机器密码不一样的该怎么做呢?10台服务器的密码都不一样,难道输10次?如果100/1000台呢?
对于这个问题目前的处理方案是在主机inventory中。

配置/etc/ansible/hosts文件 ansible的携带密码访问

  • ansible_ssh_host 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

  • ansible_ssh_port ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口 192.168.1.100:2222

  • ansible_ssh_user 默认的 ssh 用户名(后面ansible_su_pass 可以给root密码)

  • ansible_ssh_pass ssh 密码(这种方式并不安全,我们强烈建议使用 –ask-pass 或 SSH 密钥)

  • ansible_sudo_pass sudo 密码(这种方式并不安全,我们强烈建议使用 –ask-sudo-pass)

example:

192.168.1.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='jack' ansible_su_pass='root_password' 

2.4 fetch 抓取被控制端的文件

fetch 只能被控端复制单个文件。

ansible webserver -m fetch -a ‘src=/home/setest.sh dest=/home/ansibleDemo’

2.4.1 fetch 如何抓取多个文件?

先tar起来再fetch

[root@gptest01 ansibleDemo]# ansible webserver -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'[WARNING]: Consider using the unarchive module rather than running tar.  If you need to use command because unarchive is insufficient you can add warn=False to
this command task or set command_warnings=False in ansible.cfg to get rid of this message.10.50.10.179 | SUCCESS | rc=0 >>
tar: Removing leading `/' from member names10.50.10.161 | SUCCESS | rc=0 >>
tar: Removing leading `/' from member names10.50.10.163 | SUCCESS | rc=0 >>
tar: Removing leading `/' from member names[root@gptest01 ansibleDemo]# ansible webserver -m shell -a 'ls '
10.50.10.179 | SUCCESS | rc=0 >>
anaconda-ks.cfg
ansibleDep
install.log
install.log.syslog
log.tar.xz
nohup.out
....

看到这个颜色证明 fetch成功了

通过 tar tvf不解压 查看


[root@gptest01 root]# tar tvf log.tar.xz 
-rw------- root/root     18118 2017-08-25 11:01 var/log/anaconda.ifcfg.log
-rw------- root/root     38535 2017-08-25 11:01 var/log/anaconda.log
-rw------- root/root    196997 2017-08-25 11:01 var/log/anaconda.program.log
-rw------- root/root    570708 2017-08-25 11:01 var/log/anaconda.storage.log
-rw------- root/root    113691 2017-08-25 11:01 var/log/anaconda.yum.log
-rw-r--r-- root/root     10910 2019-12-13 10:49 var/log/boot.log
...

2.5 file 模块设定文件属性

在被控制机器上建立文件或者文件夹

ansible webserver -m file -a'name=/home/a3 state=touch'

删除文件

# state = directory 建立文件夹 
ansible webserver -m file -a'name=/home/a3 state=absent'

建立软连接

ansible webserver -m file -a 'src=/etc/yum.repos.d/redhat.repo path=/home/redhat.repo.link state=link'

2.6 cron模块生成crontab脚本

2.6.1 将脚本分发到被控制机器

ansible gpservers -m cron -a 'minute=*/5 job=/home/scripts/formatVmstat_start.sh name=formatvmstat' -k
[root@P1QMSSDW08 scripts]# crontab -l
#Ansible: formatvmstat
*/5 * * * * /home/scripts/formatVmstat_start.sh

每天9点清空k8slog.

ansible k8s-all -m cron -a 'minute=0 hour=9 job=/home/clean-k8s-log.sh' 

2.6.2 禁用cron

禁用cron需要注意要指定 job 和 name,否则先前的crontab 无法删除。


ansible gpservers -m cron -a 'disabled=true job=/home/scripts/formatVmstat_start.sh name=formatvmstat' -k
[root@P1QMSSDW08 scripts]# crontab -l
#Ansible: formatvmstat
#*/5 * * * * /home/scripts/formatVmstat_start.sh

可以看到已经被注释了。

2.6.3 删除cron

ansible gpservers -m cron -a 'job=/home/scripts/formatVmstat_start.sh name=formatvmstat state=absent' -k

2.6.4 生成自动校时cron

ansible ceph-[1-9]* -i hosts -m cron -a "name='sync time' job='/usr/sbin/ntpdate ntp1.aliyun.com' minute='*/1'"

2.7 yum 包批量安装 卸载 查看

2.8 查看被控制端ip对应的hostname

有时候管理的机器太多时,想知道某台机器的ip 和hostname对应的关系,可以使用如下命令

ansible gpservers -m setup -a 'filter=ansible_hostname' -k
10.50.10.173 | SUCCESS => {"ansible_facts": {"ansible_hostname": "P1QMSSDW03"}, "changed": false, "failed": false
}
10.50.10.174 | SUCCESS => {"ansible_facts": {"ansible_hostname": "P1QMSSDW04"}, "changed": false, "failed": false
}
10.50.10.171 | SUCCESS => {"ansible_facts": {"ansible_hostname": "P1QMSSDW01"}, "changed": false, "failed": false
}
......

2.9 如何在ansible 中使用管道命令

有一个这样的需求,在控制机上想cd 到某个目录,然后执行某个脚本。刚开始使用shell模块,先cd 在sh始终提示无法找到shell脚本,后来使用了raw 模块,shell模块也支持管道命令,command是不支持的。才理解ansible的shell 模块是session级别的。事实上可以从执行结果中看到

Shared connection to 10.50.10 closed.。执行完了session就关了。

2.9.1 command、raw、shell、script区别

命令执行模块有四个:command、raw、shell、script。
command是默认模块,建议使用shell,功能较方便,script和shell的区别是一个执行控制端的脚本,一个执行远程端的脚本。

[root@gp01 scripts]# ansible gpservers -m raw -a "cd /home/scripts;pwd;sh /home/scripts/formatVmstat.sh"
10.50.10.** | SUCCESS | rc=0 >>
/home/scripts
ipaddr= 
Shared connection to 10.50.10.169 closed.
10.50.10.1** | SUCCESS | rc=0 >>
/home/scripts
ipaddr= 10.50.10.1**
1**
Shared connection to 10.50.1** closed.

使用管道结合sed或者单独使用sed替换crontab文件中的关键字

[root@gptest01 scripts]# ansible 10.50.10.172 -m shell -a  "find /var/spool/cron -name "root"|xargs sed -i '/vmstat_1/s@vmstat_172@vmstatGene_172@'"
10.50.10.172 | SUCCESS | rc=0 >>[root@gptest01 scripts]# ansible 10.50.10.173 -m shell -a  "time sed -i '/vmstat_1/s@vmstat_173@vmstatGene_173@' /var/spool/cron/root"

2.10 ansible 中的判断 when

2.11 fansible中的 Liledinline

2.12 清除ansible 的临时文件

rsync实战

cachecloud-web]# ansible gweservers -m shell -a 'rsync -a --delete  /home/.ansible/tmp_1/ /home/.ansible/tmp/'
note:
/home/.ansible/tmp_1/ 为空文件夹
/home/.ansible/tmp/ 为实际要删除的文件夹

2.13 收集gp log

ansible 10.50.10.172 -m shell -a 'find /data*/gpseg*/pg_log/ -name 'gpdb-2020-08-09_000000.csv' -exec scp {} root@10.50.10.170:/redis/ \;'

此种方式貌似不生效。但是find 后面跟exec scp这个不用ansible是可以使用的。

2.14 ansible-playbook 收集greenplum log

需求:greenplum异常时,收集segment 上的pglog。

这个需求第一个想到的是用find 然后fetch ,这两个模块集合可完成。在使用find 的时候,paths 这个参数要求必须是全路径。

#] ansible-doc findpathsList of paths of directories to search. All paths must be fully qualified.(Aliases: name, path)
fetch 模块要求必须是一个文件#] ansible-doc fetch
= srcThe file on the remote system to fetch. This `must' be a file, not a directory. Recursive fetching may be supported in a later release.[Default: None]

方案设计

综上最后使用了 shell + register + ansible变量 +fetch

其中register 和 ansible变量第一次接触。饶了不少弯路。

register保存的信息就执行结果中"=>"后面的字典信息,信息保存在声明的变量中。

ok: [10.50.10.172] => {"failed": false, "find_result.stdout_lines[0]": "/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv"
}
ok: [10.50.10.176] => {"failed": false, "find_result.stdout_lines[0]": "/datap11/gpseg20/pg_log/gpdb-2020-08-09_000000.csv"
}

Ansible通过facts组件来收集被管理节点信息,facts收集的信息是json格式的,其中任一项都可以当作变量被直接引用,如在ansible-playbook、jinja2模板中引用。

本列是通过 变量引用json数据的方式
在ansible中,任何一个模块都会返回json格式的数据,即使是错误信息都是json格式的。在ansible中,json格式的数据,其中每一项都可以通过变量来引用它。当然,引用的前提是先将其注册为变量。例如下面的playbook是将shell模块中find命令的结果注册为变量,并使用debug模块输出。可以看出输出是一个jsob 格式。

可以看到stdout_lines中的元素正式我们想要的,如何提取出这个并将其传给fetch?

用列表的索引取出,find_result.stdout_lines[0],这取出的是/datap11/gpseg20/pg_log/gpdb-2020-08-09_000000.csv。

至此该需求的思路完成。

ok: [10.50.10.176] => {"failed": false, "msg": {"changed": true, "cmd": "find /datap1[1-4]/gpseg*/pg_log/ -name 'gpdb-2020-08-09_000000.csv'", "delta": "0:00:00.034069", "end": "2020-08-10 16:24:43.854496", "failed": false, "rc": 0, "start": "2020-08-10 16:24:43.820427", "stderr": "", "stderr_lines": [], "stdout": "/datap11/gpseg20/pg_log/gpdb-2020-08-09_000000.csv\n/datap12/gpseg21/pg_log/gpdb-2020-08-09_000000.csv\n/datap13/gpseg22/pg_log/gpdb-2020-08-09_000000.csv\n/datap14/gpseg23/pg_log/gpdb-2020-08-09_000000.csv", "stdout_lines": ["/datap11/gpseg20/pg_log/gpdb-2020-08-09_000000.csv", "/datap12/gpseg21/pg_log/gpdb-2020-08-09_000000.csv", "/datap13/gpseg22/pg_log/gpdb-2020-08-09_000000.csv", "/datap14/gpseg23/pg_log/gpdb-2020-08-09_000000.csv"]}
}
# @date 2020年8月10日16:20:48
# @desc get abnormal pg log
# @author ninesun
# @note 全量收集需要确保dest 目录空间足够
---
- hosts: 10.50.10.172# gather_factors: no 
# remote_usr: roottasks:- name: find pg log#find:#paths= /datap*/gpseg*/pg_log/#paths= /datap11/gpseg4/pg_log/#patterns: 'gpdb-2020-08-09_000000.csv'shell: find /datap1[1-4]/gpseg*/pg_log/ -name 'gpdb-2020-08-09_000000.csv'#shell: /sbin/ifconfig bond0|grep "inet addr"|awk -F'[:" "]+' '{print $4}'register: find_result- name: output infodebug: msg="{{find_result}}"- name: output info 1debug: msg="{{find_result.stdout}}"- name : info 2debug: var=find_result.stdout_lines[0]- name: fetch logfetch: src={{ item }} dest=/redis/with_items:- '{{ find_result.stdout_lines[0] }}'- '{{ find_result.stdout_lines[1] }}'- '{{ find_result.stdout_lines[2] }}'- '{{ find_result.stdout_lines[3] }}'

执行结果


PLAY [10.50.10.172] **********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.50.10.172]TASK [find pg log] ***********************************************************************************************************************************************************************************************
changed: [10.50.10.172] => {"changed": true, "cmd": "find /datap1[1-4]/gpseg*/pg_log/ -name 'gpdb-2020-08-09_000000.csv'", "delta": "0:00:00.037452", "end": "2020-08-10 16:07:15.685203", "failed": false, "rc": 0, "start": "2020-08-10 16:07:15.647751", "stderr": "", "stderr_lines": [], "stdout": "/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv\n/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv\n/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv\n/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv", "stdout_lines": ["/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv", "/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv", "/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv", "/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv"]}TASK [output info] ***********************************************************************************************************************************************************************************************
ok: [10.50.10.172] => {"failed": false, "msg": {"changed": true, "cmd": "find /datap1[1-4]/gpseg*/pg_log/ -name 'gpdb-2020-08-09_000000.csv'", "delta": "0:00:00.037452", "end": "2020-08-10 16:07:15.685203", "failed": false, "rc": 0, "start": "2020-08-10 16:07:15.647751", "stderr": "", "stderr_lines": [], "stdout": "/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv\n/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv\n/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv\n/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv", "stdout_lines": ["/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv", "/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv", "/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv", "/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv"]}
}TASK [output info 1] *********************************************************************************************************************************************************************************************
ok: [10.50.10.172] => {"failed": false, "msg": "/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv\n/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv\n/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv\n/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv"
}TASK [info 2] ****************************************************************************************************************************************************************************************************
ok: [10.50.10.172] => {"failed": false, "find_result.stdout_lines[1]": "/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv"
}TASK [fetch log] *************************************************************************************************************************************************************************************************
ok: [10.50.10.172] => (item=/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv) => {"changed": false, "checksum": "cc879538d8006df2742b10f63a6b173022f6cc1a", "dest": "/redis/10.50.10.172/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv", "failed": false, "file": "/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv", "item": "/datap12/gpseg5/pg_log/gpdb-2020-08-09_000000.csv", "md5sum": "bfef4c763e9af6dad963ade50fcb39d5"}
changed: [10.50.10.172] => (item=/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv) => {"changed": true, "checksum": "2df74ed5b87f3454a6fa0c8de64b56b6a6dc43b1", "dest": "/redis/10.50.10.172/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv", "failed": false, "item": "/datap11/gpseg4/pg_log/gpdb-2020-08-09_000000.csv", "md5sum": "e5b37d86c698caf69e1f6d0896854960", "remote_checksum": "2df74ed5b87f3454a6fa0c8de64b56b6a6dc43b1", "remote_md5sum": null}
changed: [10.50.10.172] => (item=/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv) => {"changed": true, "checksum": "fa96817d013a5b4eb456537e09dff0326f775442", "dest": "/redis/10.50.10.172/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv", "failed": false, "item": "/datap13/gpseg6/pg_log/gpdb-2020-08-09_000000.csv", "md5sum": "7690e87b4cdfbe786df18419e2677c4a", "remote_checksum": "fa96817d013a5b4eb456537e09dff0326f775442", "remote_md5sum": null}
changed: [10.50.10.172] => (item=/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv) => {"changed": true, "checksum": "4214a35e77f776988993c1fe0c18c8dc23582b0f", "dest": "/redis/10.50.10.172/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv", "failed": false, "item": "/datap14/gpseg7/pg_log/gpdb-2020-08-09_000000.csv", "md5sum": "91d8fc83059bb671641d141569f1a716", "remote_checksum": "4214a35e77f776988993c1fe0c18c8dc23582b0f", "remote_md5sum": null}PLAY RECAP *******************************************************************************************************************************************************************************************************
10.50.10.172               : ok=6    changed=2    unreachable=0    failed=0  

总结一下:ansible 变量的变种比较多,尤其是结合register(寄存器)和定义变量变化方式多,总结了一个脑图给大家。相信总有一种能满足你的需求。

在本例中使用变量的方式见红色框框。

在这里插入图片描述

2.15 lineinfile修改kubelet配置

需求:
需要修改kubelet的配置,之前都是用echo >> 或者cat >> file << EOF 来解决。
但仔细一琢磨,很可能会引发一些意想不到的问题,比如:

  • 如果需要添加的配置已经存在,echo 仍会向配置文件底部添加同样的内容
  • 如果添加配置的任务重复执行多次,则配置文件中也会多次出现重复的内容。无法做到幂等
  • 如何做到,当对应的配置已经存在,则将该配置改为期望的值;当对应的配置不存在,不做任何操作(脚本可以搞得,例如让chatgpt给你写一个)
  • 如何安全地移除指定的配置项

ansible中的lineinfile 可以完成这个需求。
下面这个ansibel的意思是
1、修改的目标文件是/etc/kubernetes/kubelet.conf
2、如果匹配到以 containerLogMaxFiles开头的文件,则替换成 containerLogMaxFiles: 5。
否则直接添加containerLogMaxFiles: 5。

对于 Ansible 而言,我们只需要关注期望达到的状态,而不用纠结为了达到该状态需要执行哪些步骤。
如 lineinfile 模块,line 指定的内容即为我们期望目标文件达到的状态。即该文件最终一定会包含一行与 line 相同的文本。

替换匹配到的行

ansible 10.50.10.33 -m lineinfile -a "dest=/etc/kubernetes/kubelet.conf regexp='^containerLogMaxFiles' line='containerLogMaxFiles: 5' state=present"

和下面的脚本是等价的,state默认为present,

ansible 10.50.10.33 -m lineinfile -a "dest=/etc/kubernetes/kubelet.conf regexp='^containerLogMaxFiles' line='containerLogMaxFiles: 5'"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
10.50.10.33 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"backup": "","changed": true,"msg": "line added"
}

backrefs 改变默认行为

lineinfile 默认的行为是若 line 指定的内容未存在,regexp 正则表达式也没有任何匹配,就在文件末尾添加一行 line 指定的内容。
当 backrefs 设定为 true 时,若 line 指定的内容不存在,正则表达式也没有匹配。则不做任何操作(有时候适合替换)

ansible 10.50.10.33 -m lineinfile -a "dest=/etc/kubernetes/kubelet.conf regexp='^containerLogMaxFiles' line='containerLogMaxFiles: 5' backrefs=true"

删除匹配到的行

ansible 10.50.10.33 -m lineinfile -a "dest=/etc/kubernetes/kubelet.conf regexp='^containerLogMaxFiles' line='containerLogMaxFiles: 5' absent=true"

在这里插入图片描述

行前行后插入

在container开头的行后加入containerLogMaxSize: 50Mi。
insertbefore则是在匹配的行前加入

ansible 10.50.10.33 -m lineinfile -"dest=/etc/kubernetes/kubelet.conf insertafter='^containerLogMaxFiles' line='containerLogMaxSize: 50Mi'"ansible 10.50.10.33 -m lineinfile -"dest=/etc/kubernetes/kubelet.conf insertbefore='^containerLogMaxFiles' line='containerLogMaxSize: 50Mi'"

在这里插入图片描述

证明lineinfile是幂等的

在这里插入图片描述

最终经过一番折腾kubelet log rotate的配置就ok了

ansiblee k8s-node -m lineinfile -a "dest=/etc/kubernetes/kubelet.conf regexp='^containerLogMaxFiles' line='containerLogMaxFiles: 5'"ansible k8s-node -m lineinfile -a "dest=/etc/kubernetes/kubelet.conf rinsertbefore='^containerLogMaxFiles' line='containerLogMaxSize: 50Mi'"

在这里插入图片描述

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30334.html

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

相关文章

【Python】词云之 wordcloud库 全解析

有用的话&#xff0c;欢迎姗莲✨✨✨✨✨✨✨✨✨✨✨✨✨ 目录 一基础用法二、WordCloud类 形参说明2.1 常用参数2.11 字体 font_path2.12 画布尺寸 width、hight2.13 比例&#xff08;缩放&#xff09;scale2.14 颜色(表) colormap2.15 颜色函数 color_func2.16 词语组合频率…

【云炬COMSOL模型】自己做的激光超声的COSMOL模型

模拟结果 表面温度 等值线 表面应力 模型设置 全局定义 几何 材料 固体传热物理场 固体力学物理场 多物理场 网格 研究&计算日志 2e-06 - out- 1.43e-06 - out- 1.44e-06 - out- 1.45e-06 - out- 1.46e-06 …

uniapp生成商品分享海报

uniapp用canvas生成一个分享商品的海报 文章目录 前言一、展示效果二、使用步骤1.HTML部分2.CSS部分3.JS部分 总结 前言 uniapp用canvas生成一个分享商品的海报&#xff0c;因为用到了uni.downloadFile这个API&#xff0c;所以要注意图片在H5端跨域的问题。 以下是本篇文章正…

postman错误提示“Current request is not a multipart request”

今天在写业务进行批量上传文件时&#xff0c;用postman测试发现报500错误----Current request is not a multipart request&#xff0c;翻译了一下大概意思是 当前请求不是多部分请求&#xff0c;所以就很纳闷。今天特意记录一下 首先我们上传文件时&#xff0c;在postman里面…

如何为豆瓣FM写一个chrome的歌词插件

对于喜欢豆瓣FM的同学来说&#xff0c;没有歌词是件令人苦恼的事&#xff0c;下面我就来总结下怎样为豆瓣FM写一个chrome的歌词插件。 --------------------------------- 1.需要的技能 首先&#xff0c;你要会javascript&#xff0c;其次你要掌握一点chrome的hack&#xff…

设计师解放双手之作!3秒生成风景园林效果图,AIGC赋能景观设计

项目简介 在过去几十年&#xff0c;风景园林经历了从“刀耕火种”的完全手绘设计时代到当下比较流行的参数化设计时代&#xff0c;过去的每一轮技术革新都让风景园林作品的表现形式产生了巨大的改变。随着计算机图像技术的发展&#xff0c;我们有更多的建模和渲染软件辅助提升图…

有哪些中西合璧的建筑设计?

所谓中西合璧&#xff0c;中即中华文化&#xff0c;体系繁多&#xff0c;源远流长&#xff0c;浩如烟海&#xff0c;是世界三大文化体系之一&#xff0c;在历史上曾是东亚文化的中心&#xff0c;一度影响欧洲&#xff1b;西即西方文化&#xff0c;西方物质文明和精神文明&#…

独家 | ChatGPT可以解决分级和分类这样的简单机器学习任务

作者&#xff1a;Damir Yalalov 翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约1100字&#xff0c;建议阅读5分钟 本文介绍了ChatGPT如何解决简单的机器学习任务并给出了鸢尾花分类和城市预测两个案例。 一句话概括&#xff1a; ChatGPT可以帮助你完成简单的机器学习任务…

决定AI大模型胜负的关键:解读数据在未来竞争中的角色

随着人工智能的迅猛发展&#xff0c;高质量数据的重要性已愈发明显。以大型语言模型为例&#xff0c;近年来的飞跃式进展在很大程度上依赖于高质量和丰富的训练数据集。相比于GPT-2&#xff0c;GPT-3在模型架构上的改变微乎其微&#xff0c;更大的精力是投入到了收集更大、更高…

RWKV 语言模型:具有 Transformer 优点的 RNN

RWKV 语言模型&#xff0c;这是一个具有巨大潜力的开源大型语言模型。由于 ChatGPT 和一般的大型语言模型最近受到了很多关注。在这篇文章中&#xff0c;我将尝试解释与大多数语言模型&#xff08;transformer&#xff09;相比&#xff0c;RWKV 有何特别之处。 RWKV 可视化 浅谈…

重磅活动!线下报名 | 大模型为什么是AI领域的“兵家必争之地”?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 离我们自己的“ChatGPT”还有多远&#xff1f; GPT-4 , game changer OR game over&#xff1f; Copilot究竟是打工人的福音还是噩梦&#xff1f; AI TIME今年将持续推出AIGC大咖思辨的线下活动&#xff01;AIG…

火爆首发 | 微软工程师解密全球火出圈的AI科技ChatGPT

首期“支点加速营前沿技术研习社”线上直播课开启报名啦&#xff01; 本次课程由苏州人工智能产业创新中心、图灵社区联合主办&#xff0c;苏州国际科技园和蒲公英孵化器协办&#xff0c;微软&#xff08;亚洲&#xff09;互联网工程院提供技术支持。 与此同时&#xff0c;课程…

百度文心大模型 3.5 斩获7个满分、三个第一;苹果正在测试 AppleGPT 产品;谷歌给员工断网,降低网络攻击风险|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

如何抢演唱会门票,AI给你一套超强攻略

有的歌手的演唱会门票不会放在一个平台&#xff0c;以应该提前做好攻略&#xff0c;那么对于我这种新手小白该如何抢到票呢&#xff0c;其实我们可以通过AI去找到解决办法 1、打开多御浏览器、找到ChatGPT进入页面 二、提前准备好你想去看谁谁的演唱会&#xff0c;他会给你分析…

1天生成100个chatgpt提问prompt提示语,逆向提示语工程引爆创作火花!ChatGPT超级写手机器人助你创作惊艳之作!

1天生产出1000套提问模版&#xff0c;逆向提示语工程引爆创作火花&#xff01;ChatGPT超级写手机器人助你创作惊艳之作&#xff01; 创作内容时&#xff0c;找不到合适的提示词是个巨大困扰。 这限制了我们的创作潜力&#xff0c;无法生成满意的内容。 你是否渴望一种创作工具&…

特斯拉Tesla Model 3整体架构解析

一辆特斯拉 Model 3型车在硬件改造后解体 Sensors for ADAS applications 特斯拉 Model 3型设计的传感器组件包括&#xff1a;8个摄像头&#xff0c;可在250米半径内提供汽车周围360度的可视性&#xff1b;12个超声波传感器&#xff0c;可完成这一视觉系统。它们共同允许在一定…

清华 ChatGLM-6B 中文对话模型部署简易教程

本文目录 一、前言二、下载三、部署3.1 配置环境3.2 启动 demo 程序3.2.1 启动 cli_demo.py3.2.2 启动 web_demo.py 四、【最新】ChatGLM-6B-int4 版本教程4.1 下载4.2 配置环境4.3 启动 demo 程序 五、华为 CodeLab 免费 GPU 平台部署 ChatGLM-6B-int4&#xff08;CPU版&#…

关于OpenAI的登录问题

关于OpenAI的登录问题 记录一点关于使用OpenAI的问题 文章目录 关于OpenAI的登录问题错误场景错误原因解决方案 错误场景 当我们通过微软账号登录进OpenAI时&#xff0c;发现了这样的错误提示&#xff1a; 错误原因 目前只有用谷歌的Gmail邮箱才可以登录&#xff0c;或者直…

面向结构化数据的文本生成技术研究

来自&#xff1a;DataFunTalk 进NLP群—>加入NLP交流群 导读今天讨论的是面向结构化数据的文本生成技术研究&#xff0c;这是现在AIGC特别火的场景之一。这种技术不同于传统的文本生成&#xff0c;它的输入是一种比较特殊的结构&#xff0c;比如几百条不同的三元组或者很多种…

长江商学院EMBA38期甄知科技:ChatGPT应用与实践初探

近期&#xff0c;长江商学院EMBA38期&甄知科技开展了题为“ChatGPT应用与实践初探”的线下沙龙活动&#xff0c;由上海甄知科技创始合伙人兼CTO张礼军主讲&#xff0c;主要给大家解密最近很火的ChatGPT是什么&#xff0c;分享如何玩转ChatGPT&#xff0c;初步探索ChatGPT对…