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