# 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



签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回