ansible采用ssh的方式操作远程机器,首先我们需要在ansible所在机器创建一个hosts
文件记录要操作机器的ip。
[root@vm1 ansible-test]# cat hosts
[master]
192.168.178.129
[node]
192.168.178.130
# 设置k8s组包含这俩组
[k8s:children]
master
node
# 设置组中每个ip包含的变量
# 本例中设置了ssh的用户名密码
[k8s:vars]
ansible_ssh_user=root
ansible_ssh_pass=1234
[master]
和[node]
是为一组ip起的名字,同时它们属于[k8s]
组。
然后尝试命令:
[root@vm1 ansible-test]# ansible -i hosts all -m ping
其中,-i
指定了hosts
文件,all
指的是操作目标为hosts中的所有组,也可以写node就只操作node组的ip了,-m
指定模块,本例是ping
模块,即执行ping命令。
继续尝试命令:
[root@vm1 ansible-test]# ansible -i hosts all -a "ls"
该命令让目标机器执行ls
命令。
以上这些只能一次命令执行一个操作,下面介绍ansible-playbook命令,可以一次命令执行多个操作。
创建一个play-test.yml
文件,内容如下:
[root@vm1 ansible-test]# cat play-test.yml
- name: say 'hello world'
hosts: all
tasks:
- name: echo 'hello world'
command: echo 'hello world'
register: result
- name: print stdout
debug: var=result.stdout
其中,tasks
可以包含多个操作,这里第一个操作是输出hello world字符,通过register
将命令echo 'hello world'
的输出结果记录到了变量result
中。第二个命令是将变量result
打印出来,不然命令输出结果是不显示的。
执行该脚本:
[root@vm1 ansible-test]# ansible-playbook -i hosts play-test.yml
当我们需要操作的机器越来越多,执行的命令也越来越多,为了方便管理和增强复用性,可以使用roles。
[root@vm1 ansible-test]# mkdir roles && cd roles
[root@vm1 roles]# ansible-galaxy init test-role
- test-role was created successfully
[root@vm1 roles]# tree .
.
└── test-role
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
9 directories, 8 files
在roles
目录下可以包含多个我们创建的role,各个role去做各自的操作方便管理,这里用了ansible-galaxy init test-role
直接初始化了一个名为test-role
的role,目录结构含义可以百度,这里关心tasks
里的main.yml
即可,它是整个role的主入口,修改它的内容:
[root@vm1 ansible-test]# cat roles/test-role/tasks/main.yml
# shell module可以执行shell命令
- name: shell command
shell: ls -a /home
# copy module类似scp命令,传文件
- name: copy file, like scp
copy:
src: /home/test.yml
dest: /tmp/test/
owner: root
group: root
mode: 0644
# file module可以创建或者修改文件/文件夹属性
- name: mkdir
file:
path: /tmp/file-mkdir-test
state: directory
owner: root
group: root
mode: 0700
# service module类似service命令,管理服务
- name: stop firewall
service:
name: firewalld
state: stopped
enabled: no
# lineinfile module可以Manage lines in text files
# 在/etc/hosts文件里用"hahaha"取代开头为"666.666"的一行。
- name: set 666.666 as hahaha
lineinfile:
dest: /etc/hosts
regexp: '^666\.666'
line: 'hahaha'
各个操作都有name
,以及对应的模块的关键字。
在roles
目录的同级创建文件play-role-test.yml
,内容如下:
[root@vm1 ansible-test]# cat play-role-test.yml
- hosts: node
roles:
- test-role
该文件指定了操作对象为hosts
文件中的node
组,使用的role是test-role
。
然后执行即可:
[root@vm1 ansible-test]# ansible-playbook -i hosts play-role-test.yml