ansible
ansible-config
ansible-config list
ansible-config dump
ansible-config view
ansible-connection
ansible-console
ansible-doc
ansible-galaxy
ansible-inventory
ansible-playbook
ansible-pull
ansible-vault
ansible myhost -m setup
# 查看当前 playbook 文件有哪些标签
ansible-playbook --list-tags playbook.yml
默认 /etc/ansible/ansible.cfg
stdout_callback 选项可配置输出结果
启用内置回调插件
callback_whitelist=timer,mail,profile_roles,custom_callback
timer 可以计算整个playbook的运行时间
profile_roles在执行中添加用时时间
查看当前可用的回调插件列表
ansible-doc -t callback -l
常用模块帮助文档参考:
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
https://blog.csdn.net/qq_36543595/article/details/124157788
功能:在远程主机执行命令,此为默认模块,可忽略-m选项
注意:此命令不支持 $VARNAME < > | ; & 等,可以用shell模块实现
ansible 主机名 -m command -a "cmd" #-m command 默认可以不加;-a 参数;cmd是执行的命令
ansible 主机名 -a "chdir=/dir"
ansible websrvs -a 'touch a.txt' #ansible使用file模块来代替touch命令
ansible websrvs -a 'ls /root/a.txt' #没有指定目录,则是创建到了root家目录下
ansible websrvs -a 'chdir=/opt touch b.txt' #先切换目录,再创建文件
nsible websrvs -a 'creates=/etc/fstab rm -f /opt/b.txt' #这个文件存在,所以不执行后面的rm操作
ansible websrvs -a 'removes=/etc/fstab rm -f /opt/b.txt' #而removes相反,/etc/fstab文件存在,所以执行后面的rm操作
ansible websrvs -a "echo $HOSTNAME" #显示的是当前ansible服务器的主机名,而不是客户端的主机名
ansible websrvs -a "echo hello >/opt/hello.txt" #客户端未创建hello.txt文件
ansible websrvs -a 'echo centos |passwd --stdin root' #未修改
功能:和command相似,用shell执行命令。ansible执行的时候,会在客户端生成临时的python程序,执行完毕后,自动删除
[root@c7-slave02 ~]# tree .ansible/tmp
.ansible/tmp
└── ansible-tmp-1626326986.2722778-14827-22658287469129
└── AnsiballZ_command.py
1 directory, 1 file
[root@c7-slave03 ~]# ll .ansible/tmp #执行完成后清除
total 0
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
ansible websrvs -m script -a '/data/test.sh'
功能:从ansible服务器主控端复制文件到远程主机
# 先备份,再覆盖,客户端要有owner用户,否则报错 如目标存在,默认覆盖,此处指定先备份
# 再次复制,由于test.sh内容不变,所以根据ansible的幂等性,不会生成备份文件,显示是success而非changed
ansible websrvs -m copy -a "src=/root/test.sh dest=/tmp/test1.sh owner=wang mode=600 backup=yes"
# 指定内容,直接生成目标文件;如果目标文件存在,会覆盖其内容
ansible websrvs -m copy -a "content='test line1\ntest line2' dest=/opt/test1.sh"
# 复制/etc/sysconfig目录自身,注意/etc/sysconfig后面没有/
ansible websrvs -m copy -a "src=/etc/sysconfig dest=/opt/"
#复制/etc/sysconfig下的文件,不包括/etc/sysconfig目录自身,注意/etc/后面有/
ansible websrvs -m copy -a "src=/etc/sysconfig/ dest=/opt"
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
# 提取远程主机的test.sh文件到/data/scripts目录下
ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
# 提取所有远程主机的文件到当前主控端的/data/os目录下,并按远程主机的ip地址创建各自的目录存放
# 会创建/data/os目录,并在其目录下创建主机ip命名的目录存放文件
ansible websrvs -m fetch -a 'src=/etc/redhat-release dest=/data/os'
功能:删除文件 设置文件属性
# 删除使用state=absent
ansible cnp130 -m file -a "path=/etc/systemd/system/auto-mount.service state=absent"
# 创建空白文件
ansible websrvs -m file -a "path=/opt/test.sh state=touch"
# 创建空文件,修改权限,前提是用户已存在,不存在该用户会报错
ansible websrvs -a "getent passwd wang"
# 创建目录或文件,使用file模块,具有幂等性。如果使用mkdir等Linux命令,重复创建会报错
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
# 创建软链接,原文件是在目标主机指定的目录中,否则失败
ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link'
功能:分发 ansible 控制端的 ssh 公钥到远程服务器
# = key present 表示添加指定 key 到 authorized_keys 文件中, absent 表示从 authorized_keys 文件中移除指定 key
# = user 将密钥分发给目标主机上的哪个用户,默认会将公钥写入目标主机的
authorized_key: key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}" state=present user=root
功能:解包解压缩
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上或第三方主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
ansible websrvs -m unarchive -a 'src=sys.tar.gz dest=/opt owner=haha group=bin'
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
功能:打包压缩保存在被管理节点
ansible websrvs -m archive -a 'path=/etc/sysconfig dest=/opt/sys.tar.bz2 format=bz2 owner=haha mode=0600'
功能:管理主机名
ansible 192.168.20.22 -m hostname -a 'name=nginx01'
功能:计划任务
支持时间:minute,hour,day,month,weekday
# 创建任务
ansible dbsrvs -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/opt/mysql_backup.sh'
# 再创建一个时间同步的计划任务
ansible dbsrvs -m cron -a 'minute=*/5 job="/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null" name=Synctime'
#删除任务
ansible dbsrvs -m cron -a 'name="backup mysql" state=absent'
#禁用计划任务
ansible dbsrvs -m cron -a 'minute=*/5 job="/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null" name=Synctime disabled=yes'
#启用计划任务
ansible dbsrvs -m cron -a 'minute=*/5 job="/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null" name=Synctime disabled=no'
功能:管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
ansible websrvs -m yum -a 'name=iotop,cowsay state=present' #安装,present可以省略
ansible websrvs -m yum -a 'name=iotop,cowsay state=absent' #删除
ansible websrvs -m yum -a 'name=iotop,cowsay'
功能:管理服务
# 增加开机启动enabled
ansible websrvs -m service -a "name=httpd state=started enabled=yes"
# 停止服务
ansible all -m service -a 'name=httpd state=stopped'
# 重新加载服务
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
# 重启服务
ansible all -m service -a 'name=httpd state=restarted'
范例:
功能:管理用户
# 创建用户
# 用户名 描述 uid 家目录 所属组
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
# 用户名 描述 uid 所属组 从属组 shell类型 是否系统账户 是否创建家目录 家目录路径 uid是否唯一
ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'
# remove=yes表示删除用户及家目录等数据,默认remove=no
ansible all -m user -a 'name=nginx state=absent remove=yes'
功能:管理组
#创建组
ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible websrvs -m group -a 'name=nginx state=absent'
功能:相当于sed,可以修改文件内容
# lineinfile是整行替换
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
# 删除#开头的行
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
#添加#
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
#去掉#
ansible all -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用gather_facts: no 来禁止 Ansible 收集 facts 信息
ansible all -m setup #收集服务器详细信息
ansible all -m setup -a "filter=ansible_nodename" #主机全名
ansible all -m setup -a "filter=ansible_hostname" #主机名(部分名称)
ansible all -m setup -a "filter=ansible_os_family" #操作系统家族
ansible all -m setup -a "filter=ansible_domain" #域名
ansible all -m setup -a "filter=ansible_memtotal_mb" #内存总大小
ansible all -m setup -a "filter=ansible_memory_mb" #内存,包含交换分区等
ansible all -m setup -a "filter=ansible_memfree_mb" #剩余内存
ansible all -m setup -a "filter=ansible_distribution_major_version" #操作系统版本号
ansible all -m setup -a "filter=ansible_distribution_version" #小版本号
ansible websrvs -m setup -a "filter=ansible_distribution" #操作系统版本
#返回"ansible_distribution": "CentOS"
ansible all -m setup -a "filter=ansible_processor_vcpus" #cpu个数
ansible all -m setup -a "filter=ansible_all_ipv4_addresses" #多块网卡的所有ip地址
ansible all -m setup -a "filter=ansible_default_ipv4" #默认ip地址
(https://www.ityoudao.cn/posts/ansible-modules-blockinfile/)
playbook是一个yaml语法编写的文本文件,由play和task两部分组成。playbook是由一个或者多个模块组成的,使用多个不同模块,共同完成一件事情。playbook通过yaml语法识别描述的状态文件。
yaml三板斧
缩进:yaml使用一个固定的索引风格表示层级结构,每个缩进由两个空格组成,不能使用tab键
冒号:以冒号结尾的除外,其他所有冒号后面必须要有空格
短横线:表示列表项,使用一个短横线加一个空格作为一个列表项,多个项使用同样的缩进级别作为同一列表
---
- name: Example Playbook
hosts: mygroup
tasks:
- name: Create a file
file:
path: /tmp/example.txt
state: touch
notify:
- Restart Service #完成后触发Restart Service通知
- name: Install a package
package:
name: mypackage
state: present
notify:
- Restart Service
handlers:
- name: Restart Service
service:
name: myservice
state: restarted
roles是ansible1.2版本引入的新特性,用于层次型、结构化的组织playbook,roles能够根据层次型结构自动装载变量文件、tasks任务以及handlers触发等。简单来讲,roles就是通过分别将变量、文件、任务、模板以及处理器放置到单独的目录中,并可以便捷的include他们的一种机制。将一个大的playbook文件,进行分类拆分,达到根据需要复用的目的。
roles/project/ #项目名称,有以下子目录
files/ #存放由copy或script模块等调用的文件
templates/ #template模块查找所需要模板文件的目录
tasks/ #定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
handlers/ #至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
vars/ #定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
meta/ #定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
default/ #设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
#扩展的时候,只需要修改特定目录下的指定文件即可,其他文件不受影响
调用角色方法1:
---
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx
#在websrvs组的主机中安装mysql、memcached、nginx角色
调用角色方法2:键role用于指定角色名称,后续的k/v用于传递变量给角色
---
- hosts: all
remote_user: root
roles:
- mysql
- { role: nginx, username: nginx }
调用角色方法3:
还可基于条件测试实现角色调用
---
- hosts: all
remote_user: root
roles:
- { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }
---
- hosts: websrvs
remote_user: root
roles:
- { role: nginx, tags: [ 'nginx', 'web' ], when: ansible_distribution_major_version == "6" }
#标签tags是httpd或web
- { role: httpd, tags: [ 'httpd', 'web' ] }
- { role: mysql, tags: [ 'mysql', 'db' ] }
- { role: mariadb, tags: [ 'mariadb', 'db' ] }
ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml #执行的时候选择标签执行
ansible_connection: 指定连接类型(如 ssh、winrm)
ansible_user: 指定远程用户
ansible_ssh_pass: 指定远程用户密码
ansible_become: 指定是否切换为超级用户
ansible_become_user: 指定切换到的用户
ansible_become_pass: 指定超级用户密码
ansible_host: 指定远程主机的 IP 或主机名
ansible_port: 指定远程 SSH 端口
ansible_ssh_private_key_file: 指定远程 SSH 私钥文件路径
ansible_python_interpreter: 指定远程 Python 解释器路径
ansible_distribution: 运行目标主机上的发行版名称
ansible_distribution_version: 运行目标主机上的发行版版本号
ansible_architecture: 目标主机的架构类型
ansible_os_family: 运行目标主机上的操作系统家族
ansible_facts: 包含远程主机的事实信息的字典
inventory_hostname: 当前主机的名称
inventory_hostname_short: 当前主机的短名称
ansible_play_name: 当前 Play 的名称
group_names: 当前主机所属的组名列表
ansible_include_tasks: 包含另一个任务文件
ansible_loop: 当前循环迭代的有关信息
ansible_loop.index: 当前循环的索引值(从0开始)
ansible_loop.index0: 当前循环的索引值(从1开始)
ansible_loop.first: 如果是当前循环中的第一次迭代,则为 True
ansible_loop.last: 如果是当前循环中的最后一次迭代,则为 True
ansible_loop.length: 循环中项的总数
ansible_play_hosts: 当前 Play 中的所有主机列表
ansible_play_batch: 当前批次中的主机列表
ansible_limit: 限制执行任务的主机模式
ansible_skip_tags: 跳过带有指定标签的任务
ansible_roles: 当前 Playbook 中包含的所有角色列表
ansible_role_name: 当前任务所属的角色名称
ansible_env: 运行目标主机上的环境变量
ansible_date_time: 包含日期和时间信息的字典
ansible_pid: 远程命令执行时的进程 ID
ansible_job_id: 当前作业ID
ansible_default_ipv4.address: 默认 IPv4 地址
ansible_default_ipv4.gateway: 默认 IPv4 网关
ansible_default_ipv4.netmask: 默认 IPv4 子网掩码
ansible_default_ipv6.address: 默认 IPv6 地址
ansible_default_ipv6.gateway: 默认 IPv6 网关
ansible_default_ipv6.netmask: 默认 IPv6 子网掩码
ansible_mounts: 包含挂载点信息的字典列表
ansible_processor_cores: 处理器核心数
ansible_processor_count: 处理器线程数
ansible_memtotal_mb: 总内存大小(以 MB 为单位)
ansible_distribution_major_version: 发行版的主要版本号
ansible_distribution_release: 发行版的发行代号
ansible_distribution_file_parsed: 解析的发行版文件名
ansible_distribution_file_path: 发行版文件路径
变量
变量的定义如下:
- name: Upload certificates so they are fresh and not expired
command: "{{ bin_dir }}/kubeadm init phase --config {{ kube_config_dir }}/kubeadm-config.yaml upload-certs --upload-certs"
register: kubeadm_upload_cert
- name: Print kubeadm_upload_cert variable
debug:
var: kubeadm_upload_cert
? 打印结果为:
TASK [setup_master : Print kubeadm_upload_cert variable] ********************************************************************************************************************************************************
ok: [10.148.151.130] => {
"kubeadm_upload_cert": {
"changed": true,
"cmd": [
"/usr/local/bin/kubeadm",
"init",
"phase",
"--config",
"/etc/kubernetes/kubeadm-config.yaml",
"upload-certs",
"--upload-certs"
],
"delta": "0:00:00.072302",
"end": "2023-12-13 16:27:00.574421",
"failed": false,
"rc": 0,
"start": "2023-12-13 16:27:00.502119",
"stderr": "",
"stderr_lines": [],
"stdout": "[upload-certs] Storing the certificates in Secret \"kubeadm-certs\" in the \"kube-system\" Namespace\n[upload-certs] Using certificate key:\nfde21b3d2a3aac944e453fc2a2ee0632e7c7bf019fa0feaec273a55fc407c488",
"stdout_lines": [
"[upload-certs] Storing the certificates in Secret \"kubeadm-certs\" in the \"kube-system\" Namespace",
"[upload-certs] Using certificate key:",
"fde21b3d2a3aac944e453fc2a2ee0632e7c7bf019fa0feaec273a55fc407c488"
]
}
}
在终端执行命令:
[root@master1 ~]# kubeadm init phase --config /etc/kubernetes/kubeadm-config.yaml upload-certs --upload-certs
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
3c5e4c6eb78ac530772339aec77eee2666a3ded2b71995b2792cddcd23688d14
主机重装后ssh失败
ssh 10.148.151.143
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:PBgLiMBqAzAS1sQA6ySB1uWCtUx07kHADpUFN7IHprU.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /root/.ssh/known_hosts:4
remove with:
ssh-keygen -f "/root/.ssh/known_hosts" -R "10.148.151.143"
ED25519 host key for 10.148.151.143 has changed and you have requested strict checking.
Host key verification failed.
执行如下即可
ssh-keygen -f "/root/.ssh/known_hosts" -R "10.148.151.143"
从130上把文件同步到其他的主机上
- hosts: kube_control_plane
tasks:
- name: Transfer file from ServerA to ServerB
synchronize:
src: /tmp/sync.txt
dest: /tmp/sync.txt
delegate_to: 10.148.151.130