# Ansible快速入门教程
https://abc.htmltoo.com/thread-45641.htm
# Ansible中文权威指南
https://abc.htmltoo.com/thread-45083.htm
# Devops之Ansible大规模主机部署
https://abc.htmltoo.com/thread-45928.htm
1.免密码登录
a.环境三台centos7主机:
master:192.168.101.14,node1:192.168.101.15,node2:192.168.101.19,
利用master节点为两个node节点安装docker以及docker-compose
b.首先在master上安装ansible,这里采用yum安装(epel中包含ansible,安装之前添加epel源)
ansible基于ssh密钥认证,于是使用master给两个node进行ssh认证:
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.101.15
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.101.19
c.给两个node节点配置hosts:
[root@docker ansible]# egrep -v "^#|^$" hosts # vi /etc/ansible/hosts
[app]
192.168.101.15
192.168.101.19
vi /etc/ansible/ansible.cfg
......
remote_port = 22 #ssh端口号默认22,如果改的话ssh配置的端口号也得改
......
private_key_file = /root/.ssh/id_rsa #私钥文件路径
host_key_checking = False #默认是注释的,打开注释即可
ansible app -m ping # ansible连通性测试
ansible app -m command -a 'uptime' # 执行命令测试
# ansible常用命令
ansible all -m ping #查看client端是否正常ping通
ansible app -m setup #查看客户端信息
ansible app -m copy -a 'src=/root/git_test/code.txt dest=/root/test' #copy文件到client端
ansible app -m user -a "name=test state=present" #创建test用户
ansible app -m user -a "name=test state=absent" #删除test用户
ansible app -m yum -a 'name=epel-relese state=latest' #yum安装
ansible app -m systemd -a 'name=httpd state=stopped enabled=no' #停止httpd服务
ansible app -m script -a '/tmp/test,sh' #运行脚本
ansible app -m command 'date' #查看时间
e.查看app组-主机
ansible app --list
# 一台目标主机
ansible 192.168.1.31 -m ping
# 多台目标主机
ansible 192.168.1.31,192.168.1.32 -m ping
# 所有目标主机
ansible all -m ping
# 匹配app组中有,但是nginx组中没有的所有主机
ansible 'app:!nginx' -m ping -o
# 匹配apache组和nginx组中都有的机器(并集)
ansible 'app:&nginx' -m ping -o
# 匹配app组nginx组两个组所有的机器(并集);等于ansible app,nginx -m ping
ansible 'app:nginx' -m ping -o
3.安装,测试
yum install epel-release -y
yum install ansible -y
ansible --version
ansible app -m command -a 'uptime'
ansible all --list-hosts
ansible all -m ping
ansible app -m ping
4.配置好daemon.json
cat /etc/docker/daemon.json
{
"max-concurrent-downloads": 5,
"max-concurrent-uploads": 3,
"insecure-registries":["hub.htmltoo.com:5000"],
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
5.部署基础环境
cat /opt/playbook/base.yaml
---
- hosts: app #定义的主机组,即应用的主机
remote_user: root # 远程用户为root
tasks:
- name: mkdir ssh dir #开始使用密码部署,需要安装sshpass
shell: mkdir -p /root/scripts/.ssh
- name: copy ssh file
# src:本地文件.., dest:远程主机.., group=root owner=root mode=0644,
# backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no ...
copy: src=/root/scripts/.ssh/authorized_keys dest=/root/.ssh/authorized_keys
- name: rsync scripts #传输秘钥后可以实现rsync传输
synchronize: src=/root/scripts dest=/root rsync_opts=-avuz # rsync增量传输
- name: install base
shell: sh /opt/shell/init.sh
ansible-playbook base.yaml --syntax-check # 语法验证
ansible-playbook base.yaml # 实行
6.部署容器环境
cat /opt/playbook/docker.yaml
---
- hosts: app #定义的主机组,即应用的主机
remote_user: root # 远程用户为root
tasks:
- name: install docker
shell: sh /opt/shell/Ansible-docker.sh
- name: file transfer
synchronize: src=/etc/docker/daemon.json dest=/etc/docker/daemon.json rsync_opts=-avuz # rsync增量传输
notify: #上一个任务的运行状态为changed后触发,否则不触发
- restart docker
handlers:
- name: restart docker
service: name=docker enabled=yes daemon_reload=yes state=restarted
ansible-playbook docker.yaml --syntax-check # 语法验证
ansible-playbook docker.yaml # 实行
# cat docker_install.yaml
---
- hosts: kubernetes #定义的主机组,即应用的主机
remote_user: root # 远程用户为root
vars:
project_directory: /opt/docker/ansible_playbooks
tasks:
- name: docker install
shell: sudo yum install -y yum-utils device-mapper-persistent-data lvm2 rsync telnet apr apr-util zip unzip lrzsz
- shell: sudo yum-config-manager --enable extras # 存在多个相同模块时,后面的木块要加-
- shell: sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- shell: sudo yum makecache fast
- shell: sudo yum -y install docker-ce
- name: docker config dir
shell: sudo mkdir -p /etc/docker
- name: file transfer
synchronize: src=/etc/docker/daemon.json dest=/etc/docker/daemon.json rsync_opts=-avuz # rsync增量传输
notify: #上一个任务的运行状态为changed后触发,否则不触发
- restart docker
handlers:
- name: restart docker
service: name=docker enabled=yes daemon_reload=yes state=restarted
# 检查
ansible node -m command -a "docker -v"
# 模块说明
copy模块:
--- src:本地文件.., dest:远程主机.., group=root owner=root mode=0644,
--- backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no ...
--- copy: src=/root/scripts/.ssh/authorized_keys dest=/root/.ssh/authorized_keys
file模块:
---使用file模块,更改文件的用户和权限
ansible 192.168.1.232 -m file -a "dest=/tmp/a.txtmode=600"
---创建目录,类似mkdir –p
ansible 192.168.1.232 -m file -a"dest=/tmp/to/c mode=755 owner=root group=root state=directory"
---删除文件或者目录
ansible 192.168.1.232 -m file -a"dest=/tmp/a.txt state=absent"
cron模块:
---首先我们在本地的/etc/ansible/目录下定义一个cron.yml文件
- hosts: 192.168.1.232 #远程主机IP
remote_user: root #指定执行的用户
tasks: #任务
- name: cron #任务名称
cron: name='cp file' minute=1job='/usr/bin/tmp/script/test.sh'
提示:name 为注释名称,minute为执行任务的时间间隔,job为执行的脚本
---定义好之后,我们执行下ansible-playbook命令
[root@ansibleserver ansible]# ansible-playbook cron.yml
PLAY RECAP********************************************************************
192.168.1.232 :ok=2 changed=1 unreachable=0 failed=0
#出现ok=2 change=1,代表已经在远程机子上做好定时任务了
---例子二, 在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间
命令:ansible all-m cron -a 'name="custom job" minute=*/3 hour=* day=* month=*weekday=* job="/usr/sbin/ntpdate 172.16.254.139"'
synchronize模块
---先声明下,使用rsync 模块,远程主机系统必须安装rsync 包,否则无法使用这个模块
ansible 192.168.1.232 -m yum -a 'name=rsync state=latest' # 先给远程机装个rsync
ansible 192.168.1.232 -a "which rsync" # 再次验证下rsync是否安装成功
-ansible-doc -s synchronize # 查看使用的参数
delete # 删除源中没有而目标存在的文件
dest= # 目标地址
dest_port # 目标接受的端口
-将ansible端/tmp/目录下的script同步到232机子的/tmp/目录下面
---ansible 192.168.1.232 -m synchronize -a 'src=/tmp/script dest=/tmp/'
-要想ansible端于远程端的文件保持一致,最好用delete=yes参数
# ansible 用户批量创建与管理
https://abc.htmltoo.com/thread-45932.htm
# 查看docker这个role的内容:
[root@docker docker]# tree
.
├── files 必要的一些需要的文件存放目录
├── handlers
│ └── main.yaml handler处理的动作
├── meta 元数据存放的一些依赖
├── tasks
│ └── main.yaml 主要执行的任务
├── templates
│ └── daemon.json.j2 一些配置文件的存放
└── vars
└── main.yaml 变量设置的存放目录
1.查看tasks/main.yaml:
[root@docker docker]# cat tasks/main.yaml
- name: install required packages
yum:
name: "{{ item }}" 需要进行安装的一些包名
state: present 安装的包的状态
with_items: 对应上面的item(可以循环操作)
- yum-utils
- device-mapper-persistent-data
- lvm2
- name: add docker repo to /etc/yum.repos.d
shell: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
register: result 将shell的操作结果注册为result
- name: install docker-ce
yum:
name: docker-ce
state: present
when: result|success 如果上面的result为success,则该任务执行
- name: create /etc/docker
file:
path: "{{ docker_config_dir }}" 利用file模块进行创建一个目录,引用变量
state: directory
- name: start docker service
systemd: centos7开启服务,添加到启动项
name: docker
state: started
enabled: true
- name: provide docker-ce configfile
template:
src: daemon.json.j2 提供配置文件
dest: /etc/docker/daemon.json
notify: restart docker 配置文件修改了触发通知机制,提醒handler
2.查看handlers/main.yaml:
[root@docker docker]# cat handlers/main.yaml
- name: restart docker
systemd:
name: docker
state: restarted 触发机制后,将服务进行重启
enabled: true
3.查看变量的设置:
[root@docker docker]# cat vars/main.yaml
docker_config_dir: /etc/docker
4.查看template的j2文件:
[root@docker docker]# cat templates/daemon.json.j2
{
"registry-mirrors": ["https://cbd49ltj.mirror.aliyuncs.com"]
}
5.查看docker的work_dir:
[root@docker work_dir]# cat install_docker.yaml
- hosts: container_nodes 对应hosts配置文件的两个节点
remote_user: root 执行使用root用户
roles:
- docker 针对的role名称
6.使用--syntax-check进行语法验证:
[root@docker work_dir]# ansible-playbook install_docker.yaml --syntax-check
playbook: install_docker.yaml
7.使用如下命令进行执行playbook:
[root@docker work_dir]# ansible-playbook install_docker.yaml
三.另一个角色docker-compose这个role的内容:
[root@docker docker-compose]# tree
.
├── files
│ └── docker-compose-Linux-x86_64 # docker-compose的二进制文件
├── handlers
├── meta
├── tasks
│ └── main.yaml
├── templates
└── vars
└── main.yaml
1.由于docker-compose并不需要像服务启动,没有handler机制,查看task:
[root@docker docker-compose]# cat tasks/main.yaml
- name: copy docker-compose-Linux-x86_64 to /usr/local/bin
copy:
src: ../files/docker-compose-Linux-x86_64 # 这里可以使用相对路径,可以使用绝对路径
dest: "{{ docker_compose_dir }}/docker-compose-Linux-x86_64"
- name: install docker-compose
shell: cd "{{ docker_compose_dir }}" && mv docker-compose-Linux-x86_64 docker-compose && chmod +x docker-compose
2.查看变量的设置:
[root@docker docker-compose]# cat vars/main.yaml
docker_compose_dir: /usr/local/bin
3.最后执行的work_dir下面的install_docker-compose:
[root@docker work_dir]# cat install_docker-compose.yaml
- hosts: container_nodes
remote_user: root
roles:
- docker-compose