ansible配置与说明

一、ansibles配置与测试

1、ansible的安装配置

利用公钥批量管理

[root@LB02 ~]# ssh-keygen -t rsa #创建公钥
[root@LB02 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.11.206 #将公钥拷贝到管理主机中.ssh/authorized_keys文件中,实现免密码登录远程管理主机
[root@LB02 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.11.207 #将公钥拷贝到管理主机中.ssh/authorized_keys文件中,实现免密码登录远程管理主机
注: 如果在生成密钥的时候设置了密码,ansible每次执行命令的时候,都会提示输入密钥密码,可通过下面的命令记住密码。
ssh-agent bash
ssh-add ~/.ssh/id_rsa

2、控制端安装ansible程序

在线安装:

[root@LB02 ~]# yum install epel-release -y
[root@LB02 ~]# yum install ansible -y

离线安装:

[root@LB02 ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@LB02 ~]# yum install ansible -y

3、配置ansible

[root@LB02 ~]# vim /etc/ansible/hosts
[web01]  #客户端主机名
192.168.11.206 #客户端IP地址

[web02]
192.168.11.207

[web:children]
web01
web02

4、验证ansible,通过ssh端口探测通信

[root@LB02 ~]# ansible web -m ping  #能正常ping通客户端所有主机
192.168.11.206 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.11.207 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

5、测试

[root@LB02 ~]# ansible web --list-hosts #查看所有连接主机正常
  hosts (2):
    192.168.11.206
    192.168.11.207

6、查看命令

[root@LB02 ~]# ansible --version        #查看版本;
[root@LB02 ~]# ansible -doc -s -l       #查看所有的模块说明;
[root@LB02 ~]# ansible -dos -s command  #查看command模块参数;

二、ansible命令语法格式及模块

1.command 执行命令(chdir,creates,removes)

[root@LB02 ~]# ansible web -m command -a "df -h"
[root@LB02 ~]# ansible web -m command -a "hostname"
[root@LB02 ~]# ansible web -m command -a "systemctl start vsftpd"
[root@LB02 ~]# ansible web -m command -a "chdir=/tmp pwd"
[root@LB02 ~]# ansible web -m command -a "creates=/tmp ls /etc/passwd" #利用creates,表示/tmp文件存在,则不执行后面的操作;
[root@LB02 ~]# ansible web -m command -a "creates=/tmpone ls /etc/passwd" #利用creates,表示/tmpone不存在,则执行后面的操作。
[root@LB02 ~]# ansible web -m command -a "removes=/tmp ls /etc/passwd" #removes与creates相反,/tmp文件存在,则执行后面的操作。
[root@LB02 ~]# ansible web -m command -a "removes=/tmpone ls /etc/passwd" #removes与creates相反,/tmp文件不存在,则不执行后面的操作。

2.shell 执行命令,可配合使用管道命令

[root@LB02 ~]# ansible web -m shell -a "ifconfig|grep ens33" 
[root@LB02 ~]# ansible web -m shell -a "ls /tmp"

3.yum 安装软件模块

参数  说明
name  指定要安装的软件包名称
state  指定使用yum的方法

installed,present 

安装软件包

removed,absent 

移除软件包
latest   安装最新软件包
[root@LB02 ~]# ansible web -m yum -a "name=httpd state=installed"  #所有客户端安装httpd服务;
[root@LB02 ~]# ansible web -m yum -a "name=httpd state=removed" #所有客户端卸载httpd服务; 
[root@LB02 ~]# ansible web -m yum -a "list=installed" #列出所有已安装的软件包

4.copy 配置模块

参数

说明
src 推送数据的源文件信息
dest 推送数据的目标路径
backup 对推送传输过去的文件,进行备份
content 直接批量在被管理端文件中添加内容
group 将本地文件推送到远端,指定文件属组信息
owner 将本地文件推送到远端,指定文件属主信息
mode 将本地文件推送到远端,指定文件权限信息
[root@LB02 ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/test.txt owner=www group=www mode=0600" #推送文件模块
[root@LB02 ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes" #在推送覆盖远程端文件前,对远端已有文件进行备份
[root@LB02 ~]# ansible web -m copy -a "content='hello' dest=/tmp/hello" #直接向远端文件内写入数据信息,并且会覆盖远端文件内原有数据信息

5.service 启动服务模块

参数

说明
name 定义要启动服务的名称
state 指定服务状态是停止或是运行
started 启动
stopped 停止
restarted 重启
reloaded 重载
enabled 是否让服务开启自启动
[root@LB02 ~]# ansible web -m service -a "name=crond state=stopped enabled=yes"

6.user 用户管理

name         指定用户的名字
home         指定用户的家目录
uid          指定用户的uid
group        指定用户的用户组
groups       指定用户的附加组
password     指定用户的密码
shell       指定用户的登录shell
create_home  是否创建用户家目录,默认是yes
remove       删除用户时,指定是否删除家目录
absent     删除用户
[root@LB02 ~]# ansible web -m user -a 'name=hello password="111111"'
[root@LB02 ~]# ansible web -m user -a "name=mysql home=/opt/mysql uid=1007 group=mysql shell=/bin/nologin"
[root@LB02 ~]# ansible web -m user -a "name=mysql state=absent remove=yes"

7.file 创建目录,创建文件,往文件写内容

参数 说明
path 指定远程主机目录或文件信息

recurse

递归授权

directory

在远端创建目录
touch 在远端创建文件
link link或hard表示创建链接文件

absent

表示删除文件或目录
mode 设置文件或目录权限
owner 设置文件或目录属主信息
group 设置文件或目录属组信息
[root@LB02 ~]# ansible web -m file -a "path=/tmp/web state=diretory"
[root@LB02 ~]# ansible web -m file -a "path=/tmp/test state=touch mode=555 owner=root group=root"
[root@LB02 ~]# ansible web -m file -a "src=/tmp/test path=/tmp/test_link state=link"

8.cron 定时任务

[root@LB02 ~]# crontab -l
* * * * *  /bin/sh /server/scripts/test.sh
使用ansible添加一条定时任务
[root@LB02 ~]# ansible web -m cron -a "minute=* hour=* day=* month=* weekday=*  job='/bin/sh /server/scripts/test.sh'"
[root@LB02 ~]# ansible web -m cron -a "job='/bin/sh /server/scripts/test.sh'"
设置定时任务注释信息,防止重复,name设定
[root@LB02 ~]# ansible web -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"
删除相应定时任务
[root@LB02 ~]# ansible web -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent"
注释相应定时任务,使定时任务失效
[root@LB02 ~]# ansible web -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no"

9.mount 挂载

参数

说明
mounted 挂载设备,并将配置写入/etc/fstab
unmounted 卸载设备,不会清除/etc/fstab写入的配置

absent

卸载设备,会清理/etc/fstab写入的配置
fstype 指定挂载文件类型
opts 设定挂载的参数选项信息
path 指定挂载点
[root@LB02 ~]# ansible web -m mount -a "path=/backup src=10.0.0.31:/data fstype=nfs opts=defautls,noatime state=mounted"

10、script 脚本

[root@LB02 ~]# vim ansible_test.sh #创建脚本文件;
#!/bin/bash
echo `hostname`
[root@LB02 ~]# ansible web -m script -a "/root/ansible_test.sh" #所有客户端都执行脚本;

11、setup 查看客户端主机信息

ansible_all_ipv4_addresses          所有的ipv4地址
ansible_all_ipv6_addresses          所有的ipv6地址
ansible_architecture                系统的架构
ansible_date_time                   系统时间
ansible_default_ipv4               系统的默认ipv4地址
ansible_distribution                系统名称
ansible_distribution_file_variety   系统的家族
ansible_distribution_major_version  系统的版本
ansible_domain                      系统所在的域
ansible_fqdn                        系统的主机名
ansible_hostname                    系统的主机名,简写
ansible_os_family                   系统的家族
ansible_processor_cores             cpu的核数
ansible_processor_count             cpu的颗数
ansible_processor_vcpus            cpu的个数
[root@LB02 ~]# ansible web -m setup # 查看系统所有信息
[root@LB02 ~]# ansible web -m setup -a "filter=ansible_all_ipv4_addresses" # filter对系统信息进行过滤

12、group 组管理

name      指定组的名字
gid          指定组的gid

absent 

删除组
present   创建组
[root@LB02 ~]# ansible web -m group -a "name=hello gid=1006"
[root@LB02 ~]# ansible web -m group -a "name=hello state=absent"

13、debug:执行命令过程中打印信息

[root@LB02 ~]# ansible all -m debug -a 'msg="hello world"' #输出“hello world”信息

14、unarchive:将归档文件解压后复制至被管控主机指定路径

示例:将Ansible主机中/software目录下的apache-tomcat-8.5.40.tar.gz解压至所有被管控主机的/usr/local目录下,无需复制apache-tomcat-8.5.40.tar.gz至所有被管控主机
[root@LB02 ~]# ansible all -m unarchive -a 'src=/software/apache-tomcat-8.5.40.tar.gz dest=/usr/local/'

15、reboot:重启被管控主机

[root@LB02 ~]# ansible all -m reboot #重启所有被管控主机

16、systemd:管理服务

示例1:被管控主机192.168.1.144重启httpd服务,并设置开机自启
[root@LB02 ~]# ansible 192.168.1.144 -m systemd -a 'name=httpd.service state=restarted enabled=yes'
备注:
(1)systemd模块仅可用于CentOS 7.x系统
(2)参数state的可选值包括started、stopped、restarted和reloaded
示例2:被管控主机192.168.1.144停止httpd服务,并取消开机自启
[root@LB02 ~]# ansible 192.168.1.144 -m systemd -a 'name=httpd.service state=stopped enabled=no'

17、sysctl:管理sysctl.conf

示例:将所有被管控主机中/etc/sysctl.conf文件的net.ipv4.ip_forward值设置为1
[root@LB02 ~]# ansible all -m sysctl -a 'sysctl_file=/etc/sysctl.conf name=net.ipv4.ip_forward value=1 reload=yes state=present'

18、selinux:改变SELinux的策略和状态

[root@LB02 ~]#  ansible all -m selinux -a 'state=disabled'  #所有被管控主机禁用SELinux

19、stat:检索文件或者文件系统的状态

示例:获取所有被管控主机中/etc/fstab文件的状态信息,包括atime、ctime、mtime、uid、gid、inode、mode、md5等
[root@LB02 ~]# ansible all -m stat -a 'path=/etc/fstab get_checksum=yes checksum_algorithm=md5'
备注:参数checksum_algorithm的可选值包括md5、sha1、sha224、sha256、sha384和sha512

20、replace:使用向后引用的正则表达式替换文件中特定字符串的所有实例

示例:将被管控主机192.168.1.144中/tmp/test.txt文件内的HELLOWORLD全部替换成helloworld
[root@LB02 ~]# cat /tmp/test.txt
HELLOWORLD
helloworld
HELLOworld
helloWORLD
[root@LB02 ~]# ansible 192.168.1.144 -m replace -a 'path=/tmp/test.txt regexp=HELLOWORLD replace=helloworld backup=yes'

21、lineinfile:管理文本文件中的行

示例:将所有被管控主机中/etc/selinux/config文件内的SELinux的值设置为disabled
[root@LB02 ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled" state=present backup=yes'

22、blockinfile:插入/更新/删除由标记线包围的文本块

示例1:在所有被管控主机中/tmp/service.txt文件的开头插入一行“hello world”
[root@LB02 ~]# cat /tmp/service.txt
111111
222222
333333
[root@LB02 ~]# ansible all -m blockinfile -a 'path=/tmp/service.txt block="hello world" marker="#{mark} test echo" insertbefore=BOF state=present backup=yes'
备注:BOF --> Begin Of File
示例2:在所有被管控主机中/tmp/test.txt文件的末尾插入一行“welcome home”
[root@LB02 ~]# cat /tmp/test.txt
111111
222222
333333
[root@LB02 ~]# ansible all -m blockinfile -a 'path=/tmp/test.txt block="welcome home" marker="#{mark} test" insertafter=EOF state=present backup=yes'
备注:EOF --> End Of File,默认操作就是将文本块插入到文档的末尾,可以不加参数EOF
示例3:在所有被管控主机中/tmp/script.sh文件的“#!/bin/sh”开头的行后插入HELLO WORLD
[root@LB02 ~]# cat /tmp/script.sh
#!/bin/sh
#Licensed to the Apache Software Foundation (ASF) under one or more
[root@LB02 ~]# ansible all -m blockinfile -a 'path=/tmp/script.sh block="HELLO WORLD" marker="#{mark} test reg" insertafter="^#!/bin/sh" state=present backup=yes'

23、template:将模板文件复制至被管控主机

示例:将redis模板文件redis.conf.j2复制至所有被管控主机
[root@LB02 ~]# ansible all -m template -a 'src=redis.conf.j2 dest=/etc/redis.conf owner=redis group=root mode=0640 backup=yes'

24、fetch:从被管控主机拉取文件至Ansible主机

示例:将被管控主机中的/software/test.txt文件复制至本地Ansible主机的/tmp目录中
[root@LB02 ~]# ansible all -m fetch -a 'src=/software/test.txt dest=/tmp/'
备注:
(1)被管控主机中文件/software/test.txt必须事先存在
(2)参数src中指定的必须是文件,不能是目录
(3)如果被管控主机在hosts文件中定义了主机别名,则Ansible主机本地保存的文件路径为:/tmp/被管控主机别名/software/test.txt;如果直接定义了IP地址,则路径为:/tmp/被管控主机IP/software/test.txt

25、yum_repository:增加或删除yum仓库

示例:在所有被管控主机中创建如下yum仓库
[root@LB02 ~]# cat /etc/yum.repos.d/MariaDB.repo   //仓库名称由file参数定义
[mariadb]                                           //由name参数定义
name=MariaDB Repo                         //description参数定义
baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1
[root@LB02 ~]# ansible all -m yum_repository -a 'file=MariaDB name=mariadb description="MariaDB Repo" baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/ gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=yes enabled=yes owner=root group=root mode=0644 state=present'

26、mysql_user:增加或删除MySQL数据库中的用户

示例:在被管控主机的MySQL数据库中通过root@localhost用户,密码123456,增加testuser@%用户,密码654321,并对所有库的所有表拥有任何权限
[root@LB02 ~]# ansible all -m mysql_user -a 'login_host=localhost login_user=root login_password=123456 name=testuser host="%" password=654321 priv=*.*:all state=present'

三、ansible playbook

1. ansible变量-shell命令模块

[root@LB02 ~]# vim /etc/ansible/test.yml

---   #固定格式开头
- hosts: web    #目标主机列表,可以是单台主机
  remote_user: root   #指定用什么用户登录远程主机执行操作
  tasks:
    - name: test_ansibleplay #任务描述,会打印出来
      shell: /bin/touch /tmp/ansible_test03.txt  #具体任务

执行ansible playbook

[root@LB02 ~]# cd /etc/ansible/  #进入目录
[root@LB02 ansible]# ansible-playbook test.yml #执行命令,下面显示已经成功

PLAY [web] ************************************************************************************

TASK [Gathering Facts] ************************************************************************
ok: [192.168.11.206]
ok: [192.168.11.207]

TASK [test_ansibleplay] ***********************************************************************
[WARNING]: Consider using the file module with state=touch rather than running 'touch'.  If
you need to use command because file 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.

changed: [192.168.11.206]
changed: [192.168.11.207]

PLAY RECAP ************************************************************************************
192.168.11.206             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.11.207             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.ansible变量-user命令模块

[root@LB02 ~]# vim /etc/ansible/create_user.yml 

---
- name: create_user
  hosts: web01
  gather_facts: false #是否启用setup命令模块获取的信息
  vars:
    - user: "test" #var指定user为变量,test为变量的值,需引号
  tasks:
    - name: create user
      user: name="{{ user }}" #name为user命令模块的参数,{{ user }}变量表示形式

执行ansible命令

[root@LB02 ~]# cd /etc/ansible/
[root@LB02 ansible]# ansible-playbook create_user.yml 

PLAY [create_user] ****************************************************************************

TASK [create user] ****************************************************************************
ok: [192.168.11.206]

PLAY RECAP ************************************************************************************
192.168.11.206             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3. file命令模块-ansible循环

[root@LB02 ~]# vim /etc/ansible/loop.yml

---
 - hosts: web02
   user: root
   tasks:
     - name: change mode forfile
       file: path=/tmp/{{ item }} mode=600 owner=root group=root state=touch
       with_items:
       - 1.txt
       - 2.txt

执行ansible命令

[root@LB02 ansible]# ansible-playbook /etc/ansible/loop.yml

PLAY [web01] ************************************************************************************

TASK [Gathering Facts] **************************************************************************
ok: [192.168.11.206]

TASK [change mode for file] *********************************************************************
changed: [192.168.11.206] => (item=1.txt)
changed: [192.168.11.206] => (item=2.txt)

PLAY RECAP **************************************************************************************
192.168.11.206             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
posted @ 2020-01-07 11:50  区域管理员  阅读(644)  评论(0编辑  收藏  举报