Ansible手册

Ansible常用命令

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

Ansible配置文件

默认 /etc/ansible/ansible.cfg
stdout_callback 选项可配置输出结果

启用内置回调插件
callback_whitelist=timer,mail,profile_roles,custom_callback
timer 可以计算整个playbook的运行时间
profile_roles在执行中添加用时时间

查看当前可用的回调插件列表
ansible-doc -t callback -l

Ansible常用模块

常用模块帮助文档参考:
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

Ansible errors处理

https://blog.csdn.net/qq_36543595/article/details/124157788

Command 模块

功能:在远程主机执行命令,此为默认模块,可忽略-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'	#未修改

Shell 模块

功能:和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

Script 模块

功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)

ansible websrvs -m script -a '/data/test.sh'

Copy 模块

功能:从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"

Assert模块

wait_for模块

Fetch 模块

功能:从远程主机提取文件至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'

File 模块

功能:删除文件 设置文件属性

# 删除使用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'

authorized_key 模块

功能:分发 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

unarchive 模块

功能:解包解压缩

实现有两种用法:

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'

Archive 模块

功能:打包压缩保存在被管理节点

ansible websrvs -m archive -a 'path=/etc/sysconfig dest=/opt/sys.tar.bz2 format=bz2 owner=haha mode=0600'

Hostname 模块

功能:管理主机名

ansible 192.168.20.22 -m hostname -a 'name=nginx01'

Cron 模块

功能:计划任务

支持时间: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'

Yum 模块

功能:管理软件包,只支持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'

Service 模块

功能:管理服务

# 增加开机启动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'

范例:

User 模块

功能:管理用户

# 创建用户
# 用户名 描述 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'

Group 模块

功能:管理组

#创建组
ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible websrvs -m group -a 'name=nginx state=absent'

Lineinfile 模块

功能:相当于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="^#"'

Replace 模块

该模块有点类似于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 模块

功能: 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地址		

mount模块

selinux模块

blockinfile段落替换模块

(https://www.ityoudao.cn/posts/ansible-modules-blockinfile/)

delegate_to 模块

playbook介绍

简介

playbook是一个yaml语法编写的文本文件,由play和task两部分组成。playbook是由一个或者多个模块组成的,使用多个不同模块,共同完成一件事情。playbook通过yaml语法识别描述的状态文件。

  • play:主要定义要操作的主机或者主机组
  • task:主要定义对主机或者主机组具体执行的任务,可以是一个任务,也可以是多个任务(模块)

yaml三板斧

  • 缩进:yaml使用一个固定的索引风格表示层级结构,每个缩进由两个空格组成,不能使用tab键

  • 冒号:以冒号结尾的除外,其他所有冒号后面必须要有空格

  • 短横线:表示列表项,使用一个短横线加一个空格作为一个列表项,多个项使用同样的缩进级别作为同一列表

notify 和 handlers

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

Ansible Roles目录编排

roles是ansible1.2版本引入的新特性,用于层次型、结构化的组织playbook,roles能够根据层次型结构自动装载变量文件、tasks任务以及handlers触发等。简单来讲,roles就是通过分别将变量、文件、任务、模板以及处理器放置到单独的目录中,并可以便捷的include他们的一种机制。将一个大的playbook文件,进行分类拆分,达到根据需要复用的目的。

Roles各目录作用

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的优先级低

#扩展的时候,只需要修改特定目录下的指定文件即可,其他文件不受影响

playbook调用角色

调用角色方法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' }

roles 中 tags 使用

---
- 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: 发行版文件路径

案例

  1. 变量

    变量的定义如下:

    - 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
    
  2. 主机重装后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"
    
  3. 从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
    

你可能感兴趣的:(linux,运维,服务器)