一、主机清单inventory

 

Inventory 主机清单
1> ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
2> 默认的inventory file为/etc/ansible/hosts
3> inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

 

执行命令测试Ping模块

ansible部署mysql主从 ansible主机清单配置_配置文件

 

 

 发现报错,我们需要修改ansible的配置文件

[root@CentOs ~]# vim /etc/ansible/hosts

最后一行添加node的主机ip地址

ansible部署mysql主从 ansible主机清单配置_vim_02

 

 

这时我们又发现出现问题

ansible部署mysql主从 ansible主机清单配置_ansible部署mysql主从_03

 

 

[root@CentOs ~]# ansible 192.168.93.131 -m ping -k

输入口令,发现收到恢复了

ansible部署mysql主从 ansible主机清单配置_配置文件_04

 

 

也可以给多台主机发送请求,但是不建议这样

[root@CentOs ~]# ansible 192.168.93.131,192.168.93.135 -m ping -k

ansible部署mysql主从 ansible主机清单配置_ansible部署mysql主从_05

 

 

[root@CentOs ~]# ansible all -m ping -k

ansible部署mysql主从 ansible主机清单配置_linux_06

 

二、

/etc/ansible/hosts文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名。
可以将同一个主机同时归并到多个不同的组中;
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
    ntp.magedu.com   不分组,直接加
    
    [webservers]     webservers组
    www1.magedu.com:2222  可以指定端口
    www2.magedu.com
    
    [dbservers]
    db1.magedu.com
    db2.magedu.com
    db3.magedu.com

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
示例:
    [websrvs]
    www[1:100].example.com   ip: 1-100
    
    [dbsrvs]
    db-[a:f].example.com     dba-dbff
   

例如:

 

[root@CentOs ~]# vim /etc/ansible/hosts
[root@CentOs ~]#

ansible部署mysql主从 ansible主机清单配置_配置文件_07

 

 

[root@CentOs ~]# ansible websrvs -m ping -k

 

ansible部署mysql主从 ansible主机清单配置_ansible部署mysql主从_08

 

二、ansible 配置文件

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)

vim /etc/ansible/ansible.cfg

[defaults]
#inventory     = /etc/ansible/hosts      # 主机列表配置文件
#library       = /usr/share/my_modules/  # 库文件存放目录
#remote_tmp    = $HOME/.ansible/tmp      # 临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp      # 本机的临时命令执行目录  
#forks         = 5                       # 默认并发数,同时可以执行5次
#sudo_user     = root                    # 默认sudo 用户
#ask_sudo_pass = True                    # 每次执行ansible命令是否询问ssh密码
#ask_pass      = True                    # 每次执行ansible命令是否询问ssh口令
#remote_port   = 22                      # 远程主机的端口号(默认22)

建议优化项:
host_key_checking = False               # 检查对应服务器的host_key,建议取消注释

ansible部署mysql主从 ansible主机清单配置_配置文件_09

 

 

[root@CentOs ~]# vim /etc/ansible/ansible.cfg
[root@CentOs ~]# cd .ssh/
[root@CentOs .ssh]# ls
known_hosts
[root@CentOs .ssh]# rm -rf known_hosts
[root@CentOs .ssh]# ansible all -m ping -k

ansible部署mysql主从 ansible主机清单配置_ansible_10

 

 

 

log_path=/var/log/ansible.log           # 日志文件,建议取消注释

ansible部署mysql主从 ansible主机清单配置_linux_11

 

 

再执行下此命令

[root@CentOs .ssh]# ansible all -m ping -k

然后查看下日志

ansible部署mysql主从 ansible主机清单配置_ansible_12

 

 

 

三、ansible系列命令

Ansible系列命令
    ansible ansible-doc ansible-playbook ansible-vault ansible-console
    ansible-galaxy ansible-pull

ansible-doc: 显示模块帮助
    ansible-doc [options] [module...]
        -a            显示所有模块的文档
        -l, --list    列出可用模块
        -s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)

示例:
    ansible-doc -l      列出所有模块
    ansible-doc ping    查看指定模块帮助用法
    ansible-doc -s ping 查看指定模块帮助用法

 

ansible部署mysql主从 ansible主机清单配置_配置文件_13

 

 

ansible

 

ansible通过ssh实现配置管理、应用部署、任务执行等功能,
建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args]
ansible +被管理的主机(ALL) +模块  +参数
    --version              显示版本
    -m module              指定模块,默认为command
    -v                     详细过程 –vv -vvv更详细
    --list-hosts           显示主机列表,可简写 --list
    -k, --ask-pass         提示输入ssh连接密码,默认Key验证
    -C, --check            检查,并不执行
    -T, --timeout=TIMEOUT  执行命令的超时时间,默认10s
    -u, --user=REMOTE_USER 执行远程执行的用户
    -b, --become           代替旧版的sudo切换
        --become-user=USERNAME 指定sudo的runas用户,默认为root

 

[root@CentOs ~]# ansible dbsrvs -u root -k -m command -a 'ls /root'
SSH password:
192.168.93.134 | CHANGED | rc=0 >>
anaconda-ks.cfg
192.168.93.131 | CHANGED | rc=0 >>
anaconda-ks.cfg
[root@CentOs ~]#

 

    -K, --ask-become-pass  提示输入sudo时的口令

 

ansible all --list  列出所有主机
ping模块: 探测网络中被管理主机是否能够正常使用  走ssh协议
          如果对方主机网络正常,返回pong
ansible-doc -s ping   查看ping模块的语法

检测所有主机的网络状态
1>  默认情况下连接被管理的主机是ssh基于key验证,如果没有配置key,权限将会被拒绝
    因此需要指定以谁的身份连接,输入用户密码,必须保证被管理主机用户密码一致
    ansible all -m ping -k

2> 或者实现基于key验证 将公钥ssh-copy-id到被管理的主机上 , 实现免密登录
   ansible all -m ping

 

ansible部署mysql主从 ansible主机清单配置_配置文件_14

 

 

ansible部署mysql主从 ansible主机清单配置_ansible_15

 

 

以此类推,其他主机上都复制上去!

 

ansible部署mysql主从 ansible主机清单配置_配置文件_16

 

 

直接实现免密登录!

 

ansible的Host-pattern

ansible的Host-pattern
匹配主机的列表
    All :表示所有Inventory中的所有主机
        ansible all –m ping
    * :通配符
        ansible "*" -m ping  (*表示所有主机)
        ansible 192.168.1.* -m ping
        ansible "*srvs" -m ping
    或关系 ":"
        ansible "websrvs:appsrvs" -m ping
        ansible “192.168.1.10:192.168.1.20” -m ping
    逻辑与 ":&"
        ansible "websrvs:&dbsrvs" –m ping
        在websrvs组并且在dbsrvs组中的主机
    逻辑非 ":!"
        ansible 'websrvs:!dbsrvs' –m ping
        在websrvs组,但不在dbsrvs组中的主机
        注意:此处为单引号
    综合逻辑
        ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping
    正则表达式
        ansible "websrvs:&dbsrvs" –m ping
        ansible "~(web|db).*\.magedu\.com" –m ping

 

ansible部署mysql主从 ansible主机清单配置_vim_17

 

 

ansible命令执行过程

ansible命令执行过程
    1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2. 加载自己对应的模块文件,如command
    3. 通过ansible将模块或命令生成对应的临时py文件,
       并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
    4. 给文件+x执行
    5. 执行并返回结果
    6. 删除临时py文件,sleep 0退出

执行状态:
    绿色:执行成功并且不需要做改变的操作
    黄色:执行成功并且对目标主机做变更
    红色:执行失败

 

ansible常用模块

模块文档:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

1、Command:在远程主机执行命令,默认模块,可忽略-m选项
    > ansible srvs -m command -a 'service vsftpd start'
    > ansible srvs -m command -a 'echo adong |passwd --stdin 123456'
  此命令不支持 $VARNAME < > | ; & 等,用shell模块实现

    chdir:   进入到被管理主机目录
    creates: 如果有一个目录是存在的,步骤将不会运行Command命令

 

ansible部署mysql主从 ansible主机清单配置_vim_18

 

 

 

   [root@CentOs ~]# ansible all -a 'chdir=/boot ls'

ansible部署mysql主从 ansible主机清单配置_linux_19

 

 

 

2、Shell:和command相似,用shell执行命令

   (1) ansible all -m shell  -a 'getenforce'  查看SELINUX状态

例如:

[root@CentOs ~]# ansible 192.168.93.* -m shell -a 'echo $HOSTNAME'

ansible部署mysql主从 ansible主机清单配置_配置文件_20

 

 

   (2) ansible all -m shell  -a "sed -i 's/SELINUX=.*/SELINUX=disabled' /etc/selinux/config"

 

   (3) ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
      

    调用bash执行命令 类似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt     
    这些复杂命令,即使使用shell也可能会失败,
    解决办法:写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器

    修改配置文件,使shell作为默认模块    
        vim /etc/ansible/ansible.cfg
        module_name = shell

 

3、Script:在远程主机上运行ansible服务器上的脚本
    > -a "/PATH/TO/SCRIPT_FILE"
    > ansible websrvs -m script -a /data/test.sh

例如:

 

ansible部署mysql主从 ansible主机清单配置_配置文件_21

 

 

 

4、Copy:从主控端复制文件到远程主机
      src : 源文件  指定拷贝文件的本地路径  (如果有/ 则拷贝目录内容,比拷贝目录本身)
      dest: 指定目标路径
      mode: 设置权限
      backup: 备份源文件
      content: 代替src  指定本机文件内容,生成目标主机文件

 

(1)ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.showner=wang mode=600 backup=yes"
        如果目标存在,默认覆盖,此处指定先备份
 (2) ansible websrvs -m copy -a "content='test content\nxxx' dest=/tmp/test.txt"
        指定内容,直接生成目标文件

 

例如:

[root@CentOs ansible]# ansible all -a 'getenforce'
192.168.93.134 | CHANGED | rc=0 >>
Enforcing
192.168.93.131 | CHANGED | rc=0 >>
Enforcing
192.168.93.135 | CHANGED | rc=0 >>
Enforcing
[root@CentOs ansible]# cp /etc/sysconfig/selinux .
[root@CentOs ansible]# vim selinux

 

ansible部署mysql主从 ansible主机清单配置_配置文件_22

 

 

 [root@CentOs ansible]# ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'

ansible部署mysql主从 ansible主机清单配置_vim_23

 

 

ansible部署mysql主从 ansible主机清单配置_ansible部署mysql主从_24

 

 

ansible部署mysql主从 ansible主机清单配置_vim_25

 

 

[root@CentOs ansible]# ansible all -m shell -a 'getenforce'
192.168.93.134 | CHANGED | rc=0 >>
Disabled
192.168.93.131 | CHANGED | rc=0 >>
Disabled
192.168.93.135 | CHANGED | rc=0 >>
Disabled

[root@CentOs ansible]# ansible all -m copy -a 'content="hello\nthanks\n" dest=/data/f2'

[root@CentOs ansible]# ansible all -m command -a 'cat /data/f2'
192.168.93.135 | CHANGED | rc=0 >>
hello
thanks
192.168.93.134 | CHANGED | rc=0 >>
hello
thanks
192.168.93.131 | CHANGED | rc=0 >>
hello
thanks
[root@CentOs ansible]#

5、Fetch:从远程主机提取文件至主控端,copy相反,目前不支持目录,可以先打包,再提取文件
     > ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
     会生成每个被管理主机不同编号的目录,不会发生文件名冲突
     
     > ansible all -m shell -a 'tar jxvf test.tar.gz /root/test.sh'
     > ansible all -m fetch -a 'src=/root/test.tar.gz dest=/data/'

例如:

[root@CentOs /]# ansible all -m fetch -a 'src=/var/log/messages dest=/data'


ansible部署mysql主从 ansible主机清单配置_配置文件_26

 

 

 

[root@CentOs /]# tree /data/
/data/
├── 192.168.93.131
  └── var
       └── log
           └── messages
├── 192.168.93.134
  └── var
       └── log
          └── messages
└── 192.168.93.135
    └── var
        └── log
            └── messages

9 directories, 3 files
[root@CentOs /]#

 

如果想要抓取以.log结尾的文件怎么办?

先把这些文件打个包,然后抓取包就可以了!

[root@CentOs /]# ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'

ansible部署mysql主从 ansible主机清单配置_ansible_27

 

 

 

[root@CentOs /]# ansible all -m fetch -a 'src=/root/log.tar.xz dest=/data'

ansible部署mysql主从 ansible主机清单配置_配置文件_28

 

 

 

[root@CentOs /]# tree /data/
/data/
├── 192.168.93.131
   ├── root
      └── log.tar.xz
  └── var
      └── log
          └── messages
├── 192.168.93.134
  ├── root
     └── log.tar.xz
  └── var
      └── log
         └── messages
└── 192.168.93.135
    ├── root
       └── log.tar.xz
    └── var
        └── log
            └── messages

12 directories, 6 files
[root@CentOs /]# cd /data/192.168.93.131
[root@CentOs 192.168.93.131]# cd root/
[root@CentOs root]# ls
log.tar.xz
[root@CentOs root]# tar tvf log.tar.xz
-rw------- root/root      8634 2022-09-26 16:32 var/log/boot.log
-rw------- root/root      1454 2022-09-29 16:43 var/log/vmware-network.1.log
-rw------- root/root      1154 2022-09-29 16:43 var/log/vmware-network.2.log
-rw------- root/root      1454 2022-09-26 16:47 var/log/vmware-network.3.log
-rw------- root/root      1155 2022-09-26 14:53 var/log/vmware-network.4.log
-rw------- root/root      1455 2022-09-25 22:01 var/log/vmware-network.5.log
-rw------- root/root      1154 2022-09-25 20:55 var/log/vmware-network.6.log
-rw------- root/root      1454 2022-09-25 17:42 var/log/vmware-network.7.log
-rw------- root/root      1154 2022-09-25 17:10 var/log/vmware-network.8.log
-rw------- root/root      1454 2022-09-24 17:22 var/log/vmware-network.9.log
-rw------- root/root      1154 2022-09-30 09:50 var/log/vmware-network.log
-rw------- root/root      3111 2022-08-21 10:30 var/log/vmware-vmsvc.log
-rw------- root/root     14947 2022-09-30 09:50 var/log/vmware-vmsvc-root.log
-rw------- root/root      1316 2022-09-26 16:32 var/log/vmware-vmtoolsd-root.log
-rw------- root/root     13463 2022-08-21 10:46 var/log/yum.log
[root@CentOs root]#

6、File:设置文件属性
    path: 要管理的文件路径 (强制添加)
    recurse: 递归,文件夹要用递归
    src:  创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接,硬链接
    state: 状态
          absent 缺席,删除
          
    > ansible websrvs -m file -a 'path=/app/test.txt state=touch'       创建文件
    > ansible websrvs -m file -a "path=/data/testdir state=directory"   创建目录    
    > ansible websrvs -m file -a "path=/root/test.sh owner=wang mode=755"  设置权限755
    > ansible websrvs -m file -a 'src=/data/testfile dest=/data/testfile-link state=link' 创建软链接