ansible的常用的模块
ansible查看模块的帮助的命令
ansible-doc 模块的名字
一:file模块
file模块是关于文件一些操作的模块
1:查看file模块的帮助文档
[q7@controller ansible]$ ansible-doc file EXAMPLES: - name: Change file ownership, group and permissions file: path: /etc/foo.conf owner: foo group: foo mode: '0644' - name: Give insecure permissions to an existing file file: path: /work owner: root
2:file模块常用的一些参数
path:必须存在的参数,用于指定要操作文件或者目录
state:有很多的值,touch--创建文件,directory为创建文件夹,hard为创建硬链接,link为创建软连接
src:当创建硬链接或者软连接的时候,sre可以指定链接源
force:就是强制的意思,当state的值为link的时候,
强制创建链接文件有三种方式,
第一种:就是链接源的路径不存在的时候,会强制创建一个链接文件
第二种:就是在创建链接文件的目录中有同名的存在的时候,会覆盖掉原来的链接文件,就是删除
第三种:创建链接文件的目录中有同名的时候,并且连接文件的路径不存在的时候,也会强制替换掉同名的文件为链接文件
owner:用于指定文件的属主,文件的属主在远程用户中必须存在
group:用于指定文件的属组,文件的属组在远程用户组中必须存在
mode:用于指定被操纵文件的权限,可以用数字或者rwx来表示,rwx来表示的时候,需要用逗号隔开,比如755,u=rwx,g=rw
recurse:当要操作文件为目录,可以将resource设置为yes,可以递归的修改目录中文件的属性
3:一些列子
有一个疑问:就是我是以普通用户登录上去的,为什么创建文件的时候,还是root用户呢?
在使用普通用户控制被控节点创建文件时,文件属主为root用户是因为在ansible的控制端中,使用了sudo或su等命令来提升普通用户的权限,使其具有root用户的权限来执行操作。因此,创建的文件的属主就是root用户。如果想要更改文件的属主,可以在ansible的playbook中使用file模块的owner参数来指定文件的属主。
如果使用ansible命令的很短的的话,使用ad-hoc就行了
创建链接文件时,如果不使用force这个参数,那么被控节点一定要有源文件,否则会报错(我在这里纠结了一会,一直在报错,一定要注意下)
1)创建一个硬链接文件
[q7@controller ansible]$ ansible test -m file -a "src=/mnt/11.txt state=hard path=/mnt/11_hard " client | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "dest": "/mnt/11_hard",
硬链接文件和源文件一样,对硬链接文件进行修改,源文件的内容也会修改
2)创建一个软连接文件
[q7@controller ansible]$ ansible test -m file -a "src=/mnt/11.txt state=link path=/mnt/11_link " client | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "dest": "/mnt/11_link",
在被控节点上查看硬链接和软连接文件
[q7@client mnt]$ ls 11_hard 11_link 11.txt hgfs [q7@client mnt]$
3)使用force参数
情况1:就是源文件不存在,使用force
情况2:就是创建链接文件的目录有同名的文件,替换成链接文件
情况3:就是源文件不存在,并且有同名的文件,替换成链接文件
[q7@client mnt]$ ls 11_hard 11_link 11.txt 22link hgfs [q7@client mnt]$ #源文件不存在,但是有同名的情况下,替换成链接文件 [q7@controller ansible]$ ansible test -m file -a "src=/mnt/22 state=link path=/mnt/22link force=yes " [q7@client mnt]$ ll total 0 -rw-r--r--. 2 root root 0 Nov 13 00:50 11_hard lrwxrwxrwx. 1 root root 11 Nov 13 00:57 11_link -> /mnt/11.txt -rw-r--r--. 2 root root 0 Nov 13 00:50 11.txt lrwxrwxrwx. 1 root root 7 Nov 13 01:03 22link -> /mnt/22 drwxr-xr-x. 2 root root 6 Nov 10 18:12 hgfs [q7@client mnt]$
4)删除被控节点的链接文件
[q7@controller ansible]$ ansible test -m file -a "path=/mnt/22link state=absent" [q7@client mnt]$ ls 11_hard 11_link 11.txt hgfs [q7@client mnt]$
5)创建目录,修改属主和属组
属主和属组都为q7
[q7@controller ansible]$ ansible test -m file -a "path=/mnt/33.txt state=directory owner=q7 group=q7"
查看被控节点的这个目录
[q7@client mnt]$ ll total 0 -rw-r--r--. 2 root root 0 Nov 13 00:50 11_hard lrwxrwxrwx. 1 root root 11 Nov 13 00:57 11_link -> /mnt/11.txt -rw-r--r--. 2 root root 0 Nov 13 00:50 11.txt drwxr-xr-x. 2 q7 q7 6 Nov 13 01:09 33.txt
在这个目录下创建文件
[q7@controller ansible]$ ansible test -m file -a "path=/mnt/33.txt/qq.txt state=touch" #查看被控节点 [q7@client 33.txt]$ ll total 0 -rw-r--r--. 1 root root 0 Nov 13 01:12 qq.txt [q7@client 33.txt]$
发现在该文件里面创建的文件都是root用户
6)递归的操作(recurse)
在33.txt这文件中再创建一个文件夹44。在44这个文件里面在创建一个文件44-1
44的文件夹里面都是root用户和root用户组
都修改为q7
[q7@controller ansible]$ ansible test -m file -a "path=/mnt/33.txt/44 state=directory recurse=yes owner=q7 group=q7" #查看被控节点 [q7@client 33.txt]$ ll -R .: total 0 drwxr-xr-x. 2 q7 q7 18 Nov 13 01:18 44 -rw-r--r--. 1 root root 0 Nov 13 01:12 qq.txt ./44: total 0 -rw-r--r--. 1 q7 q7 0 Nov 13 01:18 44-1 [q7@client 33.txt]$
都被修改了,但是33.txt这个文件夹里面没有被修改,44这个文件夹及其目录下的文件都被修改了
二:user模块和group模块
user模块是关于用户相关的操作
1:首先可以查看user模块的帮助文档
[q7@controller ansible]$ ansible-doc user #搜索EXAMPLES快速的找到列子 EXAMPLES: - name: Add the user 'johnd' with a specific uid and a primar> user: name: johnd comment: John Doe uid: 1040 group: admin - name: Add the user 'james' with a bash shell, appending the> user: name: james shell: /bin/bash groups: admins,developers append: yes - name: Remove the user 'johnd' user:
2:user模块常用的参数
name:必须参数,用于指定要操作的用户名称
group:用于指定用户的主要组
groups:用于指定用户的附加组,注意的就是,如果用户已经存在了,并且有很多的附加组的话,再次添加到附加组中的话,就要加上append参数来设置附加组,否则,原来的会被替换掉
append:就是如果用户有很多的附加组的话,想要继续添加的话,又不想原来的附加组被覆盖掉的话,append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no
shell:用于指定用户的默认shell
uid:指定用户的uid
comment:用于指定用户的注释信息
state:用于指定用户是否存在远程主机中,可选的值为,present(添加),absent(删除),默认是present
remove:当state的值设置为absent,表示要删除远程主机的用户,但是在删除用户时,不会删除用户的家目录,应为remove的参数默认值为no,如果想要删除用户的家目录,remove的值为yes,就可以彻底的删除干净
password:设置用户的密码,但是这个密码必须使经过哈希加密的才行,
格式为:
password: "{{'123'|password_hash('sha512')}}" 就是先有双引号,2个花括号,加上password_hash('sha512')
update_password:有2个值可以选,always,就是password参数设置的值与当前用户设置的值不一样的话,就更新密码,on_create,就是password设置的值与当前用户不一样的话,不会更新密码,如果是创建新的用户,参数的值为on_create,也会把用户的密码设置为password的值
3:列子
以上的列子我用的是剧本来写的啊,没有使用ad-hoc
1)创建用户
创建一个joe的用户,uid为2020,家目录为/home/jjoe,添加多个附加组,,主要组为joe,注释:我是joe,shell默认是/bin/bash,密码设置为123456
--- - hosts: test tasks: - name: create joe... user: name: joe uid: 2020 home: /home/joe groups: a,b shell: /bin/bash password: "{{'123456'|password_hash('sha512')}}" comment: woshijjoe state: present #执行该剧本 [q7@controller ansible]$ ansible-playbook useradd_joe.yaml
就是主要组不设置任何值的,默认就是以用户本身为主要组
在被控节点上查看joe用户
[root@client /]# id joe uid=2020(joe) gid=2020(joe) groups=2020(joe),2001(a),2002(b)
2)更改用户的附加组
第一种:不使用append参数
--- - hosts: test tasks: - name: modify joe user: name: joe groups: q7
在被控节点上查看joe的信息
[root@client /]# id joe uid=2020(joe) gid=2020(joe) groups=2020(joe),1000(q7)
可以看到,joe之前的附加组被q7这个附加组覆盖掉了
第二种:使用append参数
--- - hosts: test tasks: - name: modify joe user: name: joe groups: q7,a,b append: yes
查看joe用户的信息
[root@client /]# id joe uid=2020(joe) gid=2020(joe) groups=2020(joe),1000(q7),2001(a),2002(b)
可以看出使用了append的参数的话,原来的附加组不会被覆盖掉
所以,如果想要添加附加组的话,又不想要被覆盖掉的话,就是使用append这个参数
3:删除用户
删除用户要带上remove的选项,这样就能删除干净相当于userdel -r 这个选项
--- - hosts: test tasks: - name: absent joe user: name: joe state: absent remove: yes
在被控节点上查看joe用户的信息
[root@client /]# id joe id: ‘joe’: no such user [root@client /]#
[root@client /]# cd /home/ [root@client home]# ls a b q7 [root@client home]#
家目录下没有joe用户的信息了,则代表这彻底的删除干净了
4:group模块常用的参数
就是创建组,gid
name:就是创建一个组
state:prsent和absent
gid:设置组的gid
--- - hosts: test tasks: - name: add group group: name: rrr state: present
三:shell模块
四:yum_repository模块
就是关于管理远程主机上的yum源的配置文件的编写
1:查看帮助文档
[q7@controller ansible]$ ansible-doc yum_repository EXAMPLES: - name: Add repository yum_repository: name: epel description: EPEL YUM repo baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
2:常用的参数
name:用于指定要操作的唯一仓库的id,也就是方括号内的仓库的id
baseurl:此参数用于设置yum仓库的baseurl
description:此参数用于设置仓库的注释信息,就是name字段的意思
file:用于设置仓库的配置文件的名称,即就是.repo配置文件的文件名前缀,没有的话,默认会用name参数的仓库名称,一个repo配置文件可以存在多个yum源
enabled:用于设置是否激活对应的yum源,默认为yes
gpgcheck:用于是否开启rpm包验证功能,默认为no,
gpgcheckey:为yes时,指定验证包所需的公钥
state:默认值为present,当设置为absent时,表示删除对应的yum源
3:案列
我用剧本编写的
1)编写多个yum源的配置文件
都写在一个配置文件中的话,使用file这个参数指定repo的前缀名都是一致的就行了
[q7@controller ansible]$ vim yum_repository.yaml --- - hosts: test tasks: - name: createAppStreamrepo yum_repository: name: AppStream description: AS baseurl: file:///media/AppStream gpgcheck: no enabled: yes file: local state: present - name: createBaseOSrepo yum_repository: name: BaseOS description: BS baseurl: file:///media/BaseOS gpgcheck: no enabled: yes state: present file: local
2)删除单独的repo配置文件
--- - hosts: test tasks: - name: remove unique repo yum_repository: name: AppStream state: absent file: local
删除的时候,就是要指定repo的文件名称---file ,state的值为absent,name的值为要删除的仓库名称
五:yum模块
yum模块就是在远程主机上通过yum源管理软件包
1:查看帮助文档
[q7@controller ansible]$ ansible-doc yum EXAMPLES: - name: install the latest version of Apache yum: name: httpd state: latest - name: ensure a list of packages installed yum: name: "{{ packages }}"
2:常用的参数
name:必须的参数,用于指定需要管理的软件包,比如httpd
state:用于指定软件包的状态,默认值为present,installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包
enablerepo:用于指定安装软件包临时启用yum源,值为yes,就是不确定这个源是否启动的话,就是用
disablerepo:用于指定安装软件包临时禁用的yum源,就是当多个yum源同时存在要安装的软件包时,你可以使用这个参数禁用某个源,设置后,安装时,就不会从对应源中选择软件包
disable_gpg_check:禁用rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes,即不验证包,直接安装,在对应的的yum源没有开启gpg验证的情况下,需要将此参数设置为yes,否则会报错,从而无法进行安装
3:列子
1)安装httpd包
--- - hosts: test tasks: - name: install httpd yum: name: httpd state: present
2:临时禁用repo
就是当有多个源有相同的软件包的时候,可以禁用一个源,安装的时候避免从那个源中安装软件
六:service模块
就是关于服务的开机或者开机自启的服务的模块
1:查看帮助文档
EXAMPLES: - name: Start service httpd, if not started service: name: httpd state: started - name: Stop service httpd, if started service: name: httpd state: stopped
2:常用的参数
name:用于指定操作服务名称,如httpd
state:用于指定服务的状态,可选值有,started,stopped,restarted,reloaded
enabled:用于设置服务是否开机自启,可选值为,yes,no
3:案列
1)将httpd服务设置为开机自启,设置为启动
--- - hosts: test tasks: - name: 安装httpd服务 yum: name: httpd state: present - name: 开机自启和启动httpd服务 service: name: httpd state: started enabled: yes #在被控节点上查看 [q7@client ~]$ systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2023-11-13 14:57:48 CST; 52s ago Docs: man:httpd.service(8) Main PID: 3755 (httpd) Status: "Running, listening on: port 80" Tasks: 213 (limit: 12106)
2)httpd服务设置为关闭,开机不自动启
--- - hosts: test tasks: - name: 开机不自启和关闭httpd服务 service: name: httpd state: stopped enabled: no #在被控节点上查看http服务的状态 [q7@client ~]$ systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:httpd.service(8) [q7@client ~]$
七:firewalld模块
https://blog.csdn.net/m0_46305762/article/details/107160317?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170074950516800197017718%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170074950516800197017718&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-107160317-null-null.142^v96^pc_search_result_base4&utm_term=ansible%E4%B8%AD%E7%9A%84firewalld%E6%A8%A1%E5%9D%97&spm=1018.2226.3001.4187
常用的参数:
service:指定放行的服务
permanent:保存策略,下次启动的时候自动的挂载
state:指定防火墙的策略状态,enable表示策略生效,disbale表示禁用,present表示新建策略,absent表示删除策略
immediate:策略立即生效
列子:
1)放行ftp服务
--- - hosts: client tasks: - name: 放行 ftp firewalld: service: ftp state: enabled permanent: true immediate: yes [root@client ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens160 ens192 sources: services: cockpit dhcpv6-client ftp ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@client ~]#
就是永久生效
八:copy模块(管理节点的主机文件------>>> 被控节点的主机)
就是将ansible管理主机上的文件拷贝到远程主机上,fetch模块是从远程主机中拉取文件到ansible的管理主机
常用参数
src:用于指定需要copy的文件或者目录
dest:用于指定文件背靠背到远程主机的那个目录
content:当不使用src指定文件和目录,可以使用content直接定义文件内容,src与content2个参数必有其一
force:当远程主机的目标路径中有同名文件,并且内容不同时,可以使用强制覆盖,或者no,即不进行拷贝操作
mode:权限
owner:文件的属主
group:文件属组
backup:如果有同名的情况,是否备份,将远程的同名的进行备份
列子:
将自己的文件复制到被管理主机
目录也可以,隐藏文件(不行)
--- - hosts: test tasks: - name: ddd copy: src: /home/q7/ansible/hosts dest: /mnt/ee
使用content参数
--- - hosts: test tasks: - name: copy copy: dest: /mnt/qq content: www\ndasda\n
强制copy
--- - hosts: test tasks: - name: copy copy: dest: /mnt/11.txt src: /home/q7/ansible/hosts force: yes
备份
--- - hosts: test tasks: - name: copy copy: dest: /mnt/11.txt src: /mnt/ee backup: yes
九:lineinfile模块
Ansible 常用模块之文件内容修改 blockinfile|lineinfile_ansible 修改远程文件不改变文件编码-CSDN博客
就是关于文本编辑的模块
就是确保某一行存在于指定的文件,或从文本里面删除某一行,插入某一行,替换某一行,使用正则表达式来匹配
常用的参数:
path:必须指定的参数,指定要操作的文件
line:指定文本内容
regexp:使用正则表达式匹配所对应的行,当替换文文本时,如果有多行文本都被匹配成功了,就只有最后一个被匹配的文本才会被替换掉,但删除文本时,如果有多行文本都被匹配了,就将这些内容全部删除掉
create:当要操作的文件并不存在时,是够创建对应文件
列子:
1)插入一行内容
确保指定的"一行文本"存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本
--- - hosts: client tasks: - name: append line aaa lineinfile: path: /mnt/11.txt line: ddd create: yes ~
[q7@client mnt]$ cat 11.txt aaa bbb ccc ddd [q7@client mnt]$
2)匹配的文本替换掉
--- - hosts: client tasks: - name: replace line aaa lineinfile: path: /mnt/11.txt regexp: "^aaa" line: "kkk" [q7@client mnt]$ cat 11.txt kkk bbb ccc ddd [q7@client mnt]$
以后得以后写
10:mount模块
常用的参数:
path:挂载点
src:需要挂载的设备
fstype:挂载设备的文件系统
state:present,开机挂载,仅将配置文件写入/etc/fstab并不会真的挂载
mounted 挂载设备,并将配置写入/etc/fstab,永久挂载,
umounted 卸载设备,不会清除/etc/fstab中的配置
absent 卸载设备,并清理/etc/fstab中的配置
列子:
实现开机自动挂载
--- - hosts: test tasks: - name: mount mount: src: /dev/cdrom path: /media fstype: iso9660 state: present ~
永久挂载
--- - hosts: test tasks: - name: mount mount: src: /dev/cdrom path: /media fstype: iso9660 state: mounted ~
卸载设备,但是不会更改/etc/fstab中的数据
--- - hosts: test tasks: - name: mount mount: src: /dev/cdrom path: /media fstype: iso9660 state: unmounted
永久卸载设备
--- - hosts: test tasks: - name: mount mount: src: /dev/cdrom path: /media fstype: iso9660 state: absent