Ansible搭建及配置使用
一、ansible的搭建及配置
1、wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
2、yum clean all && yum makecache
3、yum install ansible -y
4、ansible --version
二、配置设定免密登录及验证
1、vim /etc/ansible/hosts
[node1]
192.168.243.129
2、ssh-keygen -t rsa 生成秘钥
3、cd /root/.ssh/ && ssh-copy-id -i id_rsa.pub root@192.168.243.129 将密码分发给对应的主机
4、ssh root@192.168.243.129 验证无需输密码登录
5、ansible node1 -m ping 测试查看管理的主机通不通
192.168.243.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
三、ansible常用模块
1、shell模块sudo的使用
ansible node01 -m shell -a "ls /root" -u lihu -k --become --become-user root -K #-u是指用哪个用户连入node01 --become-user是指提权root用户 -K是输入的lihu用户的密码
2、copy模块
ansible node01 -m copy -a "src=nginx-1.13.7.tar.gz dest=/tmp" && ansible node01 -m shell -a "ls /tmp" #copy及查看
3、file模块(在目标主机创建文件)
ansible node01 -m file -a "path=/tmp/a mode=600 state=touch" #创建一个文件,权限为600
ansible node01 -m file -a "path=/tmp/abc mode=600 state=directory" #创建一个目录,权限为600
ansible node01 -m file -a "path=/tmp/a mode=600 state=absent" #absent删除文件或目录
4、yum模块
ansible node01 -m yum -a "name=nginx state=present" #yum安装nginx
ansible node01 -m yum -a "name=nginx state=absent" #卸载nginx
5、user模块(添加删除用户)
ansible node01 -m user -a "name=foo password=123456 shell=/sbin/nologin" #添加用户设定不能登录
ansible node01 -m user -a "name=foo state=absent" #删除用户
6、git模块(拉取一些源代码)
ansible node01 -m git -a "repo=https://github.com/ansible/ansible.git dest=/tmp/ansible" #node01主机上要有git命令
7、service模块
ansible node01 -m service -a "name=memcached state=started(stopped restarted reloaded)" #启动服务
ansible node01 -m service -a "name=memcached enabled=true)" #设定服务开机启动
8、setup模块
ansible node01 -m setup -a "filter=ansible_*_mb" #查询目标主机的相关参数通过filter过滤出相关信息
四、ansible Playbook语法
1、Playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,即使用模板语法的文件,比如配置文件等
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
2、创建playbook文件及相关解释
[root@ansible ~]# cat playbook01.yml
--- #固定格式 - hosts: node1 #定义需要执行主机 remote_user: root #远程用户 vars: #定义变量 http_port: 8088 #变量 tasks: #定义一个任务的开始 - name: create new file #定义任务的名称 file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情 - name: create new user user: name=test02 system=yes shell=/sbin/nologin - name: install package yum: name=httpd - name: config httpd template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用 - restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致 - name: copy index.html copy: src=/var/www/html/index.html dest=/var/www/html/index.html - name: start httpd service: name=httpd state=started handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作 - name: restart apache #要与notify定义的内容相同 service: name=httpd state=restarted #触发要执行的动作
3、ansible-playbook的用法 (执行yml文件)
ansible-playbook playbook01.yml -C
ansible-playbook playbook01.yml -v
[root@ansible PlayBook]# ansible-playbook -h
ansible-playbook常用选项:
--check or -C \\只检测可能会发生的改变,但不真正执行操作
--list-hosts \\列出运行任务的主机
--list-tags \\列出playbook文件中定义所有的tags
--list-tasks \\列出playbook文件中定义的所以任务集
--limit \\主机列表 只针对主机列表中的某个主机或者某个组执行
-f \\指定并发数,默认为5个
-t \\指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v \\显示过程 -vv -vvv更详细
4、ansible-doc的用法
[root@ansible ~]# ansible-doc -l \\列出所有模块
[root@ansible ~]# ansible-doc modulename \\查询某个模块使用方法
[root@ansible ~]# ansible-doc -s modulename \\查询某个模块使用方法 (以简洁的方式)
5、playbook结合notify handlers及meta的用法
--- - hosts: node01 tags: mkd tasks: - name: task1 tags: t1,tag1 #设定标签,多个标签名可以用逗号隔开 file: path: /tmp/testfile1 state: directory notify: #task1结束后触发notify,如果task1没有任何changed改变将不会触发handlers任务 - handler1 - meta: flush_handlers #默认从上至下依次执行,如遇meta,将meta前的任务执行完跳转去执行对应调用的handler任务 - name: task2 file: path: /tmp/testfile2 state: directory notify: - handler2 handlers: #和tasks任务平级 - name: handler1 listen: handler group1 #可将handler任务加到相同的组内,task下通过nofify调用组名来触发执行多个handler任务 file: path: /tmp/testfile1/task1.txt state: touch - name: handler2 file: path: /tmp/testfile2/task2.txt state: touch
ansible-playbook --tags=t1 mkdir.yml #执行标签为t1的任务
ansible-playbook --skip-tags=t1 mkdir.yml #执行跳过标签为t1的任务
ansible-playbook --tags tagged mkdir.yml #只执行有标签的任务,没有任何标签的任务不会被执行
ansible-playbook --skip-tags tagged mkdir.yml #执行跳过包含标签的任务,即使对应的任务包含always标签,也会被跳过
ansible-playbook --tags untagged mkdir.yml #只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行
ansible-playbook --skip-tags untagged mkdir.yml #执行跳过没有标签的任务
注:当tags写在play中而非task中时,play中的所有task会继承当前play中的tags,同时还有拥有自己的标签。
ansible-playbook --tags=mkd mkdir.yml
6、示例,批量创建用户
vim useradd.yml
--- - hosts: node1 become: yes vars: user_list: ['lihu11','lihu22','lihu33'] tasks: - name: create user user: name: "{{ item }}" password: "{{ '123456'| password_hash('sha512') }}" state: present with_items: - "{{ user_list }}"
示例,搭建nginx
--- - hosts: node01 vars: username: LIHU tasks: - name: Add repo yum_repository: name: nginx description: nginx repo baseurl: http://nginx.org/packages/centos/7/$basearch/ gpgcheck: no enabled: 1 - name: Install nginx yum: name: nginx state: latest - name: Copy nginx configuration file copy: src: /root/myplaybook/site.conf dest: /etc/nginx/conf.d/site.conf - name: Start nginx service: name: nginx state: started - name: create wwwroot directory file: dest: /var/www/html state: directory - name: create test page index.html shell: echo "hello {{username}}" > /var/www/html/index.html