ansible常用模块使用方法

ansible-playbook执行方法

#这个是你选择的主机
- hosts: webservers
#这个是变量
  vars:
    http_port: 80
    max_clients: 200
#远端的执行权限
  remote_user: root
  tasks:
  
如果有些系统做了相关的sudo限制,需要在playbooks里面开启sodu,或者直接偷懒,权限直接为root !
- hosts: web
  remote_user: kangkang
  tasks:
    - service: name=nginx state=started
      sudo: yes        #是否提权  默认sudo为root
      sudo_user:root ####sudo提权为root用户

#执行剧本,playbook里面定义过变量,可以使用-e指定变量覆盖文件内的变量,-e优先级最高
ansible-playbook diskpart.yaml [-e disk=/dev/sdb diskfullpath=/dev/sdb1 mountDir=da

ansible-playbook  #使用方法
ansible-playbook    文件名.yml    --syntax-check   ##检查playbook文件的语法是否正确
ansible-playbook     文件名.yml      #执行
#如果过程有报错想要执行 其中的一个步骤 可以根据tags标签来进行单独执行命令:
语法:ansible-playbook --tags="标签名"  文件名.yml 
举例: ansible-playbook --tags="link"  文件名.yml   #执行上面的软连接部分


13.absible test -m script -a 'test.sh' :
将本地的tesh.sh在远程主机上运行(脚本所在路径只能使用相对路径)


11.ansible all -m set up : 查看远程主机的信息
12.ansible all -m service -a 'name=httpd enabled=yes':设定服务是否开机启动
name=:服务名称,如httpd

通过命令行指定变量,优先级最高
ansible-playbook –e varname=value

ansible test -m shell -a 'echo abcd1234|passwd --stdin user1'       #修改密码  修改之后最好确认一下 最好使用script脚本方式修改  #此方法不保险


YUM模块(yum)

- name: Download the nginx package but do not install it   #下载nginx包但不安装
  yum:					 	#YUM模块
    name:
      - nginx				#安装包名称
    state: latest
    download_only: true           ##只下载包不安装
    
    
- name: Install a list of packages  #安装多个数据包
  yum:
    name:
      - nginx
      - php
      - mysql
    state: present  
    
- name: install nginx rpm from a local file    ##安装本地rpm包文件
  yum:
    name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state: present
    
- name: ensure a list of packages installed   ##嵌入变量 下载安装包列表
  yum:
    name: "{{ packages }}"
  vars:
    packages:
    - httpd
    - httpd-tools

- name: remove the Apache package       ### state 为absent  卸载httpd软件包
  yum:
    name: httpd
    state: absent


USER 用户模块(user)

groups:指定用户的属组
uid:指定用的uid
password:为用户设置登陆密码,此密码是明文密码加密后的密码
update_password:always/on_create
    always:只有当密码不相同时才会更新密码(默认)
    on_create:只为新用户设置密码
name:指定用户名
createhome:是否创建家目录 yes|no(默认是yes)
system:是否为系统用户
remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r(默认是no)
state:是创建还是删除 present(添加(默认值))or absent(移除)
shell:指定用户的shell环境
append:yes/no
    yes:增量添加group
    no:全量变更group,只设置groups指定的group(默认)
expires:设置用户的过期时间,值是一个时间戳

    3、注意事项
  注:指定password参数时,不能使用后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
- user: name=johnd comment="John Doe" uid=1040 group=admin
- user: name=james shell=/bin/bash groups=admins,developers append=yes
- user: name=johnd state=absent remove=yes
- user: name=james18 shell=/bin/zsh groups=developers expires=1422403387
#生成密钥时,只会生成公钥文件和私钥文件,和直接使用ssh-keygen指令效果相同,不会生成authorized_keys文件。
- user: name=test generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa


       - name: "add user docker"
         user: name={{ item.name }} password={{ item.dockerpass | password_hash('sha512') }} state=present  update_password=always          ##密码需要加密 不然执行报警告 。不加密也可以执行  没有查是版本还是其他问题
         with_items:
         - { name: 'docker', dockerpass: '123123' }     
         tags:
         - add user docker
         
         
         # 删除用户'
         user:
            name: johnd
            state: absent
            remove: yes
            
         #更新用户密码
         user: name={{ item.name }} password={{ item.rootpass | password_hash('sha512') }} state=present  update_password=always 
         with_items:
         - { name: 'root', rootpass: '123123' }     
         tags:
         - update passwd
            
创建三个用户
    - name: create user
      user: name={{item}} 
      with_items:
        - xixi
        - haha
        - memeda

FILE模块文件(file)

# touch文件,但添加/删除一些权限
- file:
    path: /etc/foo.conf
    state: touch
    mode: "u+rw,g-wx,o-rwx"	  #选项: file, link, directory, hard, touch, absent
##类似同上 稍微有点区别
# touch a file, using symbolic modes to set the permissions (equivalent to 0644)
- file:
    path: /etc/foo.conf
    state: touch
    mode: "u=rw,g=r,o=r"


# 更改文件所有权、组和模式。使用八进制数指定模式时,第一个数字应始终为0
- file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644
# 使用file模块创建软连接
 - file:
    src: /file/to/link/to
    dest: /path/to/symlink
    owner: foo
    group: foo
    state: link
# 创建目录并赋予755权限
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755


SERVICE服务模块(service)

#触发重启服务器
    notify:
    - restart apache          ##  handlers -name引用名
  - name: ensure apache is running
    service: name=httpd state=started
#这里的restart apache 和上面的触发是配对的。这就是handlers的作用。相当于tag
  handlers:
    - name: restart apache    ##   notify:引用名
      service: name=httpd state=restarted

# 如果httpd没有启动 就启动httpd服务
- service:
    name: httpd
    state: started           #参数可选( started, stopped, restarted, reloaded )
    enabled: yes  #开机启动     参数可选( yes,no )

#如果httpd启动 就关闭httpd服务
- service:
    name: httpd
    state: stopped

#重启网络网卡
# Example action to restart network service for interface eth0
- service:
    name: network
    state: restarted
    args: eth0      #注意网卡接口名


#可以使用
# Example action to start service foo, based on running process /usr/bin/foo
- service:
    name: foo
    pattern: /usr/bin/foo
    state: started

LINEINFILE文件修改模块(lineinfile)

path参数 :必须参数,指定要操作的文件。

line参数 : 使用此参数指定文本内容。

backup参数:是否在修改文件之前对文件进行备份。

create参数 :当要操作的文件并不存在时,是否创建对应的文件。

regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

state参数:当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。

backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。

insertafter参数:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。

insertbefore参数:借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。


# 替换config文件中匹配到的SELINUX=开头的行替换为SELINUX=enforcing'
- lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: 'SELINUX=enforcing'
#删除/etc/sudoers文件%wheel开头的行
- lineinfile:
    path: /etc/sudoers
    state: absent
    regexp: '^%wheel'
#替换行,并指定用户,组,权限。
- lineinfile:
    path: /etc/hosts
    regexp: '^127\.0\.0\.1'
    line: '127.0.0.1 localhost'
    owner: root
    group: root
    mode: 0644

- lineinfile:
    path: /etc/httpd/conf/httpd.conf
    regexp: '^Listen '
    insertafter: '^#Listen '  #EOF末尾插入行
    line: 'Listen 8080'        #替换regexp匹配到的行

- lineinfile:
    path: /etc/services
    regexp: '^# port for http'
    insertbefore: '^www.*80/tcp'  #BOF开头插入行
    line: '# port for http by default'   #替换行
    
#如果文件不存在,则向其添加一行 新建文件
# Add a line to a file if it does not exist, without passing regexp
- lineinfile:
    path: /tmp/testfile
    line: '192.168.1.99 foo.lab.net foo'

# 虽然也是替换行,需注意单引号。 原样输出
- lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%wheel\s'
    line: '%wheel ALL=(ALL) NOPASSWD: ALL'

# Yaml requires escaping backslashes in double quotes but not in single quotes
- lineinfile:
    path: /opt/jboss-as/bin/standalone.conf
    regexp: '^(.*)Xms(\\d+)m(.*)$'
    line: '\1Xms${xms}m\3'
    backrefs: yes

# Validate the sudoers file before saving
- lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%ADMIN ALL='
    line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
    validate: '/usr/sbin/visudo -cf %s'

SETUP模块(setup)

  主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果)

  每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息(如系统版本,主机IP地址)告知ansible管理主机

####   1、帮助信息

ansible-doc -s setup

--tree :将所有主机的输出信息保存到/tmp/目录下,以/etc/ansible/hosts里的主机名为文件名
ansible all -m setup -a 'filter=ansible_distribution_version' --tree /tmp/

filter :过滤关键字
#ansible db -m setup -a 'filter=ansible_distribution_version'

gather_subset:按子集收集信息,值有all, min, hardware, network, virtual, ohai, facter。不包含请使用!号,如,!network

CRON 定时任务模块(cron)

  ansible-doc -s cron
 
 1 backup:对远程主机上的原任务计划内容修改之前做备份 
 2 cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划 
 3 day:日(1-31,**/2,……) 
 4 hour:小时(0-23,**/2,……)  
 5 minute:分钟(0-59,**/2,……) 
 6 month:月(1-12,**/2,下·……) 
 7 weekday:周(0-7,*,……)
 8 job:要执行的任务,依赖于state=present 
 9 name:该任务的描述 
10 special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly 
11 state:确认该任务计划是创建还是删除 
12 user:以哪个用户的身份执行

  2、使用说明
ansible db -m cron -a 'minute=""  hour="" day="" month="" weekday="" job="" name="(必须填写)" state=
    1、定时设置指定值的写入即可,没有设置的可以不写(默认是*)
    2、name必须写
    3、state有两个状态:present(添加(默认值))or absent(移除)

3、使用范例
    1、添加定时任务
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="present"'
ansible db -a "crontab -l"


    2、移除定时任务
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="absent"'
ansible db -a "crontab -l"

ansible-playbook for循环

---
- hosts: testweb
  remote_user: root
  vars:           ####  定义变量 :(listen = 8080)
    nginx_vhosts:
      - listen: 8080
      
{% for vhost in nginx_vhosts %}         ##for循环吧 vars定义的nginx_vhosts变量值定义给vhost 
server {
listen {{ vhost.listen }}                ####引用变量值
}
{% endfor %}


#生成的结果
server {
listen 8080
}



#########################################################################
- hosts: mageduweb
  remote_user: root
  vars:
    nginx_vhosts:
      - web1:
        listen: 8080
        root: "/var/www/nginx/web1/"
      - web2:
        listen: 8080
        server_name: "web2.abc.com"
        root: "/var/www/nginx/web2/"
      - web3:
        listen: 8080
        server_name: "web3.abc.com"
        root: "/var/www/nginx/web3/"
  tasks:
    - name: template config to
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

{% for vhost in nginx_vhosts %}
server {
listen {{ vhost.listen }}
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }}
{% endif %}
root {{ vhost.root }}
}
{% endfor %}

#生成的结果

server {
listen 8080
root /var/www/nginx/web1/
}
server {
listen 8080
server_name web2.abc.com
root /var/www/nginx/web2/
}
server {
listen 8080
server_name web3.abc.com
root /var/www/nginx/web3/
}

ansible-playbook 判断条件

- hosts: appsrvs
  remote_user: root
 
  tasks:
    - name: install package
      yum: name=httpd
    - name: template 6
      template: src=httpd_6.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart service
      when: ansible_distribution_major_version == "6"      ###判断条件 判断系统版本为6 
 
    - name: template 7      
      template: src=httpd_7.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart service      
      when: ansible_distribution_major_version == "7"   ###判断条件 判断系统版本为7
    - name: start service
      service: name=httpd state=started
 
  handlers:
    - name: restart service

一、在剧本的当前目录创建templates文件夹(template只能在剧本使用)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAxcWMrq-1609398596206)(C:\Users\LYK\AppData\Roaming\Typora\typora-user-images\image-20201231150030799.png)]

​ 用作模板文件。在基于playbook进行修改

ansible内置变量

4.play_hosts变量是用来返回当前playbook运行的主机信息,返回格式是主机list结构,inventory_dir变量是返回当前playbook使用的Inventory目录
  
5.获取当前操作的所有主机名
inventory_hostname变量是返回Inventory文件里面定义的主机名,inventory_hostname_short会返回I文件中主机名的第一部分
  ansible test_group -m debug -a "msg={{inventory_hostname}}"
6. groups变量是一个全局变量,它会打印出Inventory文件里面的所有主机以及主机组信息
groups
ansible master -m debug -a "msg={{groups.test}}"

7.获取主机所在组的名称
 group_names
8.获取主机清单目录
 inventory_dir

2、经常获取的信息,统计表格如下
关键字说明返回值例子
ansible_nodename节点名“6-dns-1.hunk.tech”
ansible_fqdnFQDN名“6-dns-1.hunk.tech”
ansible_hostname主机短名称“6-dns-1”
ansible_domain主机域名后缀“hunk.teh”
ansible_memtotal_mb总物理内存“ansible_memtotal_mb”: 222
ansible_swaptotal_mbSWAP总大小“1023”
ansible_processorCPU信息Intel® Core™ i5-5200U CPU @ 2.20GHz
ansible_processor_coresCPU核心数量4
ansible_processor_vcpusCPU逻辑核心数量2
ansible_all_ipv4_addresses有所IPV4地址192.168.0.200
ansible_all_ipv6_addresses所有IPV6地址
ansible_default_ipv4默认网关的网卡配置信息
ansible_eth2具体某张网卡信息不同系统名称需要变化
ansible_dnsDNS设置信
ansible_architecture系统架构x86_64
ansible_machine主机类型x86_64
ansible_kernel内核版本“2.6.32-696.el6.x86_64”
ansible_distribution发行版本“CentOS”
ansible_distribution_major_version操作系统主版本号“6”
ansible_distribution_release发行版名称“Final”
ansible_distribution_version完整版本号“7.4.1708”
ansible_pkg_mgr软件包管理方式“yum”
ansible_service_mgr进行服务方式“systemd”
ansible_os_family家族系列“RedHat”
ansible_cmdline内核启动参数
ansible_selinuxSElinux状态“disabled”
ansible_env当前环境变量参数
ansible_date_time时间相关
ansible_python_versionpython版本“2.6.6”
ansible_lvmLVM卷相关信息
ansible_mounts所有挂载点
ansible_device_links所有挂载的设备的UUID和卷标名
ansible_devices所有/dev/下的正在使用的设备的信息
ansible_user_dir执行用户的家目录“/root”
ansible_user_gecos执行用户的描述信息"The root "
ansible_user_gid执行用户的的GID0
ansible_user_id执行用户的的用户名“root”
ansible_user_shell执行用户的shell类型“/bin/bash”
ansible_user_uid执行用户的UID0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值