Ansible_乔大辉子的博客-程序员宅基地

技术标签: linux  

Ansible是什么

Ansible可以实现一条命令完成多件事情
一台服务器上的多件事
多台服务器上的多件事

配置文件查找优先级
ANSIBLE_CONFIG #全局
ansible.cfg #项目目录
.ansible.cfg
/etc/ansible/ansible.cfg

Ansible Inventory 主机清单

Ansible Ad-Hoc 模块

1.yum  | yum_repository 
2.copy
3.file
4.service|systemd
5.cron
6.mount
7.user
8.group
9.shell  | command
10.firewalld  | selinux

1.yum:装软件

name:			软件包名称  | URL地址  |  本地的某个路径下的rpm包
state:			具体动作  present  absent  latest
exclude:		排除
enablerepo		通过哪个仓库安装
disablerepo		安装时不使用哪个仓库
#示例一、安装当前最新的Apache软件,如果存在则不安装
[[email protected] ~/ansible-project1]# ansible oldboy -m yum -a "name=httpd state=latest"

#示例二、安装当前最新的Apache软件,通过epel仓库安装
[[email protected] ~]# ansible oldboy -m yum -a "name=httpd enablerepo=epel state=present"

#示例三、通过公网URL安装rpm软件
[[email protected] ~/ansible-project1]# ansible oldboy -m yum -a "name=http://192.168.16.236/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present"

#示例五、更新所有的软件包,但排除和kernel相关的
[[email protected] ~/ansible-project1]# ansible oldboy -m yum -a "name='*' state=latest exclude="kernel*""   


#示例六、删除Apache软件
[[email protected] ~/ansible-project1]# ansible oldboy -m yum -a "name=httpd state=absent"

2.copy

src				#当前管理机的配置文件路径
content			#要写入的内容
dest			#目标文件的配置文件路径
owner			#属主
group			#属组
mode			#权限
backup			#备份  (每个变更进行备份)
[[email protected] ~/ansible-project1]# ansible oldboy -m copy -a 'src=./hosts dest=/tmp/ owner=root group=root mode=600 backup=yes'

管理httpd配置文件
[[email protected] ~/ansible-project1]# ansible oldboy -m copy -a "src=./files/httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644 backup=yes"

3.systemd

name:		服务名称
state: 	started stopped restarted  reloaded
enabled:   开机自启动  yes|no
1.启动httpd服务
[[email protected] ~/ansible-project1]# ansible oldboy -m systemd -a "name=httpd state=started"

2.开机自启动
[[email protected] ~/ansible-project1]# ansible oldboy -m systemd -a "name=httpd state=started enabled=yes"

4.file模块

path: /work					#在被控端哪个路径下创建目录 | 文件
state: directory  touch		# directory 目录  touch 文件
owner: root
group: root
mode: '0755'
recurse: yes 递归授权
[[email protected] ~/ansible-project1]# ansible oldboy -m file -a "path=/ansible_data state=directory owner=root group=root mode=0755"

5.group

name: 		组名称
state: 		present  absent
gid:		组id
[[email protected] ~/ansible-project1]# ansible oldboy -m group -a "name=test gid=8888 state=present"
[[email protected] ~/ansible-project1]# ansible oldboy -m group -a "name=test state=absent"

6.user

name:				指定用户名称
uid: 				指定用户的uid
group: 				指定用户的组名称  或 组 GID
groups: 			指定用户的附加组(附加组需存在) append:yes 给一个用户追加附加组
create_home			创建用户家目录/home/Username   默认yes | no 
shell: 				指定登录用户的bash  /bin/bash  /sbin/nologin
system:             指定系统用户
password
1.创建一个dev用户,uid为9999    属于test主的组,附加组为admin,root组
[[email protected] ~/ansible-project1]# ansible oldboy -m user -a "name=dev uid=9999 group=test groups=adm,root shell=/bin/bash create_home=yes"

2.追加两个组给dev用户
[[email protected] ~/ansible-project1]# ansible oldboy -m user -a "name=dev groups=bin,daemon append=yes"

3.创建一个系统用户ops,没有家目录  不允许登录系统
[[email protected] ~/ansible-project1]# ansible oldboy -m user -a "name=ops system=yes shell=/sbin/nologin create_home=no"


4.创建一个普通用户,可登录  devops  123456
ansible all -i localhost, -m debug -a "msg={
    { '123456' | password_hash('sha512', 'mysecretsalt') }}"
    "msg": "$6$mysecretsalt$ZB9R8AirQYAXhtfhOo2qdJz52FyNI6v3L6Uc3KNRP.arBKIYpcuEyQewT5qBAHoyQFwHkW6Z551Ql.cZ53GeY0"
	
[[email protected] ~/ansible-project1]# ansible oldboy -m user -a 'name=devops password="$6$mysecretsalt$ZB9R8AirQYAXhtfhOo2qdJz52FyNI6v3L6Uc3KNRP.arBKIYpcuEyQewT5qBAHoyQFwHkW6Z551Ql.cZ53GeY0"'
	

7.mount

src:   源设备  (磁盘 | 光盘|  远程的共享的地址) src=172.16.1.31:/data
path: 	挂载点
fstype: 设备类型  nfs xfs ext4 iso9660 ....
opts: 	挂载选项  defaults
state: 
	absent  mounted 		永久
	present unmounted		临时
1.挂载172.16.1.31/data/blog  挂载至本地的/opt  
[[email protected] ~/ansible-project1]# ansible oldboy -m mount -a "src=172.16.1.31:/data/blog path=/opt fstype=nfs opts=defaults state=mounted"

[[email protected] ~/ansible-project1]# ansible oldboy -m mount -a "src=172.16.1.31:/data/blog path=/opt fstype=nfs opts=defaults state=unmounted"	
	

8.selinux

[[email protected] ~/ansible-project1]# ansible oldboy -m selinux -a "state=disabled"

9.firewalld

zone: 				指定区域 默认public
service: 			指定服务名称
port:				指定端口
state: 				启用或禁止
masquerade: 		开机地址伪装 yes
immediate:			临时生效 yes
permanent: 			永久生效
source: 			来源IP
rich_rule: rule service name="ftp" audit limit value="1/m" accept
1.放行http服务
[[email protected] ~/ansible-project1]# ansible 172.16.1.31 -m firewalld -a "zone=public  service=http state=enabled immediate=yes permanent=yes"

2.放行tcp80端口
[[email protected] ~/ansible-project1]# ansible 172.16.1.31 -m firewalld -a "zone=public  port=80/tcp state=enabled immediate=yes permanent=yes"

3.将5555端口转发到 172.16.1.7 22  端口 开启masquerade地址伪装
[[email protected] ~/ansible-project1]# ansible 172.16.1.31 -m firewalld -a "zone=public rich_rule='rule family=ipv4 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.7'  state=enabled immediate=yes"
[[email protected] ~/ansible-project1]# ansible 172.16.1.31 -m firewalld -a "zone=public masquerade=yes state=enabled immediate=yes"


4.配置基于来源IP  10.0.0.1主机 放行 22 端口
[[email protected] ~/ansible-project1]# ansible 172.16.1.31 -m firewalld -a "zone=public rich_rule='rule family=ipv4 source address=10.0.0.100/32 service name=ssh accept'  state=enabled immediate=yes"

10.cron

1.添加一个定时任务 (能不能执行跟cron模块没有关系)
[[email protected] ~/ansible-project1]# ansible oldboy -m cron -a "name='Backup scripts' minute=00 hour=05 user=root job='/bin/bash /scripts/check_data.sh &>/dev/null'"

2.删除定时任务
[[email protected] ~/ansible-project1]# ansible oldboy -m cron -a "name='Backup scripts' minute=00 hour=05 user=root job='/bin/bash /scripts/check_data.sh &>/dev/null' state=absent"
	

11.yum_repository

name: 			仓库名称,并且是文件的名称
description: 	描述--
baseurl: 		仓库的地址|很重要  http:// https:// ftp:// file://
enabled: 		是否启用该仓库yes
gpgcheck: 		不对下载的软件包进行检查
[[email protected] ~/ansible-project1]# ansible oldboy -m yum_repository -a 'name=rpmforge description="RPMforge YUM Repo" baseurl="https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/" enabled=yes gpgcheck=no'
	

ansible-doc

1.使用ansible 的 ad-hoc 搭建 NFS 服务

1.安装nfs
	# ansible nfs -m yum -a "name=nfs-utils state=present"

2.配置nfs
[[email protected] ~/ansible-project1]# cat exports.j2 
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) 
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/ansible 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[[email protected] ~/ansible-project1]# ansible nfs -m copy -a "src=./exports.j2 dest=/etc/exports owner=root group=root mode=0644 backup=yes"

3.根据配置文件进行初始化操作   创建用户  创建目录 授权

[[email protected] ~/ansible-project1]# ansible nfs -m group -a "name=www gid=666 state=present"
[[email protected] ~/ansible-project1]# ansible nfs -m user -a "name=www uid=666 group=www  state=present"

[[email protected] ~/ansible-project1]# ansible nfs -m file -a "path=/data/ansible state=directory owner=www group=www mode=755 recurse=yes"

3.启动nfs
[[email protected] ~/ansible-project1]# ansible nfs -m systemd -a "name=nfs state=restarted enabled=yes"

2.使用ansible 的 ad-hoc 实现 NFS 挂载

1.安装nfs-utils工具
	[[email protected] ~/ansible-project1]# ansible web -m yum -a "name=nfs-utils state=present"

2.使用mount挂载即可
	[[email protected] ~/ansible-project1]# ansible web -m mount -a "src=172.16.1.31:/data/ansible path=/mnt fstype=nfs opts=defaults state=mounted"
- hosts: nfs
  tasks:
    - name: Installed NFS Server
      yum:
        name: nfs-utils
        state: present

    - name: Configure NFS Server
      copy:
        src: ./exports.j2
        dest: /etc/exports
        owner: root
        group: root
        mode: 0644

    - name: Create NFS Group
      group:
        name: www
        gid: 666
  
    - name: Create NFS User
      user: 
        name: www
        uid: 666
        group: 666

    - name: Create NFS Share directory
      file:
        path: /data/ansible
        state: directory
        owner: www
        group: www
        mode: 755

    - name: Restart NFS Server
      systemd: 
        name: nfs
        state: restarted	
			
		
[[email protected] ~/ansible-project1]# cat nfs-client.yml 
- hosts: web
  tasks:
    - name: Mount NFS Server
      mount: 
        src: 172.16.1.31:/data/ansible 
        path: /mnt
        fstype: nfs
        opts: defaults 
        state: mounted	

playbook中的vars_file设定变量

1.装软件
- name: ensure a list of packages installed
  yum:
    name: "{
   { packages }}"
  vars:
    packages:
    - httpd
    - httpd-tools

2.拷贝多分配置文件  1个tasks拷贝多个文件    字典
    - name: Copy Rsync Configure
      copy:
        src: "{
   { item.src }}"
        dest: "{
   { item.dest }}"
        mode: "{
   { item.mode }}"
      loop:
        - { src: ./rsyncd.conf.j2 , dest: /etc/rsyncd.conf , mode: '0644' }
        - { src: ./rsync.passwd.j2  , dest: /etc/rsync.passwd , mode: '0600' }
      notify: Restart Rsync Server


3.批量启动服务      1个tasks启动多个服务     列表
    - name: Systemd Httpd Server
      systemd:
        name: "{
   { item }}"
        state: started
        enabled: yes
      loop:
        - httpd
        - firewalld
        

Ansible 判断when

1.根据不同的操作系统,安装不同的软件	
[[email protected] ~/ansible_variables]# cat play_14.yml 
- hosts: all
tasks:
  - name: Installed Httpd Server Centos
    yum:
      name: httpd
      state: present
    when: ( ansible_distribution == "Ubuntu" ) 
  	
  
[[email protected] ~/ansible_variables]# cat play_14.yml 
- hosts: all
tasks:
  - name: Installed Httpd Server Centos
    yum:
      name: httpd
      state: present
    when: ( ansible_distribution == "CentOS" ) and 
          ( ansible_distribution_major_version == "7")	
  
  - name: Installed Httpd Server Centos
    yum:
      name: httpd2
      state: present
    when: ( ansible_distribution == "CentOS" ) and  
          ( ansible_distribution_major_version == "6")	
  
	2.根据不同的主机名称,配置不同的源     all-->   web--->nginx_repo
[[email protected] ~/ansible_variables]# cat play_15.yml 
- hosts: all
  tasks:
    - name: This is when repo
      yum_repository:
        name: oldxu
        description: oldxu
        baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
        gpgcheck: no
      when: ( ansible_hostname is match ("web*") ) 

触发器 Handlers

1.特殊Tasks   
2.不会被正常的TASKS调用。
3.当有notify调用时,才会被执行。

注意: 无论Handlers被调用多少次,最终只会在正常的Tasks结束后,才执行。

tag标签

(tasks较多时,需要对指定的某个tasks进行调试)
将tasks与标签捆绑–> 后期针对指定的tag进行执行
1.支持一个tasks对应一个tag标签
2.支持一个tasks对应多个tag标签
1.执行指定的标签
ansible-playbook redis_server.yml -t install
2.除了某个tags,其余都执行
ansible-playbook redis_server.yml --skip-tags install

ignore_errors 忽略错误

[[email protected] ~/ansible_tasks]# vim task_2.yml
- hosts: all
  tasks:
	- name: Ignore False
	  command: /bin/false
	  ignore_errors: yes

	- name: touch new file
	  file: path=/tmp/bgx_ignore state=touch

force_handlers

- hosts: web
  force_handlers: yes    <---当handlers被调起,无论中间的tasks是否错误,都会执行handlers任务

changed_when

[[email protected] ~/ansible_tasks]# cat  task3.yml 
- hosts: web
  tasks:
[[email protected] ~/ansible_tasks]# cat task4.yml 
- hosts: web
  vars:
    - cloud_server_name: cloud.qxh.com
  tasks:
    - name: Configure Nginx Conf
      template:
        src: proxy_cloud.qxh.com.conf.j2
        dest: /tmp/proxy.conf


[[email protected] ~/ansible_tasks]# cat proxy_cloud.qxh.com.conf.j2 
upstream {
    {
     cloud_server_name }} {
    
{
    % for host in  groups['web'] %}
    server {
    {
     host }}:80;	
{
    % endfor %}
}

server {
    
	listen 80;
	server_name {
    {
     cloud_server_name }};
	location / {
    
		proxy_pass http://{
    {
     cloud_server_name }};
	}
}

playbooy 目录结构

nginx
	tasks				<--tasks任务
		main.yml
	handlers			<--handlers触发器
		main.yml
	templates			<--模板文件
		main.yml
	vars				<--变量
		main.yml
	files				<--文件 tar|zip
	meta				<--依赖间关系
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26363645/article/details/106146670

智能推荐

Sublime text 4 build 4121 逆向_来自大山深处的Doge_的博客-程序员宅基地

使用UltraEdit打开sublime_text.exe,搜索807805000f94c1将其替换为c64005014885c9(26010h和26020h这两行)

linux进程上下文切换,kernel 3.10内核源码分析--进程上下文切换_爱文斯坦的博客-程序员宅基地

一、疑问进程调度时,当被选中的next进程不是current进程时,需要进行上下文切换。进行上下文切换时,有一些问题不太容易理解,比如:1、进程上下文切换必然发生在内核态吗?2、上下文切换后原来的进程(prev)如果恢复执行,从什么地方开始执行?3、上下文切换后,如何切换到新进程执行?新进程从什么地方开始执行?5、上下文切换时,堆栈如何切换,如果保证不混乱?6、A进程执行时被打断调度B进程运行,B...

联机算法 与 递归调用 的分析_iteye_12675的博客-程序员宅基地

联机算法:在任意时刻,算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。具有这种特性的算法叫做联机算法(on-line algorithm)。该算法仅需要常量空间并以线性时间运行,因此联机算法几乎是完美的算法。递归调用的准则:1. 基准情形。 不用递归就能求解的情形。2....

C++:STL标准入门汇总_Mr^_^Soong的博客-程序员宅基地

C++:STL标准入门汇总学无止境!!!第一部分:(参考百度百科) 一、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已

JAVA开源协同过滤算法_基于用户的协同过滤推荐算法_石塔西的博客-程序员宅基地

什么是推荐算法推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地。最开始,所以我们在网上找资料,都是进yahoo,然后分门别类的点进去,找到你想要的东西,这是一个人工过程,到后来,我们用google,直接搜索自 己需要的内容,这些都可以比较精准的找到你想要的东西,但是,如果我自己都不知道自己要找什么...

Android 开发_eclipse环境搭建_weixin_34265814的博客-程序员宅基地

1.安装java,下载java jdk1.7 x64,配置环境变量。附:下载地址http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.htmla.系统变量创建一个变量CLASSPATH,值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.j...

随便推点

mysql alter算法_MySQL ALTER_kamalsheel的博客-程序员宅基地

MySQL ALTER命令当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。开始本章教程前让我们先创建一张表,表名为:testalter_tbl。[email protected]# mysql -u root -p password;Enterpassword:*******mysql&gt;useTUTORIALS;Databasechangedmysql&gt;create...

Linux Mint 13 的安装、配置及搭建Android源码编译环境_大磊大的博客-程序员宅基地

用过ubuntu,现在想换换LinuxMint试试看。下面是我安装配置LinuxMint13的过程。1、安装安装LinuxMint13时,我尝试了好多种方法,都失败了。最后选用了硬盘安装。硬盘安装Linuxmint和安装ubuntu一样。1.1、准备工作1、从linux mint的官方网站http://www.linuxmint.com/ 下载linux mint 13。2、下

如何撰写某数据模型(如学生成绩管理),_shuiyuejingen的博客-程序员宅基地

请问如何撰写某数据模型(如学生成绩管理),撰写案例分析,请帮忙做一例给参考,谢谢!急用

怎么判断对象是否可以被回收?_学习使我可乐的博客-程序员宅基地_怎么判断对象是否可以被回收

引用类型无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。Java 提供了四种强度不同的引用类型。#1. 强引用被强引用关联的对象不会被回收。使用 new 一个新对象的方式来创建强引用。Object obj = new Object();#2. 软引用被软引用关联的对象只有在内存不够的情况下才会被回收。使用 SoftReference 类来创建软引用。Object obj = new...

android: SQLite查询数据_weixin_33978044的博客-程序员宅基地

掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了。不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作。我们都知道 SQL 的全称是 Structured Query Language,翻译成中文就是结构化查询语言。 它的大部功能都是体现在“查”这个字上的,而“增删改”只是其中的一小部分功能。由于 SQL 查询涉及的内容实在是太多了,因此在这里我...

kvaser matlab 联合,MATLAB,Simulink解決方案 - MATLAB連接到硬體和儀器_苏语璇呐的博客-程序员宅基地

您的應用 &gt; 測試與量測 &gt; 連接到硬體和儀器連接到硬體和儀器使用 MATLAB 或 Simulink 及相關產品,可以控制和擷取來自資料擷取硬體、影像硬體、儀器或 CAN 匯流排的資料,無需離開您現有的工作區的情況下,即能進行資料的視覺化和分析工作。從測試和測量設備擷取和傳送資料在MATLAB為主的單一環境中,您可以建立靈活的測試系統、將測試程式自動化、執行設計驗證,並在擷取資料時對...